home *** CD-ROM | disk | FTP | other *** search
/ Dream 52 / Amiga_Dream_52.iso / Linux / Enlightenment / enl_BETA-0.13.src.tar.gz / enl_BETA-0.13.src.tar / enl-0.13 / draw.c < prev    next >
C/C++ Source or Header  |  1997-11-18  |  27KB  |  760 lines

  1. #include "enlightenment.h"
  2.  
  3. void TileFill(Pixmap dst, Pixmap src, int dst_w, 
  4.         int dst_h, int src_w, int src_h) {
  5.     int i;
  6.     GC gc;
  7.     XGCValues gcv;
  8.  
  9.     if (!dst) 
  10.         return;
  11.     if ((dst_w<=0)||(dst_h<=0)||(src_w<=0)||(src_h<=0)) 
  12.         return;
  13.  
  14.     gc=XCreateGC(disp,dst,0,&gcv);
  15.     XSetForeground(disp,gc,1);
  16.     if (!src) {
  17.         XFillRectangle(disp,dst,gc,0,0,dst_w,dst_h);
  18.     } else if (src_w<=dst_w) {
  19.         for (i=0;i<(dst_h/src_h);i++) {
  20.             XCopyArea(disp,src,dst,gc,0,0,src_w,src_h,0,i*src_h);
  21.         }
  22.         XCopyArea(disp,src,dst,gc,0,0,src_w,dst_h-((i-1)*src_h),0,i*src_h);
  23.         for (i=0;i<(dst_w/src_w);i++) {
  24.             XCopyArea(disp,dst,dst,gc,0,0,src_w,dst_h,i*src_w,0);
  25.         }
  26.         XCopyArea(disp,dst,dst,gc,0,0,dst_w-((i-1)*src_w),dst_h,i*src_w,0);
  27.     } else {
  28.         for (i=0;i<(dst_h/src_h);i++) {
  29.             XCopyArea(disp,src,dst,gc,0,0,dst_w,src_h,0,i*src_h);
  30.         }
  31.         XCopyArea(disp,src,dst,gc,0,0,dst_w,dst_h-((i-1)*src_h),0,i*src_h);
  32.     }
  33.     XFreeGC(disp,gc);
  34. }
  35.  
  36. void DrawButton(EWin *ewin,int btn) {
  37.     int i;
  38.     GC or;
  39.     GC solid;
  40.     GC transparent;
  41.     XGCValues gcv;
  42.     int bx,by,bw,bh;
  43.     int x,y,w,h;
  44.     int ww,hh;
  45.     int xws, yws, xbs, ybs;
  46.     unsigned wws, hws, wbs, hbs;
  47.     int boundingShaped, clipShaped;
  48.     Pixmap uns,sel,clk;
  49.     int num_x,num_y;
  50.  
  51.     XShapeQueryExtents(disp,ewin->client_win,&boundingShaped,&xws,&yws,&wws,
  52.             &hws,&clipShaped,&xbs,&ybs,&wbs,&hbs);
  53.     if (cfg.subwin_pos_method1[btn]==0) {
  54.         bx=cfg.subwin_pos_x1[btn];
  55.         by=cfg.subwin_pos_y1[btn];
  56.     } else if (cfg.subwin_pos_method1[btn]==1) {
  57.         bx=ewin->frame_width+cfg.subwin_pos_x1[btn];
  58.         by=cfg.subwin_pos_y1[btn];
  59.     } else if (cfg.subwin_pos_method1[btn]==2) {
  60.         bx=cfg.subwin_pos_x1[btn];
  61.         by=ewin->frame_height+cfg.subwin_pos_y1[btn];
  62.     } else if (cfg.subwin_pos_method1[btn]==3) {
  63.         bx=ewin->frame_width+cfg.subwin_pos_x1[btn];
  64.         by=ewin->frame_height+cfg.subwin_pos_y1[btn];
  65.     }
  66.     if (cfg.subwin_pos_method2[btn]==0) {
  67.         bw=cfg.subwin_pos_x2[btn]-bx;
  68.         bh=cfg.subwin_pos_y2[btn]-by;
  69.     } else if (cfg.subwin_pos_method2[btn]==1) {
  70.         bw=ewin->frame_width+cfg.subwin_pos_x2[btn]-bx;
  71.         bh=cfg.subwin_pos_y2[btn]-by;
  72.     } else if (cfg.subwin_pos_method2[btn]==2) {
  73.         bw=cfg.subwin_pos_x2[btn]-bx;
  74.         bh=ewin->frame_height+cfg.subwin_pos_y2[btn]-by;
  75.     } else if (cfg.subwin_pos_method2[btn]==3) {
  76.         bw=ewin->frame_width+cfg.subwin_pos_x2[btn]-bx;
  77.         bh=ewin->frame_height+cfg.subwin_pos_y2[btn]-by;
  78.     }
  79.     if (cfg.shape_mode) {
  80.         gcv.function=GXor;
  81.         or=XCreateGC(disp,ewin->mask_uns,GCFunction,&gcv);
  82.         gcv.foreground=1;
  83.         solid=XCreateGC(disp,ewin->mask_uns,GCForeground,&gcv);
  84.         gcv.foreground=0;
  85.         transparent=XCreateGC(disp,ewin->mask_uns,GCForeground,&gcv);
  86.         XFillRectangle(disp,ewin->mask_uns,transparent,bx,by,bw,bh);
  87.         XFillRectangle(disp,ewin->mask_sel,transparent,bx,by,bw,bh);
  88.         for(i=0;i<ewin->num_subwins;i++) {
  89.             if (cfg.subwin_pos_method1[i]==0) {
  90.                 x=cfg.subwin_pos_x1[i];
  91.                 y=cfg.subwin_pos_y1[i];
  92.             } else if (cfg.subwin_pos_method1[i]==1) {
  93.                 x=ewin->frame_width+cfg.subwin_pos_x1[i];
  94.                 y=cfg.subwin_pos_y1[i];
  95.             } else if (cfg.subwin_pos_method1[i]==2) {
  96.                 x=cfg.subwin_pos_x1[i];
  97.                 y=ewin->frame_height+cfg.subwin_pos_y1[i];
  98.             } else if (cfg.subwin_pos_method1[i]==3) {
  99.                 x=ewin->frame_width+cfg.subwin_pos_x1[i];
  100.                 y=ewin->frame_height+cfg.subwin_pos_y1[i];
  101.             }
  102.             if (cfg.subwin_pos_method2[i]==0) {
  103.                 w=cfg.subwin_pos_x2[i]-x;
  104.                 h=cfg.subwin_pos_y2[i]-y;
  105.             } else if (cfg.subwin_pos_method2[i]==1) {
  106.                 w=ewin->frame_width+cfg.subwin_pos_x2[i]-x;
  107.                 h=cfg.subwin_pos_y2[i]-y;
  108.             } else if (cfg.subwin_pos_method2[i]==2) {
  109.                 w=cfg.subwin_pos_x2[i]-x;
  110.                 h=ewin->frame_height+cfg.subwin_pos_y2[i]-y;
  111.             } else if (cfg.subwin_pos_method2[i]==3) {
  112.                 w=ewin->frame_width+cfg.subwin_pos_x2[i]-x;
  113.                 h=ewin->frame_height+cfg.subwin_pos_y2[i]-y;
  114.             }
  115.             if ((x<(bx+bw))&&(y<by+bh)&&((x+w)>=bx)&&((y+h)>=by)) {
  116.                 if (ewin->subwin_state[i]==CLICKED) {
  117.                     if (ewin->subwin_pm_clk_mask[i]) 
  118.                         XShapeCombineMask(disp,ewin->subwins[i],
  119.                                 ShapeBounding,0,0,ewin->subwin_pm_clk_mask[i],
  120.                                 ShapeSet);
  121.                     if (ewin->subwin_pm_clk_mask[i]) {
  122.                         XCopyArea(disp,ewin->subwin_pm_clk_mask[i],
  123.                                 ewin->mask_sel,or,0,0,w,h,x,y);
  124.                         XCopyArea(disp,ewin->subwin_pm_clk_mask[i],
  125.                                 ewin->mask_uns,or,0,0,w,h,x,y);
  126.                     }
  127.                 } else if (ewin->state&SELECTED) {
  128.                     if (ewin->subwin_pm_sel_mask[i]) 
  129.                         XShapeCombineMask(disp,ewin->subwins[i],
  130.                                 ShapeBounding,0,0,ewin->subwin_pm_sel_mask[i],
  131.                                 ShapeSet);
  132.                     if (ewin->subwin_pm_sel_mask[i])
  133.                         XCopyArea(disp,ewin->subwin_pm_sel_mask[i],
  134.                                 ewin->mask_sel,or,0,0,w,h,x,y);
  135.                     if (ewin->subwin_pm_uns_mask[i])
  136.                         XCopyArea(disp,ewin->subwin_pm_uns_mask[i],
  137.                                 ewin->mask_uns,or,0,0,w,h,x,y);
  138.                 } else {
  139.                     if (ewin->subwin_pm_uns_mask[i]) 
  140.                         XShapeCombineMask(disp,ewin->subwins[i],
  141.                                 ShapeBounding,0,0,ewin->subwin_pm_uns_mask[i],
  142.                                 ShapeSet);
  143.                     if (ewin->subwin_pm_sel_mask[i])
  144.                         XCopyArea(disp,ewin->subwin_pm_sel_mask[i],
  145.                                 ewin->mask_sel,or,0,0,w,h,x,y);
  146.                     if (ewin->subwin_pm_uns_mask[i])
  147.                         XCopyArea(disp,ewin->subwin_pm_uns_mask[i],
  148.                                 ewin->mask_uns,or,0,0,w,h,x,y);
  149.                 }
  150.             }
  151.         }
  152.         if ((ewin->client_x<(bx+bw))&&
  153.                 (ewin->client_y<by+bh)&&
  154.                 ((ewin->client_x+ewin->client_width)>=bx)&&
  155.                 ((ewin->client_y+ewin->client_height)>=by)) {
  156.             if (!boundingShaped) {
  157.                 XFillRectangle(disp,ewin->mask_uns,solid,ewin->client_x,
  158.                         ewin->client_y,ewin->client_width,ewin->client_height);
  159.                 XFillRectangle(disp,ewin->mask_sel,solid,ewin->client_x,
  160.                         ewin->client_y,ewin->client_width,ewin->client_height);
  161.             }
  162.         }
  163.     }
  164.     if (cfg.subwin_type[btn]==2) {
  165.         if (ewin->subwin_pm_clk[btn]) 
  166.             ImlibFreePixmap(imd,ewin->subwin_pm_clk[btn]);
  167.         if (ewin->subwin_pm_sel[btn]) 
  168.             ImlibFreePixmap(imd,ewin->subwin_pm_sel[btn]);
  169.         if (ewin->subwin_pm_uns[btn]) 
  170.             ImlibFreePixmap(imd,ewin->subwin_pm_uns[btn]);
  171.         if (cfg.subwin_scale_method[btn]==0) {
  172.             ewin->subwin_pm_clk[btn]=XCreatePixmap(disp,root,w,h,depth);
  173.             ewin->subwin_pm_sel[btn]=XCreatePixmap(disp,root,w,h,depth);
  174.             ewin->subwin_pm_uns[btn]=XCreatePixmap(disp,root,w,h,depth);
  175.             ww=cfg.subwin_img_clk[btn]->rgb_width;
  176.             hh=cfg.subwin_img_clk[btn]->rgb_height;
  177.             ImlibRender(imd,cfg.subwin_img_clk[btn],ww,hh);
  178.             clk=ImlibMoveImageToPixmap(imd,cfg.subwin_img_clk[btn]);
  179.             ImlibFreePixmap(imd,ImlibMoveMaskToPixmap(imd,
  180.                     cfg.subwin_img_clk[btn]));
  181.             TileFill(ewin->subwin_pm_clk[btn],clk,w,h,ww,hh);
  182.             if (clk) 
  183.                 ImlibFreePixmap(imd,clk);
  184.             ww=cfg.subwin_img_uns[btn]->rgb_width;
  185.             hh=cfg.subwin_img_uns[btn]->rgb_height;
  186.             ImlibRender(imd,cfg.subwin_img_uns[btn],ww,hh);
  187.             uns=ImlibMoveImageToPixmap(imd,cfg.subwin_img_uns[btn]);
  188.             ImlibFreePixmap(imd,ImlibMoveMaskToPixmap(imd,
  189.                     cfg.subwin_img_uns[btn]));
  190.             TileFill(ewin->subwin_pm_uns[btn],uns,w,h,ww,hh);
  191.             if (uns) 
  192.                 ImlibFreePixmap(imd,uns);
  193.             ww=cfg.subwin_img_sel[btn]->rgb_width;
  194.             hh=cfg.subwin_img_sel[btn]->rgb_height;
  195.             ImlibRender(imd,cfg.subwin_img_sel[btn],ww,hh);
  196.             sel=ImlibMoveImageToPixmap(imd,cfg.subwin_img_sel[btn]);
  197.             ImlibFreePixmap(imd,ImlibMoveMaskToPixmap(imd,
  198.                     cfg.subwin_img_sel[btn]));
  199.             TileFill(ewin->subwin_pm_sel[btn],sel,w,h,ww,hh);
  200.             if (sel) 
  201.                 ImlibFreePixmap(imd,sel);
  202.         } else if (cfg.subwin_scale_method[btn]==1) {
  203.             ewin->subwin_pm_clk[btn]=XCreatePixmap(disp,root,w,h,depth);
  204.             ewin->subwin_pm_sel[btn]=XCreatePixmap(disp,root,w,h,depth);
  205.             ewin->subwin_pm_uns[btn]=XCreatePixmap(disp,root,w,h,depth);
  206.             num_x=w/cfg.subwin_img_clk[btn]->rgb_width;
  207.             num_y=h/cfg.subwin_img_clk[btn]->rgb_height;
  208.             if (num_x<1) 
  209.                 num_x=1;
  210.             if (num_y<1) 
  211.                 num_y=1;
  212.             ww=w/num_x;
  213.             hh=h/num_y;
  214.             ImlibRender(imd,cfg.subwin_img_clk[btn],ww,hh);
  215.             clk=ImlibMoveImageToPixmap(imd,cfg.subwin_img_clk[btn]);
  216.             ImlibFreePixmap(imd,ImlibMoveMaskToPixmap(imd,
  217.                     cfg.subwin_img_clk[btn]));
  218.             TileFill(ewin->subwin_pm_clk[btn],clk,w,h,ww,hh);
  219.             if (clk) 
  220.                 ImlibFreePixmap(imd,clk);
  221.             num_x=w/cfg.subwin_img_uns[btn]->rgb_width;
  222.             num_y=h/cfg.subwin_img_uns[btn]->rgb_height;
  223.             if (num_x<1) 
  224.                 num_x=1;
  225.             if (num_y<1) 
  226.                 num_y=1;
  227.             ww=w/num_x;
  228.             hh=h/num_y;
  229.             ImlibRender(imd,cfg.subwin_img_uns[btn],ww,hh);
  230.             uns=ImlibMoveImageToPixmap(imd,cfg.subwin_img_uns[btn]);
  231.             ImlibFreePixmap(imd,ImlibMoveMaskToPixmap(imd,
  232.                     cfg.subwin_img_uns[btn]));
  233.             TileFill(ewin->subwin_pm_uns[btn],uns,w,h,ww,hh);
  234.             if (uns) 
  235.                 ImlibFreePixmap(imd,uns);
  236.             num_x=w/cfg.subwin_img_sel[btn]->rgb_width;
  237.             num_y=h/cfg.subwin_img_sel[btn]->rgb_height;
  238.             if (num_x<1) 
  239.                 num_x=1;
  240.             if (num_y<1) 
  241.                 num_y=1;
  242.             ww=w/num_x;
  243.             hh=h/num_y;
  244.             ImlibRender(imd,cfg.subwin_img_sel[btn],ww,hh);
  245.             sel=ImlibMoveImageToPixmap(imd,cfg.subwin_img_sel[btn]);
  246.             ImlibFreePixmap(imd,ImlibMoveMaskToPixmap(imd,
  247.                     cfg.subwin_img_sel[btn]));
  248.             TileFill(ewin->subwin_pm_sel[btn],sel,w,h,ww,hh);
  249.             if (sel) 
  250.                 ImlibFreePixmap(imd,sel);
  251.         } else {
  252.             ImlibRender(imd,cfg.subwin_img_clk[btn],bw,bh);
  253.             ewin->subwin_pm_clk[btn]=ImlibCopyImageToPixmap(imd,
  254.                     cfg.subwin_img_clk[btn]);
  255.             ImlibDestroyPixmaps(imd,cfg.subwin_img_clk[btn],bw,bh);
  256.             ImlibRender(imd,cfg.subwin_img_sel[btn],bw,bh);
  257.             ewin->subwin_pm_sel[btn]=ImlibCopyImageToPixmap(imd,
  258.                     cfg.subwin_img_sel[btn]);
  259.             ImlibDestroyPixmaps(imd,cfg.subwin_img_sel[btn],bw,bh);
  260.             ImlibRender(imd,cfg.subwin_img_uns[btn],bw,bh);
  261.             ewin->subwin_pm_uns[btn]=ImlibCopyImageToPixmap(imd,
  262.                     cfg.subwin_img_uns[btn]);
  263.             ImlibDestroyPixmaps(imd,cfg.subwin_img_uns[btn],bw,bh);
  264.         }
  265.         DrawText(ewin->subwin_pm_sel[btn],ewin->title,0,0,bw,bh);
  266.         DrawText(ewin->subwin_pm_uns[btn],ewin->title,0,0,bw,bh);
  267.         DrawText(ewin->subwin_pm_clk[btn],ewin->title,0,0,bw,bh);
  268.     }
  269.     if (ewin->subwin_state[btn]==CLICKED) {
  270.         if (ewin->subwin_pm_clk[btn]) 
  271.             XSetWindowBackgroundPixmap(disp,ewin->subwins[btn],
  272.                     ewin->subwin_pm_clk[btn]);
  273.     } else if (ewin->state&SELECTED) {
  274.         if (ewin->subwin_pm_sel[btn]) 
  275.             XSetWindowBackgroundPixmap(disp,ewin->subwins[btn],
  276.                     ewin->subwin_pm_sel[btn]);
  277.     } else {
  278.         if (ewin->subwin_pm_uns[btn]) 
  279.             XSetWindowBackgroundPixmap(disp,ewin->subwins[btn],
  280.                     ewin->subwin_pm_uns[btn]);
  281.     }
  282.     XClearWindow(disp,ewin->subwins[btn]);
  283.     if (cfg.shape_mode) {
  284.         if (boundingShaped) {
  285.             XRectangle *xr;
  286.             int count,order;
  287.             int iii;
  288.  
  289.             xr=XShapeGetRectangles(disp,ewin->client_win,
  290.                     ShapeBounding,&count,&order);
  291.             for (iii=0;iii<count;iii++) {
  292.                 xr[iii].x+=ewin->client_x;
  293.                 xr[iii].y+=ewin->client_y;
  294.             }
  295.             if (count) {
  296.                 XFillRectangles(disp,ewin->mask_sel,solid,xr,count);
  297.                 XFillRectangles(disp,ewin->mask_uns,solid,xr,count);
  298.                 if (xr) 
  299.                     XFree(xr);
  300.             }
  301.         }
  302.         if (ewin->state&SELECTED) 
  303.             XShapeCombineMask(disp,ewin->frame_win,
  304.                     ShapeBounding,0,0,ewin->mask_sel,ShapeSet);
  305.         else
  306.             XShapeCombineMask(disp,ewin->frame_win,
  307.                     ShapeBounding,0,0,ewin->mask_uns,ShapeSet);
  308.         if (fx.shadow.on) {
  309.             if (ewin->state&SELECTED)
  310.                 XShapeCombineMask(disp,ewin->fx.shadow_win,
  311.                         ShapeBounding,0,0,ewin->mask_sel,ShapeSet);
  312.              else
  313.                 XShapeCombineMask(disp,ewin->fx.shadow_win,
  314.                         ShapeBounding,0,0,ewin->mask_uns,ShapeSet);
  315.         }
  316.         XFreeGC(disp,or);
  317.         XFreeGC(disp,solid);
  318.         XFreeGC(disp,transparent);
  319.     }
  320.     ewin->changes&=~MOD_TITLE;
  321. }
  322.  
  323. void DrawWindowBorder(EWin *ewin) {
  324.     int i;
  325.     int x,y,w,h;
  326.     unsigned int pw,ph,dummyui;
  327.     int dummyi;
  328.     Window wdummy;
  329.     int num_x,num_y;
  330.     GC gc;
  331.     GC or;
  332.     GC solid;
  333.     GC transparent;
  334.     XGCValues gcv;
  335.     Pixmap sel,uns,clk,sel_mask,uns_mask,clk_mask;
  336.     int ww,hh;
  337.     int xws, yws, xbs, ybs;
  338.     unsigned wws, hws, wbs, hbs;
  339.     int boundingShaped, clipShaped;
  340.  
  341.     XShapeQueryExtents(disp,ewin->client_win,&boundingShaped,&xws,&yws,&wws,
  342.             &hws,&clipShaped,&xbs,&ybs,&wbs,&hbs);
  343.     gc=XCreateGC(disp,ewin->frame_win,0,&gcv);
  344.     if (ewin->changes&MOD_SIZE) {
  345.         if (cfg.shape_mode) {
  346.             if (ewin->mask_uns) 
  347.                 ImlibFreePixmap(imd,ewin->mask_uns);
  348.             if (ewin->mask_sel) 
  349.                 ImlibFreePixmap(imd,ewin->mask_sel);
  350.             ewin->mask_uns=XCreatePixmap(disp,ewin->frame_win,
  351.                     ewin->frame_width,ewin->frame_height,1);
  352.             ewin->mask_sel=XCreatePixmap(disp,ewin->frame_win,
  353.                     ewin->frame_width,ewin->frame_height,1);
  354.             gcv.function=GXor;
  355.             or=XCreateGC(disp,ewin->mask_uns,GCFunction,&gcv);
  356.             gcv.foreground=1;
  357.             solid=XCreateGC(disp,ewin->mask_uns,GCForeground,&gcv);
  358.             gcv.foreground=0;
  359.             transparent=XCreateGC(disp,ewin->mask_uns,GCForeground,&gcv);
  360.             XFillRectangle(disp,ewin->mask_uns,transparent,
  361.                     0,0,ewin->frame_width,ewin->frame_height);
  362.             XFillRectangle(disp,ewin->mask_sel,transparent,
  363.                     0,0,ewin->frame_width,ewin->frame_height);
  364.             if (!boundingShaped) {
  365.                 XFillRectangle(disp,ewin->mask_uns,solid,
  366.                         ewin->client_x,ewin->client_y,ewin->client_width,
  367.                         ewin->client_height);
  368.                 XFillRectangle(disp,ewin->mask_sel,solid,ewin->client_x,
  369.                         ewin->client_y,ewin->client_width,ewin->client_height);
  370.             }
  371.         }
  372.         for(i=0;i<ewin->num_subwins;i++) {
  373.             if (cfg.subwin_pos_method1[i]==0) {
  374.                 x=cfg.subwin_pos_x1[i];
  375.                 y=cfg.subwin_pos_y1[i];
  376.             } else if (cfg.subwin_pos_method1[i]==1) {
  377.                 x=ewin->frame_width+cfg.subwin_pos_x1[i];
  378.                 y=cfg.subwin_pos_y1[i];
  379.             } else if (cfg.subwin_pos_method1[i]==2) {
  380.                 x=cfg.subwin_pos_x1[i];
  381.                 y=ewin->frame_height+cfg.subwin_pos_y1[i];
  382.             } else if (cfg.subwin_pos_method1[i]==3) {
  383.                 x=ewin->frame_width+cfg.subwin_pos_x1[i];
  384.                 y=ewin->frame_height+cfg.subwin_pos_y1[i];
  385.             }
  386.             if (cfg.subwin_pos_method2[i]==0) {
  387.                 w=cfg.subwin_pos_x2[i]-x;
  388.                 h=cfg.subwin_pos_y2[i]-y;
  389.             } else if (cfg.subwin_pos_method2[i]==1) {
  390.                 w=ewin->frame_width+cfg.subwin_pos_x2[i]-x;
  391.                 h=cfg.subwin_pos_y2[i]-y;
  392.             } else if (cfg.subwin_pos_method2[i]==2) {
  393.                 w=cfg.subwin_pos_x2[i]-x;
  394.                 h=ewin->frame_height+cfg.subwin_pos_y2[i]-y;
  395.             } else if (cfg.subwin_pos_method2[i]==3) {
  396.                 w=ewin->frame_width+cfg.subwin_pos_x2[i]-x;
  397.                 h=ewin->frame_height+cfg.subwin_pos_y2[i]-y;
  398.             }
  399.             if (((x+w)<=ewin->frame_width)&&((y+h)<=ewin->frame_height)
  400.                     &&(w>0)&&(h>0)) {
  401.                 XGetGeometry(disp,ewin->subwins[i],&wdummy,&dummyi,
  402.                         &dummyi,&pw,&ph,&dummyui,&dummyui);
  403.                 if ((pw!=w)||(ph!=h)) {
  404.                     if (ewin->subwin_pm_clk[i]) 
  405.                         ImlibFreePixmap(imd,ewin->subwin_pm_clk[i]);
  406.                     if (ewin->subwin_pm_clk_mask[i]) 
  407.                         ImlibFreePixmap(imd,ewin->subwin_pm_clk_mask[i]);
  408.                     if (ewin->subwin_pm_sel[i]) 
  409.                         ImlibFreePixmap(imd,ewin->subwin_pm_sel[i]);
  410.                     if (ewin->subwin_pm_sel_mask[i]) 
  411.                         ImlibFreePixmap(imd,ewin->subwin_pm_sel_mask[i]);
  412.                     if (ewin->subwin_pm_uns[i]) 
  413.                         ImlibFreePixmap(imd,ewin->subwin_pm_uns[i]);
  414.                     if (ewin->subwin_pm_uns_mask[i]) 
  415.                         ImlibFreePixmap(imd,ewin->subwin_pm_uns_mask[i]);
  416.                     if (cfg.subwin_scale_method[i]==0) {
  417.                         ewin->subwin_pm_clk[i]=XCreatePixmap(disp,root,
  418.                                 w,h,depth);
  419.                         ewin->subwin_pm_sel[i]=XCreatePixmap(disp,root,
  420.                                 w,h,depth);
  421.                         ewin->subwin_pm_uns[i]=XCreatePixmap(disp,root,
  422.                                 w,h,depth);
  423.                         if (cfg.shape_mode) {
  424.                             ewin->subwin_pm_clk_mask[i]=XCreatePixmap(disp,
  425.                                     root,w,h,1);
  426.                             ewin->subwin_pm_sel_mask[i]=XCreatePixmap(disp,
  427.                                     root,w,h,1);
  428.                             ewin->subwin_pm_uns_mask[i]=XCreatePixmap(disp,
  429.                                     root,w,h,1);
  430.                         }
  431.                         ww=cfg.subwin_img_clk[i]->rgb_width;
  432.                         hh=cfg.subwin_img_clk[i]->rgb_height;
  433.                         ImlibRender(imd,cfg.subwin_img_clk[i],ww,hh);
  434.                         clk=ImlibMoveImageToPixmap(imd,cfg.subwin_img_clk[i]);
  435.                         clk_mask=ImlibMoveMaskToPixmap(imd,
  436.                                 cfg.subwin_img_clk[i]);
  437.                         TileFill(ewin->subwin_pm_clk[i],clk,w,h,ww,hh);
  438.                         TileFill(ewin->subwin_pm_clk_mask[i],clk_mask,
  439.                                 w,h,ww,hh);
  440.                         if (clk) 
  441.                             ImlibFreePixmap(imd,clk);
  442.                         if (clk_mask) 
  443.                             ImlibFreePixmap(imd,clk_mask);
  444.                         ww=cfg.subwin_img_uns[i]->rgb_width;
  445.                         hh=cfg.subwin_img_uns[i]->rgb_height;
  446.                         ImlibRender(imd,cfg.subwin_img_uns[i],ww,hh);
  447.                         uns=ImlibMoveImageToPixmap(imd,cfg.subwin_img_uns[i]);
  448.                         uns_mask=ImlibMoveMaskToPixmap(imd,
  449.                                 cfg.subwin_img_uns[i]);
  450.                         TileFill(ewin->subwin_pm_uns[i],uns,w,h,ww,hh);
  451.                         TileFill(ewin->subwin_pm_uns_mask[i],uns_mask,
  452.                                 w,h,ww,hh);
  453.                         if (uns) 
  454.                             ImlibFreePixmap(imd,uns);
  455.                         if (uns_mask) 
  456.                             ImlibFreePixmap(imd,uns_mask);
  457.                         ww=cfg.subwin_img_sel[i]->rgb_width;
  458.                         hh=cfg.subwin_img_sel[i]->rgb_height;
  459.                         ImlibRender(imd,cfg.subwin_img_sel[i],ww,hh);
  460.                         sel=ImlibMoveImageToPixmap(imd,cfg.subwin_img_sel[i]);
  461.                         sel_mask=ImlibMoveMaskToPixmap(imd,
  462.                                 cfg.subwin_img_sel[i]);
  463.                         TileFill(ewin->subwin_pm_sel[i],sel,w,h,ww,hh);
  464.                         TileFill(ewin->subwin_pm_sel_mask[i],sel_mask,
  465.                                 w,h,ww,hh);
  466.                         if (sel) 
  467.                             ImlibFreePixmap(imd,sel);
  468.                         if (sel_mask) 
  469.                             ImlibFreePixmap(imd,sel_mask);
  470.                     } else if (cfg.subwin_scale_method[i]==1) {
  471.                         ewin->subwin_pm_clk[i]=XCreatePixmap(disp,root,
  472.                                 w,h,depth);
  473.                         ewin->subwin_pm_sel[i]=XCreatePixmap(disp,root,
  474.                                 w,h,depth);
  475.                         ewin->subwin_pm_uns[i]=XCreatePixmap(disp,root,
  476.                                 w,h,depth);
  477.                         if (cfg.shape_mode) {
  478.                             ewin->subwin_pm_clk_mask[i]=XCreatePixmap(disp,
  479.                                     root,w,h,1);
  480.                             ewin->subwin_pm_sel_mask[i]=XCreatePixmap(disp,
  481.                                     root,w,h,1);
  482.                             ewin->subwin_pm_uns_mask[i]=XCreatePixmap(disp,
  483.                                     root,w,h,1);
  484.                         }
  485.                         num_x=w/cfg.subwin_img_clk[i]->rgb_width;
  486.                         num_y=h/cfg.subwin_img_clk[i]->rgb_height;
  487.                         if (num_x<1) 
  488.                             num_x=1;
  489.                         if (num_y<1) 
  490.                             num_y=1;
  491.                         ww=w/num_x;
  492.                         hh=h/num_y;
  493.                         ImlibRender(imd,cfg.subwin_img_clk[i],ww,hh);
  494.                         clk=ImlibMoveImageToPixmap(imd,cfg.subwin_img_clk[i]);
  495.                         clk_mask=ImlibMoveMaskToPixmap(imd,
  496.                                 cfg.subwin_img_clk[i]);
  497.                         TileFill(ewin->subwin_pm_clk[i],clk,w,h,ww,hh);
  498.                         TileFill(ewin->subwin_pm_clk_mask[i],clk_mask,
  499.                                 w,h,ww,hh);
  500.                         if (clk) 
  501.                             ImlibFreePixmap(imd,clk);
  502.                         if (clk_mask) 
  503.                             ImlibFreePixmap(imd,clk_mask);
  504.                         num_x=w/cfg.subwin_img_uns[i]->rgb_width;
  505.                         num_y=h/cfg.subwin_img_uns[i]->rgb_height;
  506.                         if (num_x<1) 
  507.                             num_x=1;
  508.                         if (num_y<1) 
  509.                             num_y=1;
  510.                         ww=w/num_x;
  511.                         hh=h/num_y;
  512.                         ImlibRender(imd,cfg.subwin_img_uns[i],ww,hh);
  513.                         uns=ImlibMoveImageToPixmap(imd,cfg.subwin_img_uns[i]);
  514.                         uns_mask=ImlibMoveMaskToPixmap(imd,
  515.                                 cfg.subwin_img_uns[i]);
  516.                         TileFill(ewin->subwin_pm_uns[i],uns,w,h,ww,hh);
  517.                         TileFill(ewin->subwin_pm_uns_mask[i],uns_mask,
  518.                                 w,h,ww,hh);
  519.                         if (uns) 
  520.                             ImlibFreePixmap(imd,uns);
  521.                         if (uns_mask) 
  522.                             ImlibFreePixmap(imd,uns_mask);
  523.                         num_x=w/cfg.subwin_img_sel[i]->rgb_width;
  524.                         num_y=h/cfg.subwin_img_sel[i]->rgb_height;
  525.                         if (num_x<1) 
  526.                             num_x=1;
  527.                         if (num_y<1) 
  528.                             num_y=1;
  529.                         ww=w/num_x;
  530.                         hh=h/num_y;
  531.                         ImlibRender(imd,cfg.subwin_img_sel[i],ww,hh);
  532.                         sel=ImlibMoveImageToPixmap(imd,cfg.subwin_img_sel[i]);
  533.                         sel_mask=ImlibMoveMaskToPixmap(imd,
  534.                                 cfg.subwin_img_sel[i]);
  535.                         TileFill(ewin->subwin_pm_sel[i],sel,w,h,ww,hh);
  536.                         TileFill(ewin->subwin_pm_sel_mask[i],sel_mask,
  537.                                 w,h,ww,hh);
  538.                         if (sel) 
  539.                             ImlibFreePixmap(imd,sel);
  540.                         if (sel_mask) 
  541.                             ImlibFreePixmap(imd,sel_mask);
  542.                     } else {
  543.                         if (cfg.subwin_type[i]==2) {
  544.                             ImlibRender(imd,cfg.subwin_img_clk[i],w,h);
  545.                             ewin->subwin_pm_clk[i]=ImlibCopyImageToPixmap(imd,
  546.                                     cfg.subwin_img_clk[i]);
  547.                             ewin->subwin_pm_clk_mask[i]=
  548.                                 ImlibCopyMaskToPixmap(imd,
  549.                                     cfg.subwin_img_clk[i]);
  550.                             ImlibDestroyPixmaps(imd,cfg.subwin_img_clk[i],w,h);
  551.                             ImlibRender(imd,cfg.subwin_img_sel[i],w,h);
  552.                             ewin->subwin_pm_sel[i]=ImlibCopyImageToPixmap(imd,
  553.                                     cfg.subwin_img_sel[i]);
  554.                             ewin->subwin_pm_sel_mask[i]=
  555.                                 ImlibCopyMaskToPixmap(imd,
  556.                                     cfg.subwin_img_sel[i]);
  557.                             ImlibDestroyPixmaps(imd,cfg.subwin_img_sel[i],w,h);
  558.                             ImlibRender(imd,cfg.subwin_img_uns[i],w,h);
  559.                             ewin->subwin_pm_uns[i]=ImlibCopyImageToPixmap(imd,
  560.                                     cfg.subwin_img_uns[i]);
  561.                             ewin->subwin_pm_uns_mask[i]=
  562.                                 ImlibCopyMaskToPixmap(imd,
  563.                                     cfg.subwin_img_uns[i]);
  564.                             ImlibDestroyPixmaps(imd,cfg.subwin_img_uns[i],w,h);
  565.                         } else {
  566.                             ImlibRender(imd,cfg.subwin_img_clk[i],w,h);
  567.                             ewin->subwin_pm_clk[i]=ImlibMoveImageToPixmap(imd,
  568.                                     cfg.subwin_img_clk[i]);
  569.                             ewin->subwin_pm_clk_mask[i]=
  570.                                 ImlibMoveMaskToPixmap(imd,
  571.                                     cfg.subwin_img_clk[i]);
  572.                             ImlibRender(imd,cfg.subwin_img_sel[i],w,h);
  573.                             ewin->subwin_pm_sel[i]=ImlibMoveImageToPixmap(imd,
  574.                                     cfg.subwin_img_sel[i]);
  575.                             ewin->subwin_pm_sel_mask[i]=
  576.                                 ImlibMoveMaskToPixmap(imd,
  577.                                     cfg.subwin_img_sel[i]);
  578.                             ImlibRender(imd,cfg.subwin_img_uns[i],w,h);
  579.                             ewin->subwin_pm_uns[i]=ImlibMoveImageToPixmap(imd,
  580.                                     cfg.subwin_img_uns[i]);
  581.                             ewin->subwin_pm_uns_mask[i]=
  582.                                 ImlibMoveMaskToPixmap(imd,
  583.                                     cfg.subwin_img_uns[i]);
  584.                         }
  585.                     }
  586.                     if (cfg.shape_mode) {
  587.                         if (!ewin->subwin_pm_clk_mask[i]) {
  588.                             ewin->subwin_pm_clk_mask[i]=XCreatePixmap(disp,root,
  589.                                     w,h,1);
  590.                             XFillRectangle(disp,ewin->subwin_pm_clk_mask[i],
  591.                                     solid,0,0,w,h);
  592.                         }
  593.                         if (!ewin->subwin_pm_sel_mask[i]) {
  594.                             ewin->subwin_pm_sel_mask[i]=XCreatePixmap(disp,root,
  595.                                     w,h,1);
  596.                             XFillRectangle(disp,ewin->subwin_pm_sel_mask[i],
  597.                                     solid,0,0,w,h);
  598.                         }
  599.                         if (!ewin->subwin_pm_uns_mask[i]) {
  600.                             ewin->subwin_pm_uns_mask[i]=XCreatePixmap(disp,root,
  601.                                     w,h,1);
  602.                             XFillRectangle(disp,ewin->subwin_pm_uns_mask[i],
  603.                                     solid,0,0,w,h);
  604.                         }
  605.                     }
  606.                 }
  607.                 if (cfg.subwin_type[i]==2) {
  608.                     DrawText(ewin->subwin_pm_sel[i],ewin->title,0,0,w,h);
  609.                     DrawText(ewin->subwin_pm_uns[i],ewin->title,0,0,w,h);
  610.                     DrawText(ewin->subwin_pm_clk[i],ewin->title,0,0,w,h);
  611.                 }
  612.                 if (ewin->subwin_state[i]==CLICKED) {
  613.                     if (ewin->subwin_pm_clk_mask[i])
  614.                         XCopyArea(disp,ewin->subwin_pm_clk_mask[i],
  615.                                 ewin->mask_sel,or,0,0,w,h,x,y);
  616.                     if (ewin->subwin_pm_clk_mask[i])
  617.                         XCopyArea(disp,ewin->subwin_pm_clk_mask[i],
  618.                                 ewin->mask_uns,or,0,0,w,h,x,y);
  619.                     if (ewin->subwin_pm_clk[i]) 
  620.                         XSetWindowBackgroundPixmap(disp,ewin->subwins[i],
  621.                                 ewin->subwin_pm_clk[i]);
  622.                     if (ewin->subwin_pm_clk_mask[i]) 
  623.                         XShapeCombineMask(disp,ewin->subwins[i],ShapeBounding,
  624.                                 0,0,ewin->subwin_pm_clk_mask[i],ShapeSet);
  625.                 } else if (ewin->state&SELECTED) {
  626.                     if (ewin->subwin_pm_sel_mask[i])
  627.                         XCopyArea(disp,ewin->subwin_pm_sel_mask[i],
  628.                                 ewin->mask_sel,or,0,0,w,h,x,y);
  629.                     if (ewin->subwin_pm_uns_mask[i])
  630.                         XCopyArea(disp,ewin->subwin_pm_uns_mask[i],
  631.                                 ewin->mask_uns,or,0,0,w,h,x,y);
  632.                     if (ewin->subwin_pm_sel[i]) 
  633.                         XSetWindowBackgroundPixmap(disp,ewin->subwins[i],
  634.                                 ewin->subwin_pm_sel[i]);
  635.                     if (ewin->subwin_pm_sel_mask[i]) 
  636.                         XShapeCombineMask(disp,ewin->subwins[i],ShapeBounding,
  637.                                 0,0,ewin->subwin_pm_sel_mask[i],ShapeSet);
  638.                 } else {
  639.                     if (ewin->subwin_pm_sel_mask[i])
  640.                         XCopyArea(disp,ewin->subwin_pm_sel_mask[i],
  641.                                 ewin->mask_sel,or,0,0,w,h,x,y);
  642.                     if (ewin->subwin_pm_uns_mask[i])
  643.                         XCopyArea(disp,ewin->subwin_pm_uns_mask[i],
  644.                                 ewin->mask_uns,or,0,0,w,h,x,y);
  645.                     if (ewin->subwin_pm_uns[i]) 
  646.                         XSetWindowBackgroundPixmap(disp,ewin->subwins[i],
  647.                                 ewin->subwin_pm_uns[i]);
  648.                     if (ewin->subwin_pm_uns_mask[i]) 
  649.                         XShapeCombineMask(disp,ewin->subwins[i],ShapeBounding,
  650.                                 0,0,ewin->subwin_pm_uns_mask[i],ShapeSet);
  651.                 }
  652.                 XMoveWindow(disp,ewin->subwins[i],x,y);
  653.                 XResizeWindow(disp,ewin->subwins[i],w,h);
  654.                 XClearWindow(disp,ewin->subwins[i]);
  655.             } else {
  656.                 XMoveWindow(disp,ewin->subwins[i],-10,-10);
  657.                 XResizeWindow(disp,ewin->subwins[i],1,1);
  658.             }
  659.         }
  660.         if (cfg.shape_mode) {
  661.             if (boundingShaped) {
  662.                 XRectangle *xr;
  663.                 int count,order;
  664.                 int iii;
  665.  
  666.                 xr=XShapeGetRectangles(disp,ewin->client_win,
  667.                         ShapeBounding,&count,&order);
  668.                 for (iii=0;iii<count;iii++) {
  669.                     xr[iii].x+=ewin->client_x;
  670.                     xr[iii].y+=ewin->client_y;
  671.                 }
  672.                 if (count) {
  673.                     XFillRectangles(disp,ewin->mask_sel,solid,xr,count);
  674.                     XFillRectangles(disp,ewin->mask_uns,solid,xr,count);
  675.                     if (xr) 
  676.                         XFree(xr);
  677.                 }
  678.             }
  679.             if (ewin->state&SELECTED)
  680.                 XShapeCombineMask(disp,ewin->frame_win,
  681.                         ShapeBounding,0,0,ewin->mask_sel,ShapeSet);
  682.             else
  683.                 XShapeCombineMask(disp,ewin->frame_win,
  684.                         ShapeBounding,0,0,ewin->mask_uns,ShapeSet);
  685.             if (fx.shadow.on) {
  686.                 if (ewin->state&SELECTED)
  687.                     XShapeCombineMask(disp,ewin->fx.shadow_win,
  688.                             ShapeBounding,0,0,ewin->mask_sel,ShapeSet);
  689.                 else
  690.                     XShapeCombineMask(disp,ewin->fx.shadow_win,
  691.                             ShapeBounding,0,0,ewin->mask_uns,ShapeSet);
  692.             }
  693.             XFreeGC(disp,or);
  694.             XFreeGC(disp,solid);
  695.             XFreeGC(disp,transparent);
  696.         }
  697.         ewin->changes=0;
  698.     }
  699.     if (ewin->changes&MOD_SELECT) {
  700.         for(i=0;i<ewin->num_subwins;i++) {
  701.             if (ewin->subwin_state[i]==CLICKED) {
  702.                 if (ewin->subwin_pm_clk[i]) 
  703.                     XSetWindowBackgroundPixmap(disp,ewin->subwins[i],
  704.                             ewin->subwin_pm_clk[i]);
  705.                 if (ewin->subwin_pm_clk_mask[i]) 
  706.                     XShapeCombineMask(disp,ewin->subwins[i],ShapeBounding,
  707.                             0,0,ewin->subwin_pm_clk_mask[i],ShapeSet);
  708.             } else if (ewin->state&SELECTED) {
  709.                 if (ewin->subwin_pm_sel[i]) 
  710.                     XSetWindowBackgroundPixmap(disp,ewin->subwins[i],
  711.                             ewin->subwin_pm_sel[i]);
  712.                 if (ewin->subwin_pm_sel_mask[i]) 
  713.                     XShapeCombineMask(disp,ewin->subwins[i],ShapeBounding,
  714.                             0,0,ewin->subwin_pm_sel_mask[i],ShapeSet);
  715.             } else {
  716.                 if (ewin->subwin_pm_uns[i]) 
  717.                     XSetWindowBackgroundPixmap(disp,ewin->subwins[i],
  718.                             ewin->subwin_pm_uns[i]);
  719.                 if (ewin->subwin_pm_uns_mask[i]) 
  720.                     XShapeCombineMask(disp,ewin->subwins[i],ShapeBounding,
  721.                             0,0,ewin->subwin_pm_uns_mask[i],ShapeSet);
  722.             }
  723.             XClearWindow(disp,ewin->subwins[i]);
  724.         }
  725.         if (cfg.shape_mode) { 
  726.             if (ewin->state&SELECTED)
  727.                 XShapeCombineMask(disp,ewin->frame_win,ShapeBounding,
  728.                         0,0,ewin->mask_sel,ShapeSet);
  729.             else
  730.                 XShapeCombineMask(disp,ewin->frame_win,ShapeBounding,
  731.                         0,0,ewin->mask_uns,ShapeSet);
  732.             if (fx.shadow.on) {
  733.                 if (ewin->state&SELECTED)
  734.                     XShapeCombineMask(disp,ewin->fx.shadow_win,ShapeBounding,
  735.                             0,0,ewin->mask_sel,ShapeSet);
  736.                 else
  737.                     XShapeCombineMask(disp,ewin->fx.shadow_win,ShapeBounding,
  738.                             0,0,ewin->mask_uns,ShapeSet);
  739.             }
  740.         }
  741.         XSync(disp,False);
  742.         ewin->changes&=~MOD_SELECT;
  743.     }
  744.     if (ewin->changes&MOD_TITLE) {
  745.         for(i=0;i<ewin->num_subwins;i++)
  746.             if (cfg.subwin_type[i]==2) 
  747.                 DrawButton(ewin,i);
  748.         ewin->changes&=~MOD_TITLE;
  749.     }
  750.     if (ewin->changes&MOD_STATE)
  751.         ewin->changes&=~MOD_STATE;
  752.     ewin->changes=0;
  753.     XFreeGC(disp,gc);
  754.     XSync(disp,False);
  755. }
  756.  
  757. void DrawSetupWindowBorder(EWin *ewin) {
  758.     DrawWindowBorder(ewin);
  759. }
  760.