Enlightenment CVS committal

Author  : kwo
Project : e16
Module  : e

Dir     : e16/e/src


Modified Files:
        E.h backgrounds.c backgrounds.h desktops.c desktops.h 
        ecompmgr.c ecompmgr.h hints.c pager.c x.c 


Log Message:
Rework background handling:
- Only use root background overlay when composite is enabled
- Improve handling of external backgrounds ("No Background")
- Fix external background handling when composite is enabled

===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/E.h,v
retrieving revision 1.534
retrieving revision 1.535
diff -u -3 -r1.534 -r1.535
--- E.h 19 Feb 2006 22:23:50 -0000      1.534
+++ E.h 27 Feb 2006 19:14:25 -0000      1.535
@@ -482,10 +482,6 @@
    } grabs;
    struct
    {
-      Pixmap              old_root_pmap;
-   } hints;
-   struct
-   {
       const char         *lang;
       char                utf8_int;    /* Use UTF-8 internally */
       char                utf8_loc;    /* Locale is UTF-8 */
@@ -510,6 +506,11 @@
    } place;
    struct
    {
+      Pixmap              ext_pmap;
+      char                ext_pmap_valid;
+   } root;
+   struct
+   {
       char               *path;
    } theme;
    struct
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/backgrounds.c,v
retrieving revision 1.60
retrieving revision 1.61
diff -u -3 -r1.60 -r1.61
--- backgrounds.c       20 Feb 2006 18:56:36 -0000      1.60
+++ backgrounds.c       27 Feb 2006 19:14:25 -0000      1.61
@@ -56,11 +56,12 @@
 #endif
    char                external;
    char                keepim;
-   unsigned int        ref_count;      /* bg */
-   unsigned int        use_count;      /* pmap */
+   unsigned int        ref_count;
+   unsigned int        seq_no;
 };
 
 static Ecore_List  *bg_list = NULL;
+static unsigned int bg_seq_no = 0;
 
 char               *
 BackgroundGetUniqueString(const Background * bg)
@@ -153,39 +154,15 @@
 void
 BackgroundPixmapSet(Background * bg, Pixmap pmap)
 {
-   if (bg->pmap != pmap)
-     {
-       if (bg->use_count || bg->pmap != None)
-          Eprintf("*** BackgroundPixmapSet %s: pmap mismatch %#lx/%#lx\n",
-                  bg->name, bg->pmap, pmap);
-       bg->pmap = pmap;
-     }
-   bg->use_count++;
-}
-
-void
-BackgroundPixmapUnset(Background * bg, Pixmap pmap)
-{
-   if (bg->pmap != pmap || !bg->use_count)
-     {
-       Eprintf("*** BackgroundPixmapUnset %s: pmap mismatch %#lx/%#lx\n",
-               bg->name, bg->pmap, pmap);
-     }
-   if (bg->use_count)
-      bg->use_count--;
+   if (bg->pmap != None && bg->pmap != pmap)
+      Eprintf("*** BackgroundPixmapSet %s: pmap was set %#lx/%#lx\n",
+             bg->name, bg->pmap, pmap);
+   bg->pmap = pmap;
 }
 
 static void
 BackgroundPixmapFree(Background * bg)
 {
-   if (!bg)
-      return;
-
-   if (bg->use_count)
-     {
-       Eprintf("*** BackgroundPixmapFree %s: still referenced(%d)\n",
-               bg->name, bg->use_count);
-     }
    if (bg->pmap)
      {
        imlib_free_pixmap_and_mask(bg->pmap);
@@ -343,6 +320,8 @@
    bg->top.xperc = txperc;
    bg->top.yperc = typerc;
 
+   bg->seq_no = ++bg_seq_no;
+
    return bg;
 }
 
@@ -373,14 +352,10 @@
 static void
 BackgroundInvalidate(Background * bg, int refresh)
 {
-   int                 used;
-
-   used = bg->ref_count;
-   if (used)
-      DesksBackgroundFree(bg, 1);
    BackgroundPixmapFree(bg);
-   if (used && refresh)
-      DesksBackgroundRefresh(bg);
+   bg->seq_no = ++bg_seq_no;
+   if (bg->ref_count && refresh)
+      DesksBackgroundRefresh(bg, DESK_BG_REFRESH);
 }
 
 static int
@@ -601,11 +576,12 @@
     * invalid one from a previous session.
     */
    pmap = ECreatePixmap(win, w, h, depth);
-   if (win == VRoot.win && pmap == Mode.hints.old_root_pmap)
+   if (win == VRoot.win && pmap == Mode.root.ext_pmap)
      {
        EFreePixmap(pmap);
        pmap = ECreatePixmap(win, w, h, depth);
-       Mode.hints.old_root_pmap = None;
+       Mode.root.ext_pmap = None;
+       Mode.root.ext_pmap_valid = 0;
      }
    return pmap;
 }
@@ -1017,12 +993,6 @@
    bg->last_viewed = time(NULL);
 }
 
-static              time_t
-BackgroundGetTimestamp(const Background * bg)
-{
-   return bg->last_viewed;
-}
-
 const char         *
 BackgroundGetName(const Background * bg)
 {
@@ -1053,6 +1023,12 @@
    return (bg) ? bg->pmap : None;
 }
 
+unsigned int
+BackgroundGetSeqNo(const Background * bg)
+{
+   return bg->seq_no;
+}
+
 int
 BackgroundIsNone(const Background * bg)
 {
@@ -1484,28 +1460,20 @@
 static void
 BackgroundsAccounting(void)
 {
-   unsigned int        j;
-   Desk               *dsk;
    Background         *bg;
    time_t              now;
 
-   for (j = 0; j < DesksGetNumber(); j++)
-     {
-       dsk = DeskGet(j);
-       if ((DeskBackgroundGet(dsk)) && (DeskIsViewable(dsk)))
-          BackgroundTouch(DeskBackgroundGet(dsk));
-     }
+   DesksBackgroundRefresh(NULL, DESK_BG_TIMEOUT);
 
    now = time(NULL);
    ECORE_LIST_FOR_EACH(bg_list, bg)
    {
       /* Skip if no pixmap or not timed out */
-      if ((bg->pmap == None) ||
-         ((now - BackgroundGetTimestamp(bg)) <= Conf.backgrounds.timeout))
+      if (bg->pmap == None ||
+         ((now - bg->last_viewed) <= Conf.backgrounds.timeout))
         continue;
 
-      if (bg->ref_count)
-        DesksBackgroundFree(bg, 0);
+      DesksBackgroundRefresh(NULL, DESK_BG_FREE);
       BackgroundPixmapFree(bg);
    }
 }
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/backgrounds.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -3 -r1.7 -r1.8
--- backgrounds.h       18 Feb 2006 08:30:03 -0000      1.7
+++ backgrounds.h       27 Feb 2006 19:14:25 -0000      1.8
@@ -32,7 +32,6 @@
 Background         *BackgroundGetRandom(void);
 char               *BackgroundGetUniqueString(const Background * bg);
 void                BackgroundPixmapSet(Background * bg, Pixmap pmap);
-void                BackgroundPixmapUnset(Background * bg, Pixmap pmap);
 void                BackgroundDestroyByName(const char *name);
 void                BackgroundRealize(Background * bg, Drawable draw,
                                      unsigned int rw, unsigned int rh,
@@ -49,6 +48,7 @@
 const char         *BackgroundGetName(const Background * bg);
 int                 BackgroundGetColor(const Background * bg);
 Pixmap              BackgroundGetPixmap(const Background * bg);
+unsigned int        BackgroundGetSeqNo(const Background * bg);
 int                 BackgroundIsNone(const Background * bg);
 Background         *BrackgroundCreateFromImage(const char *bgid,
                                               const char *file, char *thumb,
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/desktops.c,v
retrieving revision 1.225
retrieving revision 1.226
diff -u -3 -r1.225 -r1.226
--- desktops.c  20 Feb 2006 21:53:39 -0000      1.225
+++ desktops.c  27 Feb 2006 19:14:25 -0000      1.226
@@ -410,6 +410,7 @@
    EventCallbackRegister(EoGetWin(dsk), 0, DeskHandleEvents, dsk);
    EoSetFade(dsk, 0);
    EoSetShadow(dsk, 0);
+   dsk->bg.o = EoObj(dsk);
    if (desk == 0)
      {
        desks.current = dsk;
@@ -420,14 +421,14 @@
        eo->floating = 0;
        eo->fade = eo->shadow = 0;
        EobjSetLayer(eo, 0);
-       EobjMap(eo, 0);
-       dsk->bg.o = eo;
        EventCallbackRegister(EobjGetWin(eo), 0, DeskHandleEvents, dsk);
+       dsk->bg.o_bg = eo;
+       if (Mode.root.ext_pmap_valid)
+          dsk->bg.pmap_set = Mode.root.ext_pmap;
 #endif
      }
    else
      {
-       dsk->bg.o = EoObj(dsk);
        EoSetFloating(dsk, 1);
        EoSetLayer(dsk, 0);
 #if 0                          /* TBD */
@@ -446,7 +447,7 @@
    eo->fade = eo->shadow = 0;
    EobjReparent(eo, EoObj(dsk), 0, 0);
    EobjSetLayer(eo, 0);
-   dsk->bg.o = eo;
+   dsk->bg.o_bg = eo;
    EventCallbackRegister(EobjGetWin(eo), 0, DeskHandleEvents, dsk);
 #endif
 
@@ -463,11 +464,11 @@
 {
    ModulesSignal(ESIGNAL_DESK_REMOVED, dsk);
 
-   if (dsk->bg.o != EoObj(dsk))
+   if (dsk->bg.o_bg)
      {
-       EventCallbackUnregister(EobjGetWin(dsk->bg.o), 0, DeskHandleEvents,
+       EventCallbackUnregister(EobjGetWin(dsk->bg.o_bg), 0, DeskHandleEvents,
                                dsk);
-       EobjWindowDestroy(dsk->bg.o);
+       EobjWindowDestroy(dsk->bg.o_bg);
      }
    EventCallbackUnregister(EoGetWin(dsk), 0, DeskHandleEvents, dsk);
 
@@ -475,11 +476,7 @@
    DeskControlsDestroy(dsk, 2);
 
    if (dsk->bg.bg)
-     {
-       if (dsk->bg.pmap != None)
-          BackgroundPixmapUnset(dsk->bg.bg, dsk->bg.pmap);
-       BackgroundDecRefcount(dsk->bg.bg);
-     }
+      BackgroundDecRefcount(dsk->bg.bg);
 
    EoFini(dsk);
 
@@ -492,8 +489,6 @@
 {
    if (!dsk)
       return VRoot.win;
-   if (!dsk->bg.bg || !dsk->bg.o)
-      return EoGetWin(dsk);
    return EobjGetWin(dsk->bg.o);
 }
 
@@ -516,28 +511,33 @@
 DeskBackgroundConfigure(Desk * dsk)
 {
    Window              win;
+   Pixmap              pmap = dsk->bg.pmap;
+   unsigned long       pixel = dsk->bg.pixel;
 
    if (EventDebug(EDBUG_TYPE_DESKS))
-      Eprintf("DeskBackgroundConfigure %d %#lx v=%d - %#lx %#lx %#lx\n",
-             dsk->num, EoGetWin(dsk), dsk->viewable,
-             EobjGetWin(dsk->bg.o), dsk->bg.pmap, dsk->bg.pixel);
+      Eprintf
+        ("DeskBackgroundConfigure %d v=%d %#lx/%#lx: ext=%d pmap=%#lx/%#lx 
pixel=%#lx/%#lx\n",
+         dsk->num, dsk->viewable, EoGetWin(dsk), EobjGetWin(dsk->bg.o),
+         BackgroundIsNone(dsk->bg.bg), pmap, dsk->bg.pmap_set, pixel,
+         dsk->bg.pixel);
 
-   if (dsk->bg.o != EoObj(dsk))
+   if (dsk->bg.o_bg)
      {
-       if (dsk->bg.bg)
+       if (ECompMgrIsActive())
          {
-            EobjMap(dsk->bg.o, 0);
+            dsk->bg.o = dsk->bg.o_bg;
+            EobjMap(dsk->bg.o_bg, 0);
          }
        else
          {
-            EobjUnmap(dsk->bg.o);
-            return;
+            dsk->bg.o = EoObj(dsk);
+            EobjUnmap(dsk->bg.o_bg);
          }
      }
 
    win = EobjGetWin(dsk->bg.o);
 
-   if (dsk->viewable)
+   if (dsk->viewable || !dsk->bg.bg)
      {
 #if !USE_BG_WIN_ON_ALL_DESKS
        if (ECompMgrDeskConfigure(dsk))
@@ -547,27 +547,26 @@
        else
 #endif
          {
-            if (dsk->bg.pmap != None)
+            if (pmap != None)
               {
-                 ESetWindowBackgroundPixmap(win, dsk->bg.pmap);
+                 ESetWindowBackgroundPixmap(win, pmap);
                  if (dsk->num == 0 && win != VRoot.win)
-                    ESetWindowBackgroundPixmap(VRoot.win, dsk->bg.pmap);
+                    ESetWindowBackgroundPixmap(VRoot.win, pmap);
               }
             else
               {
-                 ESetWindowBackground(win, dsk->bg.pixel);
+                 ESetWindowBackground(win, pixel);
                  if (dsk->num == 0 && win != VRoot.win)
-                    ESetWindowBackground(VRoot.win, dsk->bg.pixel);
+                    ESetWindowBackground(VRoot.win, pixel);
               }
             EClearWindow(win);
          }
 
-       if (Conf.hints.set_xroot_info_on_root_window)
-          HintsSetRootInfo(VRoot.win, dsk->bg.pmap, dsk->bg.pixel);
-       else
-          HintsSetRootInfo(EoGetWin(dsk), dsk->bg.pmap, dsk->bg.pixel);
+       HintsSetRootInfo(EoGetWin(dsk), pmap, pixel);
+       if (Conf.hints.set_xroot_info_on_root_window && win != VRoot.win)
+          HintsSetRootInfo(VRoot.win, pmap, pixel);
      }
-   else
+   else if (dsk->bg.bg)
      {
        if (!Conf.hints.set_xroot_info_on_root_window)
           HintsSetRootInfo(EoGetWin(dsk), None, 0);
@@ -579,74 +578,87 @@
 }
 
 static void
-DeskBackgroundFree(Desk * dsk, int force)
+DeskBackgroundRefresh(Desk * dsk, int why)
 {
-   if (!dsk->bg.isset)
-      return;
-
-   dsk->bg.isset = 0;
+   Background         *bg = dsk->bg.bg;
+   Pixmap              pmap = dsk->bg.pmap;
+   unsigned long       pixel = dsk->bg.pixel;
+   int                 changed = 0;
+   int                 reconfigure = 0;
 
    if (EventDebug(EDBUG_TYPE_DESKS))
-      Eprintf("DeskBackgroundFree %d v=%d force=%d\n", dsk->num,
-             dsk->viewable, force);
+      Eprintf("DeskBackgroundRefresh %d v=%d why=%d pmap=%#lx pixel=%#lx\n",
+             dsk->num, dsk->viewable, why, pmap, pixel);
 
-   if (!dsk->viewable || force)
+   switch (why)
      {
-       if (dsk->bg.pmap != None)
-         {
-            BackgroundPixmapUnset(dsk->bg.bg, dsk->bg.pmap);
-            dsk->bg.pmap = None;
-         }
-     }
-
-   if (!dsk->viewable)
-      DeskBackgroundConfigure(dsk);
-}
+     case DESK_BG_REFRESH:
+       if (bg && dsk->viewable)
+          BackgroundTouch(bg);
+       break;
 
-static void
-DeskBackgroundRefresh(Desk * dsk)
-{
-   Background         *bg;
-   Pixmap              pmap;
-   unsigned long       pixel;
+     case DESK_BG_RECONFIGURE_ALL:
+       reconfigure = 1;
+       break;
 
-   if (!dsk->viewable)
-      return;
+     case DESK_BG_TIMEOUT:
+       if (bg && dsk->viewable)
+          BackgroundTouch(bg);
+       return;
 
-   if (EventDebug(EDBUG_TYPE_DESKS))
-      Eprintf("DeskBackgroundRefresh %d v=%d - %dx%d\n", dsk->num,
-             dsk->viewable, EoGetW(dsk), EoGetH(dsk));
+     case DESK_BG_FREE:
+       if (!bg || dsk->viewable)
+          return;
+       break;
+     }
 
-   bg = dsk->bg.bg;
    if (bg)
      {
-       pmap = BackgroundGetPixmap(bg);
-       pixel = 0;
+       if (dsk->viewable)
+         {
+            if (BackgroundGetSeqNo(bg) == dsk->bg.seq_no)
+               goto done;
 
-       if (dsk->bg.isset && dsk->bg.pmap == pmap)
-          return;
+            pmap = BackgroundGetPixmap(bg);
+            pixel = 0;
 
-       if (pmap == None)
-          BackgroundRealize(bg, EoGetWin(dsk), EoGetW(dsk), EoGetH(dsk), 1,
-                            &pmap, &pixel);
+            if (pmap == None)
+               BackgroundRealize(bg, EoGetWin(dsk), EoGetW(dsk), EoGetH(dsk),
+                                 1, &pmap, &pixel);
+            if (pmap != None)
+               BackgroundPixmapSet(bg, pmap);
 
-       if (pmap != None && pmap != dsk->bg.pmap)
-          BackgroundPixmapSet(dsk->bg.bg, pmap);
+            dsk->bg.seq_no = BackgroundGetSeqNo(bg);
+            changed = 1;
+         }
+       else
+         {
+            if (dsk->bg.pmap == None)
+               return;
+
+            pmap = None;
+            pixel = 0;
+            dsk->bg.seq_no = 0;
+         }
+     }
+   else
+     {
+       pmap = (Mode.root.ext_pmap_valid) ? Mode.root.ext_pmap : None;
+       pixel = 0;
+       changed = pmap != dsk->bg.pmap_set;
+     }
 
-       dsk->bg.pmap = pmap;
+ done:
+   dsk->bg.pmap = pmap;
+   if (reconfigure || pmap != dsk->bg.pmap_set || pixel != dsk->bg.pixel)
+     {
        dsk->bg.pixel = pixel;
+       DeskBackgroundConfigure(dsk);
+       dsk->bg.pmap_set = pmap;
      }
-   dsk->bg.isset = 1;
-   DeskBackgroundConfigure(dsk);
-}
 
-static void
-DeskBackgroundUpdate(Desk * dsk)
-{
-   if (dsk->viewable)
-      DeskBackgroundRefresh(dsk);
-   else
-      DeskBackgroundFree(dsk, 0);
+   if (changed)
+      ModulesSignal(ESIGNAL_BACKGROUND_CHANGE, dsk);
 }
 
 void
@@ -660,7 +672,6 @@
 
    if (dsk->bg.bg != bg)
      {
-       DeskBackgroundFree(dsk, 1);
        if (dsk->bg.bg)
           BackgroundDecRefcount(dsk->bg.bg);
        if (bg)
@@ -669,29 +680,11 @@
 
    dsk->bg.bg = bg;
 
-   if (dsk->viewable)
-      DeskBackgroundRefresh(dsk);
-
-   ModulesSignal(ESIGNAL_BACKGROUND_CHANGE, dsk);
-}
-
-void
-DesksBackgroundFree(Background * bg, int force)
-{
-   Desk               *dsk;
-   unsigned int        i;
-
-   for (i = 0; i < Conf.desks.num; i++)
-     {
-       dsk = _DeskGet(i);
-       if (dsk->bg.bg != bg)
-          continue;
-       DeskBackgroundFree(dsk, force);
-     }
+   DeskBackgroundRefresh(dsk, DESK_BG_REFRESH);
 }
 
 void
-DesksBackgroundRefresh(Background * bg)
+DesksBackgroundRefresh(Background * bg, int why)
 {
    Desk               *dsk;
    unsigned int        i;
@@ -699,13 +692,11 @@
    for (i = 0; i < Conf.desks.num; i++)
      {
        dsk = _DeskGet(i);
-       if (!dsk)
+       if (!dsk)               /* May happen during init */
           continue;
-       if (bg && dsk->bg.bg != bg)
+       if (dsk->bg.bg != bg && why == DESK_BG_REFRESH)
           continue;
-       if (!bg && dsk->viewable)       /* CM start/stop hack */
-          dsk->bg.isset = 0;
-       DeskBackgroundUpdate(dsk);
+       DeskBackgroundRefresh(dsk, why);
      }
 }
 
@@ -726,9 +717,9 @@
        x = (dsk->viewable) ? EoGetX(dsk) : VRoot.w;
        EoMoveResize(dsk, x, 0, w, h);
      }
-   if (dsk->bg.o && dsk->bg.o != EoObj(dsk))
-      EobjMoveResize(dsk->bg.o, 0, 0, w, h);
-   DeskBackgroundUpdate(dsk);
+   if (dsk->bg.o_bg)
+      EobjMoveResize(dsk->bg.o_bg, 0, 0, w, h);
+   DeskBackgroundRefresh(dsk, DESK_BG_REFRESH);
    DeskControlsDestroy(dsk, 1);
    DeskControlsCreate(dsk);
    DeskControlsShow(dsk, 1);
@@ -777,12 +768,6 @@
    dsk->current_area_y = ay;
 }
 
-int
-DeskIsViewable(const Desk * dsk)
-{
-   return dsk->viewable;
-}
-
 void
 DeskSetDirtyStack(Desk * dsk, EObj * eo)
 {
@@ -1110,7 +1095,8 @@
             if (!dd->viewable && v)
               {
                  dd->viewable = 1;
-                 DeskBackgroundRefresh(_DeskGet(desks.order[i]));
+                 DeskBackgroundRefresh(_DeskGet(desks.order[i]),
+                                       DESK_BG_REFRESH);
               }
             else if (dd->viewable && !v)
               {
@@ -1162,7 +1148,7 @@
    EGrabServer();
 
    dsk->viewable = 1;
-   DeskBackgroundRefresh(dsk);
+   DeskBackgroundRefresh(dsk, DESK_BG_REFRESH);
    MoveToDeskTop(dsk);
 
    desks.previous = desks.current = dsk;
@@ -1303,7 +1289,7 @@
    dsk = _DeskGet(desk);
 
    dsk->viewable = 1;
-   DeskBackgroundRefresh(dsk);
+   DeskBackgroundRefresh(dsk, DESK_BG_REFRESH);
 }
 
 static void
@@ -1377,7 +1363,7 @@
    dsk = _DeskGet(desk);
 
    dsk->viewable = 1;
-   DeskBackgroundRefresh(dsk);
+   DeskBackgroundRefresh(dsk, DESK_BG_REFRESH);
    MoveToDeskTop(desk);
 
    if (desk == 0)
@@ -1958,6 +1944,39 @@
 }
 
 static void
+DeskPropertyChange(Desk * dsk, XEvent * ev)
+{
+   Pixmap              pmap;
+
+   if (ev->xproperty.atom == E_XROOTPMAP_ID)
+     {
+       /* Possible race here? */
+       pmap = HintsGetRootPixmap(ev->xany.window);
+       if (EventDebug(EDBUG_TYPE_DESKS))
+          Eprintf("DeskPropertyChange win=%#lx _XROOTPMAP_ID=%#lx\n",
+                  ev->xany.window, pmap);
+       if (ev->xany.window != VRoot.win)
+          return;
+       dsk->bg.pmap_set = pmap;
+       if (pmap == dsk->bg.pmap)
+          return;
+       if (pmap == Mode.root.ext_pmap)
+          return;
+       Mode.root.ext_pmap = pmap;
+       Mode.root.ext_pmap_valid = EDrawableCheck(pmap, 0);
+       DesksBackgroundRefresh(NULL, DESK_BG_REFRESH);
+     }
+   else if (ev->xproperty.atom == E_XROOTCOLOR_PIXEL)
+     {
+       if (EventDebug(EDBUG_TYPE_DESKS))
+          Eprintf("DeskPropertyChange win=%#lx _XROOTCOLOR_PIXEL\n",
+                  ev->xany.window);
+       if (ev->xany.window != VRoot.win)
+          return;
+     }
+}
+
+static void
 DeskHandleEvents(XEvent * ev, void *prm)
 {
    Desk               *dsk = (Desk *) prm;
@@ -1988,6 +2007,11 @@
           DeskRootResize(0, ev->xconfigure.width, ev->xconfigure.height);
        break;
 
+     case PropertyNotify:
+       if (ev->xany.window == VRoot.win)
+          DeskPropertyChange(dsk, ev);
+       break;
+
 #if USE_XRANDR
      case EX_EVENT_SCREEN_CHANGE_NOTIFY:
        {
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/desktops.h,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -3 -r1.22 -r1.23
--- desktops.h  14 Jan 2006 14:30:51 -0000      1.22
+++ desktops.h  27 Feb 2006 19:14:25 -0000      1.23
@@ -24,9 +24,14 @@
 #ifndef _DESKTOPS_H_
 #define _DESKTOPS_H_
 
+#include "eobj.h"
+
 #define USE_BG_WIN_ON_ALL_DESKS 0
 
-#include "eobj.h"
+#define DESK_BG_REFRESH         1
+#define DESK_BG_FREE            2
+#define DESK_BG_TIMEOUT         3
+#define DESK_BG_RECONFIGURE_ALL 4
 
 typedef struct _desk Desk;
 
@@ -47,9 +52,11 @@
    {
       struct _background *bg;
       EObj               *o;
+      EObj               *o_bg;
       Pixmap              pmap;
+      Pixmap              pmap_set;
       unsigned long       pixel;
-      char                isset;
+      unsigned int        seq_no;
    } bg;
    struct
    {
@@ -64,7 +71,6 @@
 Desk               *DeskGetRelative(Desk * dsk, int inc);
 void                DeskGetArea(const Desk * dsk, int *ax, int *ay);
 void                DeskSetArea(Desk * dsk, int ax, int ay);
-int                 DeskIsViewable(const Desk * dsk);
 void                DeskSetDirtyStack(Desk * dsk, EObj * eo);
 void                DeskGoto(Desk * dsk);
 void                DeskGotoNum(unsigned int desk);
@@ -76,8 +82,7 @@
 struct _background *DeskBackgroundGet(const Desk * dsk);
 void                DeskBackgroundSet(Desk * dsk, struct _background *bg);
 
-void                DesksBackgroundFree(struct _background *bg, int force);
-void                DesksBackgroundRefresh(struct _background *bg);
+void                DesksBackgroundRefresh(struct _background *bg, int what);
 
 void                DeskCurrentGetArea(int *ax, int *ay);
 void                DeskCurrentGotoArea(int ax, int ay);
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/ecompmgr.c,v
retrieving revision 1.97
retrieving revision 1.98
diff -u -3 -r1.97 -r1.98
--- ecompmgr.c  12 Feb 2006 17:01:32 -0000      1.97
+++ ecompmgr.c  27 Feb 2006 19:14:25 -0000      1.98
@@ -498,13 +498,11 @@
    eo = dsk->bg.o;
    if (!eo)
       return 1;
-   cw = eo->cmhook;
 
-   if (!dsk->viewable)
-     {
-       ECompMgrWinInvalidate(eo, INV_PICTURE);
-       return 1;
-     }
+   ECompMgrWinInvalidate(eo, INV_PICTURE);
+
+   if (!dsk->viewable && dsk->bg.bg)
+      return 1;
 
    if (dsk->bg.pmap == None)
      {
@@ -523,8 +521,6 @@
        pmap = dsk->bg.pmap;
      }
 
-   ECompMgrWinInvalidate(eo, INV_PICTURE);
-
    pa.repeat = True;
    pictfmt = XRenderFindVisualFormat(disp, VRoot.vis);
    pict = XRenderCreatePicture(disp, pmap, pictfmt, CPRepeat, &pa);
@@ -535,6 +531,7 @@
    /* New background, all must be repainted */
    ECompMgrDamageAll();
 
+   cw = eo->cmhook;
    cw->picture = pict;
 
    D1printf
@@ -2173,6 +2170,12 @@
 #define ECompMgrShadowsInit(mode, cleanup)
 #endif
 
+int
+ECompMgrIsActive(void)
+{
+   return Mode_compmgr.active;
+}
+
 static void
 ECompMgrStart(void)
 {
@@ -2226,7 +2229,7 @@
      }
 
 #if !USE_BG_WIN_ON_ALL_DESKS
-   DesksBackgroundRefresh(NULL);
+   DesksBackgroundRefresh(NULL, DESK_BG_RECONFIGURE_ALL);
 #endif
    _ECM_SET_CLIP_CHANGED();
    EUngrabServer();
@@ -2287,7 +2290,7 @@
    EventCallbackUnregister(VRoot.win, 0, ECompMgrHandleRootEvent, NULL);
 
 #if !USE_BG_WIN_ON_ALL_DESKS
-   DesksBackgroundRefresh(NULL);
+   DesksBackgroundRefresh(NULL, DESK_BG_RECONFIGURE_ALL);
 #endif
    EUngrabServer();
    ESync();
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/ecompmgr.h,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -3 -r1.25 -r1.26
--- ecompmgr.h  7 Jan 2006 07:20:58 -0000       1.25
+++ ecompmgr.h  27 Feb 2006 19:14:25 -0000      1.26
@@ -39,6 +39,7 @@
 
 int                 EVisualIsARGB(Visual * vis);
 
+int                 ECompMgrIsActive(void);
 int                 ECompMgrDeskConfigure(struct _desk *dsk);
 
 void                ECompMgrWinNew(EObj * eo);
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/hints.c,v
retrieving revision 1.61
retrieving revision 1.62
diff -u -3 -r1.61 -r1.62
--- hints.c     20 Feb 2006 21:53:39 -0000      1.61
+++ hints.c     27 Feb 2006 19:14:25 -0000      1.62
@@ -76,7 +76,8 @@
        HintsSetWindowClass(VRoot.win, "Virtual-Root", "Enlightenment");
      }
 
-   Mode.hints.old_root_pmap = HintsGetRootPixmap(VRoot.win);
+   Mode.root.ext_pmap = HintsGetRootPixmap(VRoot.win);
+   Mode.root.ext_pmap_valid = EDrawableCheck(Mode.root.ext_pmap, 0);
 }
 
 void
@@ -426,6 +427,12 @@
    ecore_x_window_prop_card32_set(VRoot.win, ENL_INTERNAL_DESK_DATA, c, 1);
 
    Efree(c);
+
+   if (Mode.root.ext_pmap_valid)
+     {
+       HintsSetRootInfo(VRoot.win, Mode.root.ext_pmap, 0);
+       ESetWindowBackgroundPixmap(VRoot.win, Mode.root.ext_pmap);
+     }
 }
 
 void
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/pager.c,v
retrieving revision 1.196
retrieving revision 1.197
diff -u -3 -r1.196 -r1.197
--- pager.c     19 Feb 2006 22:25:27 -0000      1.196
+++ pager.c     27 Feb 2006 19:14:25 -0000      1.197
@@ -536,7 +536,7 @@
    pmap = p->bgpmap = ECreatePixmap(p->win, p->dw, p->dh, VRoot.depth);
 
    bg = DeskBackgroundGet(p->dsk);
-   if (bg)
+   if (Conf_pagers.snap && bg)
      {
 #if USE_PAGER_BACKGROUND_CACHE
        char                s[4096];
@@ -572,6 +572,13 @@
        return;
      }
 
+   if (Conf_pagers.snap && p->dsk->bg.pmap)
+     {
+       ScaleRect(p->dsk->bg.pmap, pmap, NULL, 0, 0, VRoot.w, VRoot.h, 0,
+                 0, p->dw, p->dh, Conf_pagers.hiq);
+       return;
+     }
+
    ic = ImageclassFind("PAGER_BACKGROUND", 0);
    if (ic)
      {
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/x.c,v
retrieving revision 1.118
retrieving revision 1.119
diff -u -3 -r1.118 -r1.119
--- x.c 18 Feb 2006 09:50:17 -0000      1.118
+++ x.c 27 Feb 2006 19:14:25 -0000      1.119
@@ -892,6 +892,9 @@
 {
    int                 ok;
 
+   if (draw == None)
+      return 0;
+
    if (grab)
       EGrabServer();
 




-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to