home *** CD-ROM | disk | FTP | other *** search
/ Dream 52 / Amiga_Dream_52.iso / Linux / Enlightenment / enl_DR-0.10.tar.gz / enl_DR-0.10.tar / enl / draw.c < prev    next >
C/C++ Source or Header  |  1997-06-20  |  26KB  |  703 lines

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