Enlightenment CVS committal

Author  : kwo
Project : e16
Module  : e

Dir     : e16/e/src


Modified Files:
        E.h borders.c draw.c ewin-ops.c ewins.c icccm.c iconify.c 
        menus.c slideout.c warp.c x.c 


Log Message:
Another attempt to get shape right.
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/E.h,v
retrieving revision 1.431
retrieving revision 1.432
diff -u -3 -r1.431 -r1.432
--- E.h 14 May 2005 20:00:35 -0000      1.431
+++ E.h 21 May 2005 20:58:17 -0000      1.432
@@ -1244,7 +1244,7 @@
 void                EwinBorderDetach(EWin * ewin);
 void                EwinBorderSetTo(EWin * ewin, const Border * b);
 void                EwinBorderDraw(EWin * ewin, int do_shape, int do_paint);
-void                EwinBorderCalcSizes(EWin * ewin);
+void                EwinBorderCalcSizes(EWin * ewin, int propagate);
 void                EwinBorderMinShadeSize(EWin * ewin, int *mw, int *mh);
 void                EwinBorderUpdateInfo(EWin * ewin);
 void                EwinBorderUpdateState(EWin * ewin);
@@ -1478,7 +1478,6 @@
 Imlib_Image        *ELoadImage(const char *file);
 void                DrawEwinShape(EWin * ewin, int md, int x, int y, int w,
                                  int h, char firstlast);
-void                PropagateShapes(Window win);
 
 /* econfig.c */
 void                ConfigurationLoad(void);
@@ -1594,7 +1593,6 @@
                                        void *ptr,
                                        void (*init) (EWin * ewin, void *ptr));
 void                EwinReparent(EWin * ewin, Window parent);
-void                SyncBorderToEwin(EWin * ewin);
 Window              EwinGetClientWin(const EWin * ewin);
 const char         *EwinGetName(const EWin * ewin);
 const char         *EwinGetIconName(const EWin * ewin);
@@ -2251,17 +2249,6 @@
 void                EMapWindow(Window win);
 void                EMapRaised(Window win);
 void                EUnmapWindow(Window win);
-void                EShapeCombineMask(Window win, int dest, int x, int y,
-                                     Pixmap pmap, int op);
-void                EShapeCombineMaskTiled(Window win, int dest, int x, int y,
-                                          Pixmap pmap, int op, int w, int h);
-void                EShapeCombineRectangles(Window win, int dest, int x, int y,
-                                           XRectangle * rect, int n_rects,
-                                           int op, int ordering);
-void                EShapeCombineShape(Window win, int dest, int x, int y,
-                                      Window src_win, int src_kind, int op);
-XRectangle         *EShapeGetRectangles(Window win, int dest, int *rn,
-                                       int *ord);
 void                EReparentWindow(Window win, Window parent, int x, int y);
 int                 EGetGeometry(Window win, Window * root_return,
                                 int *x, int *y, int *w, int *h, int *bw,
@@ -2270,7 +2257,6 @@
                                     XWindowChanges * wc);
 void                ESetWindowBackgroundPixmap(Window win, Pixmap pmap);
 void                ESetWindowBackground(Window win, int col);
-Pixmap              EWindowGetShapePixmap(Window win);
 
 #define ESelectInput(win, mask) XSelectInput(disp, win, mask)
 #define EGetWindowAttributes(win, attr) XGetWindowAttributes(disp, win, attr)
@@ -2282,6 +2268,21 @@
 #define ECreatePixmap(draw, w, h, dep) XCreatePixmap(disp, draw, w, h, dep)
 #define EFreePixmap(pmap) XFreePixmap(disp, pmap)
 
+void                EShapeCombineMask(Window win, int dest, int x, int y,
+                                     Pixmap pmap, int op);
+void                EShapeCombineMaskTiled(Window win, int dest, int x, int y,
+                                          Pixmap pmap, int op, int w, int h);
+void                EShapeCombineRectangles(Window win, int dest, int x, int y,
+                                           XRectangle * rect, int n_rects,
+                                           int op, int ordering);
+void                EShapeCombineShape(Window win, int dest, int x, int y,
+                                      Window src_win, int src_kind, int op);
+XRectangle         *EShapeGetRectangles(Window win, int dest, int *rn,
+                                       int *ord);
+int                 EShapeCopy(Window dst, Window src);
+void                EShapePropagate(Window win);
+Pixmap              EWindowGetShapePixmap(Window win);
+
 GC                  ECreateGC(Drawable d, unsigned long mask, XGCValues * val);
 int                 EFreeGC(GC gc);
 
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/borders.c,v
retrieving revision 1.261
retrieving revision 1.262
diff -u -3 -r1.261 -r1.262
--- borders.c   14 May 2005 19:40:14 -0000      1.261
+++ borders.c   21 May 2005 20:58:18 -0000      1.262
@@ -35,16 +35,6 @@
 static void         BorderFrameHandleEvents(XEvent * ev, void *prm);
 
 void
-SyncBorderToEwin(EWin * ewin)
-{
-   const Border       *b;
-
-   b = ewin->border;
-   ICCCM_GetShapeInfo(ewin);
-   EwinSetBorder(ewin, b, 1);
-}
-
-void
 EwinBorderUpdateState(EWin * ewin)
 {
    EwinBorderDraw(ewin, 0, 0);
@@ -366,7 +356,7 @@
 }
 
 void
-EwinBorderCalcSizes(EWin * ewin)
+EwinBorderCalcSizes(EWin * ewin, int propagate)
 {
    int                 i, ww, hh;
    char                reshape;
@@ -394,10 +384,14 @@
        ewin->bits[i].no_expose = 1;
      }
 
+#if 0                          /* Debug */
+   Eprintf("EwinBorderCalcSizes prop=%d reshape=%d\n", propagate, reshape);
+#endif
    if (reshape)
      {
        ewin->shapedone = 0;
-       EwinPropagateShapes(ewin);
+       if (propagate)
+          EwinPropagateShapes(ewin);
      }
 }
 
@@ -429,9 +423,6 @@
    if (b && strncmp(b->name, "__", 2))
       goto done;
 
-   ICCCM_GetShapeInfo(ewin);
-   ewin->shapedone = 0;
-
    if ((!ewin->client.mwm_decor_title && !ewin->client.mwm_decor_border) ||
        (Conf.dock.enable && ewin->docked))
       b = FindItem("BORDERLESS", 0, LIST_FINDBY_NAME, LIST_TYPE_BORDER);
@@ -567,7 +558,8 @@
    if (!ewin->shaded)
       EMoveWindow(ewin->win_container, b->border.left, b->border.top);
 
-   EwinBorderCalcSizes(ewin);
+   ewin->shapedone = 0;
+   EwinBorderCalcSizes(ewin, 0);
 
    SnapshotEwinUpdate(ewin, SNAP_USE_BORDER);
 }
@@ -581,7 +573,6 @@
    if (apply)
      {
        EwinBorderSetTo(ewin, b);
-       ICCCM_MatchSize(ewin);
        MoveResizeEwin(ewin, EoGetX(ewin), EoGetY(ewin),
                       ewin->client.w, ewin->client.h);
      }
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/draw.c,v
retrieving revision 1.73
retrieving revision 1.74
diff -u -3 -r1.73 -r1.74
--- draw.c      17 May 2005 15:50:01 -0000      1.73
+++ draw.c      21 May 2005 20:58:18 -0000      1.74
@@ -1116,112 +1116,3 @@
 
    return NULL;
 }
-
-void
-PropagateShapes(Window win)
-{
-   Window              rt, par, *list = NULL;
-   unsigned int        i, num, num_rects;
-   int                 k, rn, ord;
-   int                 x, y, xx, yy, ww, hh, d;
-   XRectangle         *rects, *rl;
-   XWindowAttributes   att;
-
-   if (!EGetGeometry(win, &rt, &xx, &yy, &ww, &hh, &d, &d))
-      return;
-   if ((ww <= 0) || (hh <= 0))
-      return;
-
-#if 0
-   Eprintf("PropagateShapes %#lx %d,%d %dx%d\n", win, xx, yy, ww, hh);
-#endif
-
-   XQueryTree(disp, win, &rt, &par, &list, &num);
-   if (!list)
-      return;
-
-   num_rects = 0;
-   rects = NULL;
-
-   /* go through all child windows and create/inset spans */
-   for (i = 0; i < num; i++)
-     {
-       XGetWindowAttributes(disp, list[i], &att);
-       x = att.x;
-       y = att.y;
-       if ((att.class == InputOutput) && (att.map_state != IsUnmapped))
-         {
-            rl = EShapeGetRectangles(list[i], ShapeBounding, &rn, &ord);
-            if (rl)
-              {
-                 if (rn > 0)
-                   {
-                      rects = Erealloc(rects,
-                                       (num_rects + rn) * sizeof(XRectangle));
-                      /* go through all clip rects in thsi window's shape */
-                      for (k = 0; k < rn; k++)
-                        {
-                           /* for each clip rect, add it to the rect list */
-                           rects[num_rects + k].x = x + rl[k].x;
-                           rects[num_rects + k].y = y + rl[k].y;
-                           rects[num_rects + k].width = rl[k].width;
-                           rects[num_rects + k].height = rl[k].height;
-                        }
-                      num_rects += rn;
-                   }
-                 Efree(rl);
-              }
-            else
-              {
-                 rects = Erealloc(rects, (num_rects + 1) * sizeof(XRectangle));
-
-                 rects[num_rects].x = x;
-                 rects[num_rects].y = y;
-                 rects[num_rects].width = att.width;
-                 rects[num_rects].height = att.height;
-                 num_rects++;
-              }
-         }
-     }
-
-#if 0
-   for (i = 0; i < num_rects; i++)
-      Eprintf("%3d %4d,%4d %4dx%4d\n", i, rects[i].x, rects[i].y,
-             rects[i].width, rects[i].height);
-#endif
-
-   /* set the rects as the shape mask */
-   if (rects)
-     {
-       EShapeCombineRectangles(win, ShapeBounding, 0, 0, rects,
-                               num_rects, ShapeSet, Unsorted);
-
-       /* Limit shape to window extents */
-       rects[0].x = 0;
-       rects[0].y = 0;
-       rects[0].width = ww;
-       rects[0].height = hh;
-       EShapeCombineRectangles(win, ShapeBounding, 0, 0, rects,
-                               1, ShapeIntersect, Unsorted);
-
-       Efree(rects);
-       rl = NULL;
-       rl = EShapeGetRectangles(win, ShapeBounding, &rn, &ord);
-       if (rl)
-         {
-            if (rn < 1)
-               EShapeCombineMask(win, ShapeBounding, 0, 0, None, ShapeSet);
-            else if (rn == 1)
-              {
-                 if ((rl[0].x == 0) && (rl[0].y == 0)
-                     && (rl[0].width == ww) && (rl[0].height == hh))
-                    EShapeCombineMask(win, ShapeBounding, 0, 0,
-                                      None, ShapeSet);
-              }
-            Efree(rl);
-         }
-       else
-          EShapeCombineMask(win, ShapeBounding, 0, 0, None, ShapeSet);
-     }
-   XFree(list);
-}
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/ewin-ops.c,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -3 -r1.37 -r1.38
--- ewin-ops.c  15 May 2005 18:29:45 -0000      1.37
+++ ewin-ops.c  21 May 2005 20:58:18 -0000      1.38
@@ -421,12 +421,7 @@
    else
       EoMoveResize(ewin, x, y, w, h);
 
-   if (raise)
-     {
-       EoSetFloating(ewin, floating);
-       RaiseEwin(ewin);
-     }
-
+#if 1                          /* FIXME - Should be done when 
shading/unshading */
    if (ewin->shaded == 0)
      {
        EMoveResizeWindow(ewin->win_container,
@@ -437,10 +432,21 @@
      {
        EMoveResizeWindow(ewin->win_container, -30, -30, 1, 1);
      }
+#endif
 
-   EMoveResizeWindow(ewin->client.win, 0, 0, ewin->client.w, ewin->client.h);
+   if (flags & MRF_RESIZE)
+     {
+       EMoveResizeWindow(ewin->client.win, 0, 0, ewin->client.w,
+                         ewin->client.h);
+       EwinBorderCalcSizes(ewin, 0);
+     }
+   EwinPropagateShapes(ewin);
 
-   EwinBorderCalcSizes(ewin);
+   if (raise)
+     {
+       EoSetFloating(ewin, floating);
+       RaiseEwin(ewin);
+     }
 
    if (Mode.mode == MODE_NONE || Conf.movres.update_while_moving)
       ICCCM_Configure(ewin);
@@ -797,7 +803,7 @@
    ewin->shaded = 2;
    EoMoveResize(ewin, x, y, w, h);
    EMoveResizeWindow(ewin->win_container, -30, -30, 1, 1);
-   EwinBorderCalcSizes(ewin);
+   EwinBorderCalcSizes(ewin, 1);
    ESync();
 
    HintsSetWindowState(ewin);
@@ -901,7 +907,7 @@
        if ((Conf.animate_shading) || (ewin->type == EWIN_TYPE_MENU))
          {
             ETimedLoopInit(0, 1024, speed);
-            for (k = 0; k <= 1024;)
+            for (k = 0; k < 1024;)
               {
                  i = ((a * (1024 - k)) + (b * k)) >> 10;
                  w = i;
@@ -921,7 +927,7 @@
                                        0, ewin->client.win, ShapeBounding,
                                        ShapeSet);
                  EoMoveResize(ewin, x, y, w, h);
-                 EwinBorderCalcSizes(ewin);
+                 EwinBorderCalcSizes(ewin, 1);
 
                  k = ETimedLoopNext();
               }
@@ -938,7 +944,7 @@
        if ((Conf.animate_shading) || (ewin->type == EWIN_TYPE_MENU))
          {
             ETimedLoopInit(0, 1024, speed);
-            for (k = 0; k <= 1024;)
+            for (k = 0; k < 1024;)
               {
                  i = ((a * (1024 - k)) + (b * k)) >> 10;
                  j = ((c * (1024 - k)) + (d * k)) >> 10;
@@ -959,7 +965,7 @@
                                        ShapeBounding, 0, 0, ewin->client.win,
                                        ShapeBounding, ShapeSet);
                  EoMoveResize(ewin, x, y, w, h);
-                 EwinBorderCalcSizes(ewin);
+                 EwinBorderCalcSizes(ewin, 1);
 
                  k = ETimedLoopNext();
               }
@@ -975,7 +981,7 @@
        if ((Conf.animate_shading) || (ewin->type == EWIN_TYPE_MENU))
          {
             ETimedLoopInit(0, 1024, speed);
-            for (k = 0; k <= 1024;)
+            for (k = 0; k < 1024;)
               {
                  i = ((a * (1024 - k)) + (b * k)) >> 10;
                  h = i;
@@ -996,7 +1002,7 @@
                                        ewin->client.win, ShapeBounding,
                                        ShapeSet);
                  EoMoveResize(ewin, x, y, w, h);
-                 EwinBorderCalcSizes(ewin);
+                 EwinBorderCalcSizes(ewin, 1);
 
                  k = ETimedLoopNext();
               }
@@ -1014,7 +1020,7 @@
        if ((Conf.animate_shading) || (ewin->type == EWIN_TYPE_MENU))
          {
             ETimedLoopInit(0, 1024, speed);
-            for (k = 0; k <= 1024;)
+            for (k = 0; k < 1024;)
               {
                  i = ((a * (1024 - k)) + (b * k)) >> 10;
                  j = ((c * (1024 - k)) + (d * k)) >> 10;
@@ -1035,7 +1041,7 @@
                                        ShapeBounding, 0, 0, ewin->client.win,
                                        ShapeBounding, ShapeSet);
                  EoMoveResize(ewin, x, y, w, h);
-                 EwinBorderCalcSizes(ewin);
+                 EwinBorderCalcSizes(ewin, 1);
 
                  k = ETimedLoopNext();
               }
@@ -1049,7 +1055,9 @@
    if (ewin->client.shaped)
       EShapeCombineShape(ewin->win_container, ShapeBounding, 0, 0,
                         ewin->client.win, ShapeBounding, ShapeSet);
-   MoveEwin(ewin, EoGetX(ewin), EoGetY(ewin));
+
+   MoveResizeEwin(ewin, EoGetX(ewin), EoGetY(ewin), ewin->client.w,
+                 ewin->client.h);
    ESync();
 
 #if 0
@@ -1105,7 +1113,7 @@
        if ((Conf.animate_shading) || (ewin->type == EWIN_TYPE_MENU))
          {
             ETimedLoopInit(0, 1024, speed);
-            for (k = 0; k <= 1024;)
+            for (k = 0; k < 1024;)
               {
                  i = ((a * (1024 - k)) + (b * k)) >> 10;
                  w = i;
@@ -1124,7 +1132,7 @@
                                        ewin->client.win, ShapeBounding,
                                        ShapeSet);
                  EoMoveResize(ewin, x, y, w, h);
-                 EwinBorderCalcSizes(ewin);
+                 EwinBorderCalcSizes(ewin, 1);
 
                  k = ETimedLoopNext();
               }
@@ -1151,7 +1159,7 @@
        if ((Conf.animate_shading) || (ewin->type == EWIN_TYPE_MENU))
          {
             ETimedLoopInit(0, 1024, speed);
-            for (k = 0; k <= 1024;)
+            for (k = 0; k < 1024;)
               {
                  i = ((a * (1024 - k)) + (b * k)) >> 10;
                  j = ((c * (1024 - k)) + (d * k)) >> 10;
@@ -1167,7 +1175,7 @@
                                        ShapeBounding, 0, 0, ewin->client.win,
                                        ShapeBounding, ShapeSet);
                  EoMoveResize(ewin, x, y, w, h);
-                 EwinBorderCalcSizes(ewin);
+                 EwinBorderCalcSizes(ewin, 1);
 
                  k = ETimedLoopNext();
               }
@@ -1192,7 +1200,7 @@
        if ((Conf.animate_shading) || (ewin->type == EWIN_TYPE_MENU))
          {
             ETimedLoopInit(0, 1024, speed);
-            for (k = 0; k <= 1024;)
+            for (k = 0; k < 1024;)
               {
                  i = ((a * (1024 - k)) + (b * k)) >> 10;
                  h = i;
@@ -1211,7 +1219,7 @@
                                        ewin->client.win, ShapeBounding,
                                        ShapeSet);
                  EoMoveResize(ewin, x, y, w, h);
-                 EwinBorderCalcSizes(ewin);
+                 EwinBorderCalcSizes(ewin, 1);
 
                  k = ETimedLoopNext();
               }
@@ -1238,7 +1246,7 @@
        if ((Conf.animate_shading) || (ewin->type == EWIN_TYPE_MENU))
          {
             ETimedLoopInit(0, 1024, speed);
-            for (k = 0; k <= 1024;)
+            for (k = 0; k < 1024;)
               {
                  i = ((a * (1024 - k)) + (b * k)) >> 10;
                  j = ((c * (1024 - k)) + (d * k)) >> 10;
@@ -1254,7 +1262,7 @@
                                        ShapeBounding, 0, 0, ewin->client.win,
                                        ShapeBounding, ShapeSet);
                  EoMoveResize(ewin, x, y, w, h);
-                 EwinBorderCalcSizes(ewin);
+                 EwinBorderCalcSizes(ewin, 1);
 
                  k = ETimedLoopNext();
               }
@@ -1267,6 +1275,11 @@
    att.win_gravity = NorthWestGravity;
    EChangeWindowAttributes(ewin->client.win, CWWinGravity, &att);
 
+   EMoveResizeWindow(ewin->client.win, 0, 0, ewin->client.w, ewin->client.h);
+   EMoveResizeWindow(ewin->win_container,
+                    ewin->border->border.left,
+                    ewin->border->border.top, ewin->client.w, ewin->client.h);
+
    if (ewin->client.shaped)
       EShapeCombineShape(ewin->win_container, ShapeBounding, 0, 0,
                         ewin->client.win, ShapeBounding, ShapeSet);
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/ewins.c,v
retrieving revision 1.62
retrieving revision 1.63
diff -u -3 -r1.62 -r1.63
--- ewins.c     12 May 2005 22:38:00 -0000      1.62
+++ ewins.c     21 May 2005 20:58:18 -0000      1.63
@@ -149,8 +149,6 @@
    ewin->client.event_mask = EWIN_CLIENT_EVENT_MASK;
    AddItem(ewin, "EWIN", win, LIST_TYPE_EWIN);
 
-   XShapeSelectInput(disp, win, ShapeNotifyMask);
-
    if (EventDebug(EDBUG_TYPE_EWINS))
       Eprintf("EwinCreate %#lx frame=%#lx state=%d\n", ewin->client.win,
              EoGetWin(ewin), ewin->state);
@@ -163,6 +161,7 @@
 
    if (!EwinIsInternal(ewin))
      {
+       XShapeSelectInput(disp, win, ShapeNotifyMask);
        XSetWindowBorderWidth(disp, win, 0);
        ewin->client.bw = 0;
      }
@@ -504,7 +503,7 @@
 #endif
    if (!ewin->shapedone)
      {
-       PropagateShapes(EoGetWin(ewin));
+       EShapePropagate(EoGetWin(ewin));
        EoChangeShape(ewin);
        ewin->shapedone = 1;
      }
@@ -1164,7 +1163,7 @@
        Mode.move.check = 0;    /* Don't restrict client requests */
        MoveResizeEwin(ewin, x, y, w, h);
        Mode.move.check = 1;
-
+#if 0                          /* FIXME - Remove? */
        {
           char                pshaped;
 
@@ -1172,10 +1171,11 @@
           ICCCM_GetShapeInfo(ewin);
           if (pshaped != ewin->client.shaped)
             {
-               SyncBorderToEwin(ewin);
+               ewin->shapedone = 0;
                EwinPropagateShapes(ewin);
             }
        }
+#endif
        ReZoom(ewin);
      }
    else
@@ -1204,6 +1204,7 @@
        w = ev->xresizerequest.width;
        h = ev->xresizerequest.height;
        ResizeEwin(ewin, w, h);
+#if 0                          /* FIXME - Remove? */
        {
           char                pshaped;
 
@@ -1211,10 +1212,11 @@
           ICCCM_GetShapeInfo(ewin);
           if (pshaped != ewin->client.shaped)
             {
-               SyncBorderToEwin(ewin);
+               ewin->shapedone = 0;
                EwinPropagateShapes(ewin);
             }
        }
+#endif
        ReZoom(ewin);
      }
    else
@@ -1254,7 +1256,6 @@
 
    HintsProcessPropertyChange(ewin, ev->xproperty.atom);
    SessionGetInfo(ewin, ev->xproperty.atom);
-   SyncBorderToEwin(ewin);
 
    EwinChangesProcess(ewin);
    EUngrabServer();
@@ -1263,14 +1264,8 @@
 static void
 EwinEventShapeChange(EWin * ewin)
 {
-   const Border       *b;
-
-   b = ewin->border;
-   SyncBorderToEwin(ewin);
-#if 0
-   if (ewin->border == b)
-#endif
-      ewin->shapedone = 0;
+   ICCCM_GetShapeInfo(ewin);
+   ewin->shapedone = 0;
    EwinPropagateShapes(ewin);
 }
 
@@ -1598,7 +1593,7 @@
    if (EWinChanges.flags & EWIN_CHANGE_NAME)
      {
        EwinBorderUpdateInfo(ewin);
-       EwinBorderCalcSizes(ewin);
+       EwinBorderCalcSizes(ewin, 1);
      }
 
    if (EWinChanges.flags & EWIN_CHANGE_DESKTOP)
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/icccm.c,v
retrieving revision 1.95
retrieving revision 1.96
diff -u -3 -r1.95 -r1.96
--- icccm.c     12 May 2005 22:38:01 -0000      1.95
+++ icccm.c     21 May 2005 20:58:18 -0000      1.96
@@ -765,46 +765,14 @@
 void
 ICCCM_GetShapeInfo(EWin * ewin)
 {
-   XRectangle         *rl = NULL;
-   int                 rn = 0, ord;
-   int                 x, y, w, h, d;
-   Window              rt;
-
    EGrabServer();
-   EGetGeometry(ewin->client.win, &rt, &x, &y, &w, &h, &d, &d);
-   rl = EShapeGetRectangles(ewin->client.win, ShapeBounding, &rn, &ord);
+   ewin->client.shaped = EShapeCopy(ewin->win_container, ewin->client.win);
    EUngrabServer();
 
-   if (rn < 1)
-     {
-       ewin->client.shaped = 0;
-       EShapeCombineMask(ewin->win_container, ShapeBounding, 0, 0, None,
-                         ShapeSet);
-     }
-   else if (rn == 1)
-     {
-       if ((rl[0].x <= 0) && (rl[0].y <= 0) && (rl[0].width >= w)
-           && (rl[0].height >= h))
-         {
-            ewin->client.shaped = 0;
-            EShapeCombineMask(ewin->win_container, ShapeBounding, 0, 0,
-                              None, ShapeSet);
-         }
-       else
-         {
-            ewin->client.shaped = 1;
-            EShapeCombineShape(ewin->win_container, ShapeBounding, 0, 0,
-                               ewin->client.win, ShapeBounding, ShapeSet);
-         }
-     }
-   else
-     {
-       ewin->client.shaped = 1;
-       EShapeCombineShape(ewin->win_container, ShapeBounding, 0, 0,
-                          ewin->client.win, ShapeBounding, ShapeSet);
-     }
-   if (rl)
-      XFree(rl);
+#if 0                          /* Debug */
+   Eprintf("ICCCM_GetShapeInfo %#lx cont=%#lx shaped=%d\n",
+          ewin->client.win, ewin->win_container, ewin->client.shaped);
+#endif
 }
 
 void
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/iconify.c,v
retrieving revision 1.148
retrieving revision 1.149
diff -u -3 -r1.148 -r1.149
--- iconify.c   15 May 2005 18:29:45 -0000      1.148
+++ iconify.c   21 May 2005 20:58:18 -0000      1.149
@@ -1654,13 +1654,13 @@
      }
 
 #if 0                          /* FIXME - Remove? */
-   PropagateShapes(ib->win);
+   EShapePropagate(ib->win);
    if (ib->ewin)
      {
        const Border       *b;
 
        b = ib->ewin->border;
-       SyncBorderToEwin(ib->ewin);
+       ICCCM_GetShapeInfo(ib->ewin);
        if (ib->ewin->border == b)
           EwinPropagateShapes(ib->ewin);
      }
@@ -1918,14 +1918,14 @@
        EClearWindow(ib->icon_win);
 
        if (ib->type == IB_TYPE_SYSTRAY && ib->nobg && !ib->draw_icon_base)
-          PropagateShapes(ib->icon_win);
+          EShapePropagate(ib->icon_win);
      }
    else
      {
        /* Transparent and no objects */
        EUnmapWindow(ib->icon_win);
      }
-   PropagateShapes(ib->win);
+   EShapePropagate(ib->win);
    ICCCM_GetShapeInfo(ib->ewin);
    ib->ewin->shapedone = 0;
    EwinPropagateShapes(ib->ewin);
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/menus.c,v
retrieving revision 1.193
retrieving revision 1.194
diff -u -3 -r1.193 -r1.194
--- menus.c     14 May 2005 19:40:34 -0000      1.193
+++ menus.c     21 May 2005 20:58:18 -0000      1.194
@@ -876,7 +876,7 @@
      {
        for (i = 0; i < m->num; i++)
           MenuDrawItem(m, m->items[i], 0);
-       PropagateShapes(m->win);
+       EShapePropagate(m->win);
      }
 }
 
@@ -942,7 +942,7 @@
    EClearWindow(mi->win);
 
    if ((shape) && (m->style->use_item_bg))
-      PropagateShapes(m->win);
+      EShapePropagate(m->win);
 
    if (mi->state == STATE_HILITED)
      {
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/slideout.c,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -3 -r1.30 -r1.31
--- slideout.c  7 May 2005 11:20:00 -0000       1.30
+++ slideout.c  21 May 2005 20:58:18 -0000      1.31
@@ -315,7 +315,7 @@
             break;
          }
      }
-   PropagateShapes(s->win);
+   EShapePropagate(s->win);
 }
 
 static void
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/warp.c,v
retrieving revision 1.63
retrieving revision 1.64
diff -u -3 -r1.63 -r1.64
--- warp.c      14 May 2005 19:40:35 -0000      1.63
+++ warp.c      21 May 2005 20:58:18 -0000      1.64
@@ -148,7 +148,7 @@
                                0, ST_WARPLIST);
          }
 
-       PropagateShapes(warpFocusWindow->win);
+       EShapePropagate(warpFocusWindow->win);
        EobjMap(warpFocusWindow, 0);
 
        /*
@@ -202,7 +202,7 @@
          }
      }
 
-   PropagateShapes(warpFocusWindow->win);
+   EShapePropagate(warpFocusWindow->win);
    EFlush();
 }
 
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/x.c,v
retrieving revision 1.90
retrieving revision 1.91
diff -u -3 -r1.90 -r1.91
--- x.c 16 May 2005 15:31:28 -0000      1.90
+++ x.c 21 May 2005 20:58:18 -0000      1.91
@@ -537,191 +537,6 @@
 }
 
 void
-EShapeCombineMask(Window win, int dest, int x, int y, Pixmap pmap, int op)
-{
-   EXID               *xid;
-
-   xid = EXidFind(win);
-   if (xid)
-     {
-       char                wasshaped = 0;
-
-       if (xid->rects)
-         {
-            xid->num_rect = 0;
-            XFree(xid->rects);
-            xid->rects = NULL;
-            wasshaped = 1;
-         }
-       if (pmap)
-         {
-            XShapeCombineMask(disp, win, dest, x, y, pmap, op);
-            xid->rects =
-               XShapeGetRectangles(disp, win, dest, &(xid->num_rect),
-                                   &(xid->ord));
-            if (xid->rects)
-              {
-                 if (xid->num_rect == 1)
-                   {
-                      if ((xid->rects[0].x == 0) && (xid->rects[0].y == 0)
-                          && (xid->rects[0].width == xid->w)
-                          && (xid->rects[0].height == xid->h))
-                        {
-                           xid->num_rect = 0;
-                           XFree(xid->rects);
-                           xid->rects = NULL;
-                        }
-                   }
-              }
-         }
-       else if ((!pmap) && (wasshaped))
-          XShapeCombineMask(disp, win, dest, x, y, pmap, op);
-     }
-   else
-      XShapeCombineMask(disp, win, dest, x, y, pmap, op);
-}
-
-void
-EShapeCombineMaskTiled(Window win, int dest, int x, int y,
-                      Pixmap pmap, int op, int w, int h)
-{
-   XGCValues           gcv;
-   GC                  gc;
-   Window              tm;
-
-   gcv.fill_style = FillTiled;
-   gcv.tile = pmap;
-   gcv.ts_x_origin = 0;
-   gcv.ts_y_origin = 0;
-   tm = ECreatePixmap(win, w, h, 1);
-   gc = ECreateGC(tm, GCFillStyle | GCTile |
-                 GCTileStipXOrigin | GCTileStipYOrigin, &gcv);
-   XFillRectangle(disp, tm, gc, 0, 0, w, h);
-   EFreeGC(gc);
-   EShapeCombineMask(win, dest, x, y, tm, op);
-   EFreePixmap(tm);
-}
-
-void
-EShapeCombineRectangles(Window win, int dest, int x, int y,
-                       XRectangle * rect, int n_rects, int op, int ordering)
-{
-   EXID               *xid;
-
-   xid = EXidFind(win);
-   if (xid)
-     {
-       if (n_rects == 1 && op == ShapeSet)
-         {
-            if ((rect[0].x == 0) && (rect[0].y == 0)
-                && (rect[0].width == xid->w) && (rect[0].height == xid->h))
-              {
-                 xid->num_rect = 0;
-                 XFree(xid->rects);
-                 xid->rects = NULL;
-                 XShapeCombineMask(disp, win, dest, x, y, None, op);
-                 return;
-              }
-         }
-       xid->num_rect = 0;
-       if (xid->rects)
-          XFree(xid->rects);
-       XShapeCombineRectangles(disp, win, dest, x, y, rect, n_rects, op,
-                               ordering);
-       xid->rects =
-          XShapeGetRectangles(disp, win, dest, &(xid->num_rect), &(xid->ord));
-       if (xid->rects)
-         {
-            if (xid->num_rect == 1)
-              {
-                 if ((xid->rects[0].x == 0) && (xid->rects[0].y == 0)
-                     && (xid->rects[0].width == xid->w)
-                     && (xid->rects[0].height == xid->h))
-                   {
-                      xid->num_rect = 0;
-                      XFree(xid->rects);
-                      xid->rects = NULL;
-                   }
-              }
-         }
-     }
-   else
-      XShapeCombineRectangles(disp, win, dest, x, y, rect, n_rects, op,
-                             ordering);
-}
-
-void
-EShapeCombineShape(Window win, int dest, int x, int y,
-                  Window src_win, int src_kind, int op)
-{
-   EXID               *xid;
-
-   xid = EXidFind(win);
-   if (xid)
-     {
-       xid->num_rect = 0;
-       if (xid->rects)
-          XFree(xid->rects);
-       XShapeCombineShape(disp, win, dest, x, y, src_win, src_kind, op);
-       xid->rects =
-          XShapeGetRectangles(disp, win, dest, &(xid->num_rect), &(xid->ord));
-       if (xid->rects)
-         {
-            if (xid->num_rect == 1)
-              {
-                 if ((xid->rects[0].x == 0) && (xid->rects[0].y == 0)
-                     && (xid->rects[0].width == xid->w)
-                     && (xid->rects[0].height == xid->h))
-                   {
-                      xid->num_rect = 0;
-                      XFree(xid->rects);
-                      xid->rects = NULL;
-                   }
-              }
-         }
-     }
-   else
-      XShapeCombineShape(disp, win, dest, x, y, src_win, src_kind, op);
-}
-
-XRectangle         *
-EShapeGetRectangles(Window win, int dest, int *rn, int *ord)
-{
-   EXID               *xid;
-
-   xid = EXidFind(win);
-   if (xid && !xid->attached)
-     {
-       XRectangle         *r;
-
-       *rn = xid->num_rect;
-       *ord = xid->ord;
-       if (xid->num_rect > 0)
-         {
-            r = Emalloc(sizeof(XRectangle) * xid->num_rect);
-            memcpy(r, xid->rects, sizeof(XRectangle) * xid->num_rect);
-            return r;
-         }
-       else
-          return NULL;
-     }
-   else
-     {
-       XRectangle         *r, *rr;
-
-       r = XShapeGetRectangles(disp, win, dest, rn, ord);
-       if (r)
-         {
-            rr = Emalloc(sizeof(XRectangle) * *rn);
-            memcpy(rr, r, sizeof(XRectangle) * *rn);
-            XFree(r);
-            return rr;
-         }
-     }
-   return NULL;
-}
-
-void
 EReparentWindow(Window win, Window parent, int x, int y)
 {
    EXID               *xid;
@@ -922,6 +737,364 @@
    XSelectInput(disp, win, xwa.your_event_mask);
 }
 
+#define DEBUG_SHAPE_OPS 0
+#define DEBUG_SHAPE_PROPAGATE 0
+
+#if DEBUG_SHAPE_OPS
+static void
+EShapeShow(const char *txt, XRectangle * pr, int nr)
+{
+   int                 i;
+
+   Eprintf("%s nr=%d\n", txt, nr);
+   for (i = 0; i < nr; i++)
+      Eprintf(" %d - %4d,%4d %4dx%4d\n", i,
+             pr[i].x, pr[i].y, pr[i].width, pr[i].height);
+}
+#endif
+
+static void
+EXidShapeUpdate(EXID * xid)
+{
+   if (xid->rects)
+     {
+       XFree(xid->rects);
+       xid->num_rect = 0;
+     }
+
+   xid->rects =
+      XShapeGetRectangles(disp, xid->win, ShapeBounding, &(xid->num_rect),
+                         &(xid->ord));
+   if (xid->rects)
+     {
+       if (xid->num_rect == 1)
+         {
+            if ((xid->rects[0].x == 0) && (xid->rects[0].y == 0)
+                && (xid->rects[0].width == xid->w)
+                && (xid->rects[0].height == xid->h))
+              {
+                 xid->num_rect = 0;
+                 XFree(xid->rects);
+                 xid->rects = NULL;
+              }
+         }
+     }
+   else
+     {
+       xid->num_rect = -1;
+     }
+#if DEBUG_SHAPE_OPS
+   EShapeShow("EXidShapeUpdate", xid->rects, xid->num_rect);
+#endif
+}
+
+void
+EShapeCombineMask(Window win, int dest, int x, int y, Pixmap pmap, int op)
+{
+   EXID               *xid;
+
+   xid = EXidFind(win);
+   if (xid)
+     {
+       char                wasshaped = 0;
+
+       if (xid->rects)
+         {
+            xid->num_rect = 0;
+            XFree(xid->rects);
+            xid->rects = NULL;
+            wasshaped = 1;
+         }
+#if DEBUG_SHAPE_OPS
+       Eprintf("EShapeCombineMask %#lx wassh=%d\n", win, wasshaped);
+#endif
+       if (pmap)
+         {
+            XShapeCombineMask(disp, win, dest, x, y, pmap, op);
+            EXidShapeUpdate(xid);
+         }
+       else if (wasshaped)
+          XShapeCombineMask(disp, win, dest, x, y, pmap, op);
+     }
+   else
+      XShapeCombineMask(disp, win, dest, x, y, pmap, op);
+}
+
+void
+EShapeCombineMaskTiled(Window win, int dest, int x, int y,
+                      Pixmap pmap, int op, int w, int h)
+{
+   XGCValues           gcv;
+   GC                  gc;
+   Window              tm;
+
+   gcv.fill_style = FillTiled;
+   gcv.tile = pmap;
+   gcv.ts_x_origin = 0;
+   gcv.ts_y_origin = 0;
+   tm = ECreatePixmap(win, w, h, 1);
+   gc = ECreateGC(tm, GCFillStyle | GCTile |
+                 GCTileStipXOrigin | GCTileStipYOrigin, &gcv);
+   XFillRectangle(disp, tm, gc, 0, 0, w, h);
+   EFreeGC(gc);
+   EShapeCombineMask(win, dest, x, y, tm, op);
+   EFreePixmap(tm);
+}
+
+void
+EShapeCombineRectangles(Window win, int dest, int x, int y,
+                       XRectangle * rect, int n_rects, int op, int ordering)
+{
+   EXID               *xid;
+
+#if DEBUG_SHAPE_OPS
+   Eprintf("EShapeCombineRectangles %#lx %d\n", win, n_rects);
+#endif
+
+   xid = EXidFind(win);
+   if (xid)
+     {
+       if (n_rects == 1 && op == ShapeSet)
+         {
+            if ((rect[0].x == 0) && (rect[0].y == 0) &&
+                (rect[0].width == xid->w) && (rect[0].height == xid->h))
+              {
+                 xid->num_rect = 0;
+                 XFree(xid->rects);
+                 xid->rects = NULL;
+                 XShapeCombineMask(disp, win, dest, x, y, None, op);
+                 return;
+              }
+         }
+       XShapeCombineRectangles(disp, win, dest, x, y, rect, n_rects, op,
+                               ordering);
+       if (n_rects > 1)
+         {
+            /* Limit shape to window extents */
+            XRectangle          r;
+
+            r.x = r.y = 0;
+            r.width = xid->w;
+            r.height = xid->h;
+            XShapeCombineRectangles(disp, win, ShapeBounding, 0, 0, &r,
+                                    1, ShapeIntersect, Unsorted);
+         }
+       EXidShapeUpdate(xid);
+     }
+   else
+      XShapeCombineRectangles(disp, win, dest, x, y, rect, n_rects, op,
+                             ordering);
+}
+
+void
+EShapeCombineShape(Window win, int dest, int x, int y,
+                  Window src_win, int src_kind, int op)
+{
+   EXID               *xid;
+
+   xid = EXidFind(win);
+   if (xid)
+     {
+       XShapeCombineShape(disp, win, dest, x, y, src_win, src_kind, op);
+       EXidShapeUpdate(xid);
+     }
+   else
+      XShapeCombineShape(disp, win, dest, x, y, src_win, src_kind, op);
+}
+
+XRectangle         *
+EShapeGetRectangles(Window win, int dest, int *rn, int *ord)
+{
+   EXID               *xid;
+
+   xid = EXidFind(win);
+   if (xid && !xid->attached)
+     {
+       XRectangle         *r;
+
+#if DEBUG_SHAPE_OPS
+       Eprintf("EShapeGetRectangles-A %#lx nr=%d\n", win, xid->num_rect);
+#endif
+       *rn = xid->num_rect;
+       *ord = xid->ord;
+       if (xid->num_rect > 0)
+         {
+            r = Emalloc(sizeof(XRectangle) * xid->num_rect);
+            memcpy(r, xid->rects, sizeof(XRectangle) * xid->num_rect);
+            return r;
+         }
+     }
+   else
+     {
+       XRectangle         *r, *rr;
+
+#if DEBUG_SHAPE_OPS
+       Eprintf("EShapeGetRectangles-B %#lx nr=%d\n", win, xid->num_rect);
+#endif
+       r = XShapeGetRectangles(disp, win, dest, rn, ord);
+       if (r)
+         {
+            rr = Emalloc(sizeof(XRectangle) * *rn);
+            memcpy(rr, r, sizeof(XRectangle) * *rn);
+            XFree(r);
+            return rr;
+         }
+     }
+   return NULL;
+}
+
+int
+EShapeCopy(Window dst, Window src)
+{
+   XRectangle         *rl;
+   int                 rn = 0, ord;
+   int                 x, y, w, h, d;
+   Window              rt;
+
+   EGrabServer();
+   EGetGeometry(src, &rt, &x, &y, &w, &h, &d, &d);
+   rl = EShapeGetRectangles(src, ShapeBounding, &rn, &ord);
+   EUngrabServer();
+
+   if (rn < 0)
+     {
+       /* Source has empty shape */
+       EShapeCombineShape(dst, ShapeBounding, 0, 0,
+                          src, ShapeBounding, ShapeSet);
+     }
+   else if (rn == 0)
+     {
+       /* Source has default shape (no shape) */
+       EShapeCombineMask(dst, ShapeBounding, 0, 0, None, ShapeSet);
+     }
+   else if (rn == 1)
+     {
+       if ((rl[0].x <= 0) && (rl[0].y <= 0) && (rl[0].width >= w)
+           && (rl[0].height >= h))
+         {
+            rn = 0;
+            EShapeCombineMask(dst, ShapeBounding, 0, 0, None, ShapeSet);
+         }
+       else
+         {
+            EShapeCombineShape(dst, ShapeBounding, 0, 0,
+                               src, ShapeBounding, ShapeSet);
+         }
+     }
+   else
+     {
+       EShapeCombineShape(dst, ShapeBounding, 0, 0,
+                          src, ShapeBounding, ShapeSet);
+     }
+   if (rl)
+      XFree(rl);
+
+   return rn != 0;
+}
+
+void
+EShapePropagate(Window win)
+{
+   Window              rt, par, *list = NULL;
+   unsigned int        i, num, num_rects;
+   int                 k, rn, ord;
+   int                 x, y, w, h, xx, yy, ww, hh, d;
+   XRectangle         *rects, *rl;
+   XWindowAttributes   att;
+
+   if (!EGetGeometry(win, &rt, &xx, &yy, &ww, &hh, &d, &d))
+      return;
+   if ((ww <= 0) || (hh <= 0))
+      return;
+
+#if DEBUG_SHAPE_PROPAGATE
+   Eprintf("EShapePropagate %#lx %d,%d %dx%d\n", win, xx, yy, ww, hh);
+#endif
+
+   XQueryTree(disp, win, &rt, &par, &list, &num);
+   if (!list)
+      return;
+
+   num_rects = 0;
+   rects = NULL;
+
+   /* go through all child windows and create/inset spans */
+   for (i = 0; i < num; i++)
+     {
+       XGetWindowAttributes(disp, list[i], &att);
+#if DEBUG_SHAPE_PROPAGATE > 1
+       Eprintf("%3d %#lx(%d): %4d,%4d %4dx%4d\n", i, list[i], att.map_state,
+               att.x, att.y, att.width, att.height);
+#endif
+       if ((att.class != InputOutput) || (att.map_state == IsUnmapped))
+          continue;
+
+       x = att.x;
+       y = att.y;
+       w = att.width;
+       h = att.height;
+       if (x >= ww || y >= hh || x + w < 0 || y + h < 0)
+          continue;
+
+       rl = EShapeGetRectangles(list[i], ShapeBounding, &rn, &ord);
+
+       if (rn > 0)
+         {
+            rects = Erealloc(rects, (num_rects + rn) * sizeof(XRectangle));
+            /* go through all clip rects in thsi window's shape */
+            for (k = 0; k < rn; k++)
+              {
+                 /* for each clip rect, add it to the rect list */
+                 rects[num_rects + k].x = x + rl[k].x;
+                 rects[num_rects + k].y = y + rl[k].y;
+                 rects[num_rects + k].width = rl[k].width;
+                 rects[num_rects + k].height = rl[k].height;
+#if DEBUG_SHAPE_PROPAGATE > 1
+                 Eprintf(" - %d: %4d,%4d %4dx%4d\n", k,
+                         rects[num_rects + k].x,
+                         rects[num_rects + k].y, rects[num_rects + k].width,
+                         rects[num_rects + k].height);
+#endif
+              }
+            num_rects += rn;
+            Efree(rl);
+         }
+       else if (rn == 0)
+         {
+            /* Unshaped */
+            rects = Erealloc(rects, (num_rects + 1) * sizeof(XRectangle));
+
+            rects[num_rects].x = x;
+            rects[num_rects].y = y;
+            rects[num_rects].width = w;
+            rects[num_rects].height = h;
+            num_rects++;
+         }
+     }
+
+#if DEBUG_SHAPE_PROPAGATE > 1
+   Eprintf("EShapePropagate %#lx nr=%d\n", win, num_rects);
+   for (i = 0; i < num_rects; i++)
+      Eprintf("%3d %4d,%4d %4dx%4d\n", i, rects[i].x, rects[i].y,
+             rects[i].width, rects[i].height);
+#endif
+
+   /* set the rects as the shape mask */
+   if (rects)
+     {
+       EShapeCombineRectangles(win, ShapeBounding, 0, 0, rects,
+                               num_rects, ShapeSet, Unsorted);
+       Efree(rects);
+     }
+   else
+     {
+       /* Empty shape */
+       EShapeCombineRectangles(win, ShapeBounding, 0, 0, NULL, 0, ShapeSet,
+                               Unsorted);
+     }
+   XFree(list);
+}
+
 GC
 ECreateGC(Drawable d, unsigned long mask, XGCValues * val)
 {




-------------------------------------------------------
This SF.Net email is sponsored by Oracle Space Sweepstakes
Want to be the first software developer in space?
Enter now for the Oracle Space Sweepstakes!
http://ads.osdn.com/?ad_id=7412&alloc_id=16344&op=click
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to