Enlightenment CVS committal

Author  : kwo
Project : e16
Module  : e

Dir     : e16/e/src


Modified Files:
        ecompmgr.c 


Log Message:
Avoid creating/destroying regions.

===================================================================
RCS file: /cvs/e/e16/e/src/ecompmgr.c,v
retrieving revision 1.145
retrieving revision 1.146
diff -u -3 -r1.145 -r1.146
--- ecompmgr.c  19 Apr 2007 22:25:25 -0000      1.145
+++ ecompmgr.c  21 Apr 2007 20:32:06 -0000      1.146
@@ -193,6 +193,8 @@
    char                ghosts;
    EObj               *eo_first;
    EObj               *eo_last;
+   XserverRegion       damage;
+   char                got_damage;
    XserverRegion       rgn_screen;
    int                 shadow_mode;
    double              opac_blur;      /* 0. -> 1. */
@@ -205,7 +207,7 @@
 static Picture      rootPicture;
 static Picture      rootBuffer;
 
-static XserverRegion allDamage;
+static XserverRegion rgn_tmp;  /* Region for temporary use */
 
 static ESelection  *wm_cm_sel = NULL;
 
@@ -231,6 +233,8 @@
 /*
  * Regions
  */
+#define REGION_DESTROY(rgn) \
+   if (rgn != None) { ERegionDestroy(rgn); rgn = None; }
 
 static              XserverRegion
 ERegionCreate(void)
@@ -267,10 +271,11 @@
    return XFixesCreateRegionFromWindow(disp, win, WindowRegionBounding);
 }
 
-static void
+static              XserverRegion
 ERegionCopy(XserverRegion rgn, XserverRegion src)
 {
    XFixesCopyRegion(disp, rgn, src);
+   return rgn;
 }
 
 static              XserverRegion
@@ -338,12 +343,10 @@
    rgn = src;
    if (dx != 0 || dy != 0)
      {
-       rgn = ERegionClone(src);
+       rgn = ERegionCopy(rgn_tmp, src);
        XFixesTranslateRegion(dpy, rgn, dx, dy);
      }
    XFixesSubtractRegion(dpy, dst, dst, rgn);
-   if (rgn != src)
-      ERegionDestroy(rgn);
 }
 
 static void
@@ -355,12 +358,10 @@
    rgn = src;
    if (dx != 0 || dy != 0)
      {
-       rgn = ERegionClone(src);
+       rgn = ERegionCopy(rgn_tmp, src);
        XFixesTranslateRegion(dpy, rgn, dx, dy);
      }
    XFixesUnionRegion(dpy, dst, dst, rgn);
-   if (rgn != src)
-      ERegionDestroy(rgn);
 }
 
 #if 0                          /* Unused (for debug) */
@@ -618,32 +619,27 @@
  */
 
 static void
-ECompMgrDamageMerge(XserverRegion damage, int destroy)
+ECompMgrDamageMerge(XserverRegion damage)
 {
-   if (allDamage != None)
+   if (Mode_compmgr.damage != None)
      {
        if (EDebug(EDBUG_TYPE_COMPMGR3))
           ERegionShow("ECompMgrDamageMerge add:", damage);
 
-       ERegionUnion(allDamage, damage);
-       if (destroy)
-          ERegionDestroy(damage);
-     }
-   else if (!destroy)
-     {
-       allDamage = ERegionClone(damage);
+       ERegionUnion(Mode_compmgr.damage, damage);
      }
    else
      {
-       allDamage = damage;
+       Mode_compmgr.damage = ERegionClone(damage);
      }
+   Mode_compmgr.got_damage = 1;
 
    if (EDebug(EDBUG_TYPE_COMPMGR3))
-      ERegionShow("ECompMgrDamageMerge all:", allDamage);
+      ERegionShow("ECompMgrDamageMerge all:", Mode_compmgr.damage);
 }
 
 static void
-ECompMgrDamageMergeObject(EObj * eo, XserverRegion damage, int destroy)
+ECompMgrDamageMergeObject(EObj * eo, XserverRegion damage)
 {
    ECmWinInfo         *cw = eo->cmhook;
    Desk               *dsk = eo->desk;
@@ -652,11 +648,7 @@
       return;
 
    if (dsk->num > 0 && !dsk->viewable && eo->ilayer < 512)
-     {
-       if (destroy)
-          ERegionDestroy(damage);
-       return;
-     }
+      return;
 
    if (Mode_compmgr.reorder)
       ECompMgrDetermineOrder(NULL, 0, &Mode_compmgr.eo_first,
@@ -672,8 +664,7 @@
      }
 #endif
 
-   if (!destroy)
-      damage = ERegionClone(damage);
+   damage = ERegionCopy(rgn_tmp, damage);
 
 #if USE_CLIP_RELATIVE_TO_DESK
    if (cw->clip != None && eo->type != EOBJ_TYPE_DESK)
@@ -690,13 +681,13 @@
    if (!eo->ghost)
       Mode.events.damage_count++;
 
-   ECompMgrDamageMerge(damage, 1);
+   ECompMgrDamageMerge(damage);
 }
 
 static void
 ECompMgrDamageAll(void)
 {
-   ECompMgrDamageMerge(ERegionCreateRect(0, 0, VRoot.w, VRoot.h), 1);
+   ECompMgrDamageMerge(Mode_compmgr.rgn_screen);
 }
 
 #if ENABLE_SHADOWS
@@ -1202,7 +1193,7 @@
            cw->opacity);
 
    if (eo->shown || cw->fadeout)
-      ECompMgrDamageMergeObject(eo, cw->extents, 0);
+      ECompMgrDamageMergeObject(eo, cw->extents);
 
    /* Invalidate stuff changed by opacity */
    ECompMgrWinInvalidate(eo, INV_OPACITY);
@@ -1336,7 +1327,7 @@
    cw->fadeout = 1;
    ECompMgrWinInvalidate(eo, INV_PICTURE);
    ECompMgrWinSetPicts(eo);
-   ECompMgrDamageMergeObject(eo, cw->extents, 0);
+   ECompMgrDamageMergeObject(eo, cw->extents);
    ECompMgrWinFade(eo, cw->opacity, 0x10000000);
 }
 
@@ -1352,7 +1343,7 @@
      {
        cw->fadeout = 0;
        ECompMgrWinInvalidate(eo, INV_PIXMAP | INV_PICTURE);
-       ECompMgrDamageMergeObject(eo, cw->extents, 0);
+       ECompMgrDamageMergeObject(eo, cw->extents);
        _ECM_SET_CLIP_CHANGED();
      }
    cw->fading = 0;
@@ -1396,7 +1387,7 @@
       cw->extents = win_extents(eo);
 
    _ECM_SET_STACK_CHANGED();
-   ECompMgrDamageMergeObject(eo, cw->extents, 0);
+   ECompMgrDamageMergeObject(eo, cw->extents);
 
    if (Conf_compmgr.fading.enable && eo->fade)
       ECompMgrWinFadeIn(eo);
@@ -1415,7 +1406,7 @@
       ECompMgrWinFadeOut(eo);
    else
      {
-       ECompMgrDamageMergeObject(eo, cw->extents, 0);
+       ECompMgrDamageMergeObject(eo, cw->extents);
        _ECM_SET_STACK_CHANGED();
        ECompMgrWinInvalidate(eo, INV_PIXMAP);
      }
@@ -1567,11 +1558,12 @@
    if (damage != None)
      {
        ERegionUnion(damage, cw->extents);
-       ECompMgrDamageMergeObject(eo, damage, 1);
+       ECompMgrDamageMergeObject(eo, damage);
+       ERegionDestroy(damage);
      }
    else
      {
-       ECompMgrDamageMergeObject(eo, cw->extents, 0);
+       ECompMgrDamageMergeObject(eo, cw->extents);
      }
 }
 
@@ -1581,7 +1573,7 @@
 {
    ECmWinInfo         *cw = eo->cmhook;
 
-   ECompMgrDamageMergeObject(eo, cw->shape, 0);
+   ECompMgrDamageMergeObject(eo, cw->shape);
 }
 
 void
@@ -1595,8 +1587,7 @@
    if (!shadow && eo->shadow)
      {
        /* Disable shadow */
-       ECompMgrDamageMergeObject(eo, cw->extents, 1);
-       cw->extents = None;
+       ECompMgrDamageMergeObject(eo, cw->extents);
        ECompMgrWinInvalidate(eo, INV_SHADOW);
      }
    else if (shadow && !eo->shadow)
@@ -1605,7 +1596,7 @@
        ECompMgrWinInvalidate(eo, INV_SHADOW);
        eo->shadow = shadow;
        cw->extents = win_extents(eo);
-       ECompMgrDamageMergeObject(eo, cw->extents, 0);
+       ECompMgrDamageMergeObject(eo, cw->extents);
      }
  done:
    eo->shadow = shadow;
@@ -1644,10 +1635,9 @@
    /* Invalidate old window region */
    if (EDebug(EDBUG_TYPE_COMPMGR3))
       ERegionShow("old-extents:", cw->extents);
-   ECompMgrDamageMergeObject(eo, cw->extents, change_xy);
+   ECompMgrDamageMergeObject(eo, cw->extents);
    if (change_xy)
      {
-       cw->extents = None;
        ECompMgrWinInvalidate(eo, INV_POS);
 
        /* Find new window region */
@@ -1655,7 +1645,7 @@
      }
    eo->desk = dsk;
    _ECM_SET_STACK_CHANGED();
-   ECompMgrDamageMergeObject(eo, cw->extents, 0);
+   ECompMgrDamageMergeObject(eo, cw->extents);
    ECompMgrWinInvalidate(eo, INV_PIXMAP);
 }
 
@@ -1675,8 +1665,7 @@
 
    D1printf("ECompMgrWinChangeShape %#lx\n", EobjGetXwin(eo));
 
-   ECompMgrDamageMergeObject(eo, cw->extents, 1);
-   cw->extents = None;
+   ECompMgrDamageMergeObject(eo, cw->extents);
 
    _ECM_SET_CLIP_CHANGED();
    ECompMgrWinInvalidate(eo, INV_SIZE);
@@ -1691,7 +1680,7 @@
 
    if (delta < 0)              /* Raise */
       _ECM_SET_STACK_CHANGED();
-   ECompMgrDamageMergeObject(eo, cw->extents, 0);
+   ECompMgrDamageMergeObject(eo, cw->extents);
    if (delta > 0)              /* Lower */
       _ECM_SET_STACK_CHANGED();
 }
@@ -1768,7 +1757,8 @@
 #endif
      }
    eo->serial = ev->xany.serial;
-   ECompMgrDamageMergeObject(eo, parts, 1);
+   ECompMgrDamageMergeObject(eo, parts);
+   ERegionDestroy(parts);
 }
 
 static void
@@ -1902,7 +1892,9 @@
 #endif
          }
 
-       cw->clip = ERegionClone(clip);
+       if (cw->clip == None)
+          cw->clip = ERegionCreate();
+       ERegionCopy(cw->clip, clip);
 
        ECompMgrWinSetPicts(eo);
 
@@ -2156,15 +2148,15 @@
    Picture             pbuf;
    Desk               *dsk = DeskGet(0);
 
-   if (!Mode_compmgr.active || allDamage == None)
+   if (!Mode_compmgr.active || !Mode_compmgr.got_damage)
       return;
 
-   ERegionLimit(allDamage);
+   ERegionLimit(Mode_compmgr.damage);
 
    D2printf("ECompMgrRepaint rootBuffer=%#lx rootPicture=%#lx\n",
            rootBuffer, rootPicture);
    if (EDebug(EDBUG_TYPE_COMPMGR))
-      ERegionShow("allDamage", allDamage);
+      ERegionShow("damage", Mode_compmgr.damage);
 
    if (!rootBuffer)
       rootBuffer = EPictureCreateBuffer(VRoot.xwin, VRoot.w, VRoot.h,
@@ -2181,7 +2173,7 @@
 
    /* Paint opaque windows top down */
    for (eo = Mode_compmgr.eo_first; eo; eo = eo->cmhook->next)
-      ECompMgrRepaintObj(pbuf, allDamage, eo, 0);
+      ECompMgrRepaintObj(pbuf, Mode_compmgr.damage, eo, 0);
 
 #if 0                          /* FIXME - NoBg? */
    Picture             pict;
@@ -2199,28 +2191,27 @@
 
    /* Paint trans windows and shadows bottom up */
    for (eo = Mode_compmgr.eo_last; eo; eo = eo->cmhook->prev)
-      ECompMgrRepaintObj(pbuf, allDamage, eo, 1);
+      ECompMgrRepaintObj(pbuf, Mode_compmgr.damage, eo, 1);
 
    /* Paint any ghost windows (adjusting damage region) */
    if (Mode_compmgr.ghosts)
-      ECompMgrPaintGhosts(rootPicture, allDamage);
+      ECompMgrPaintGhosts(rootPicture, Mode_compmgr.damage);
 
    if (pbuf != rootPicture)
      {
-       XFixesSetPictureClipRegion(dpy, pbuf, 0, 0, allDamage);
+       XFixesSetPictureClipRegion(dpy, pbuf, 0, 0, Mode_compmgr.damage);
        XRenderComposite(dpy, PictOpSrc, pbuf, None, rootPicture,
                         0, 0, 0, 0, 0, 0, VRoot.w, VRoot.h);
      }
 
-   ERegionDestroy(allDamage);
-   allDamage = None;
+   Mode_compmgr.got_damage = 0;
 }
 
 static void
 _ECompMgrIdler(void *data __UNUSED__)
 {
    /* Do we get here on auto? */
-   if (!allDamage /* || Conf_compmgr.mode == ECM_MODE_AUTO */ )
+   if (!Mode_compmgr.got_damage /* || Conf_compmgr.mode == ECM_MODE_AUTO */ )
       return;
    ECompMgrRepaint();
 }
@@ -2237,9 +2228,7 @@
    VRoot.pmap = None;
 
    /* Screen region */
-   if (Mode_compmgr.rgn_screen != None)
-      ERegionDestroy(Mode_compmgr.rgn_screen);
-   Mode_compmgr.rgn_screen = None;
+   REGION_DESTROY(Mode_compmgr.rgn_screen);
 }
 
 static void
@@ -2281,7 +2270,8 @@
 
        region = ERegionCreateFromRects(expose_rects, n_expose);
 
-       ECompMgrDamageMerge(region, 1);
+       ECompMgrDamageMerge(region);
+       ERegionDestroy(region);
        n_expose = 0;
      }
 }
@@ -2407,7 +2397,9 @@
        break;
      }
 
-   allDamage = None;
+   Mode_compmgr.got_damage = 0;
+
+   rgn_tmp = ERegionCreate();
 
    EventCallbackRegister(VRoot.win, 0, ECompMgrHandleRootEvent, NULL);
 
@@ -2470,9 +2462,9 @@
          }
      }
 
-   if (allDamage != None)
-      ERegionDestroy(allDamage);
-   allDamage = None;
+   Mode_compmgr.got_damage = 0;
+   REGION_DESTROY(Mode_compmgr.damage);
+   REGION_DESTROY(rgn_tmp);
 
    if (Conf_compmgr.mode == ECM_MODE_ROOT)
       XCompositeUnredirectSubwindows(disp, VRoot.xwin, 
CompositeRedirectManual);



-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to