Enlightenment CVS committal

Author  : kwo
Project : e16
Module  : e

Dir     : e16/e/src


Modified Files:
      Tag: branch-exp
        E.h ecompmgr.c eobj.c ewins.c icccm.c main.c stacking.c 
Added Files:
      Tag: branch-exp
        ecompmgr.h 


Log Message:
Keep track of override-redirect windows.
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/E.h,v
retrieving revision 1.314.2.66
retrieving revision 1.314.2.67
diff -u -3 -r1.314.2.66 -r1.314.2.67
--- E.h 5 Dec 2004 11:07:20 -0000       1.314.2.66
+++ E.h 5 Dec 2004 12:27:32 -0000       1.314.2.67
@@ -546,18 +546,20 @@
 {
    Window              win;    /* The top level window */
    short               type;   /* Ewin, button, other, ... */
-   short               ilayer; /* Internal tacking layer */
+   short               ilayer; /* Internal stacking layer */
    short               layer;  /* Stacking layer */
    short               desk;   /* Belongs on desk */
    char                sticky:1;
    char                floating;
    int                 x, y;
    int                 w, h;
+   char               *name;   /* Debug only */
 };
 
 #define EOBJ_TYPE_EWIN      0
 #define EOBJ_TYPE_BUTTON    1
-#define EOBJ_TYPE_OTHER     2
+#define EOBJ_TYPE_OVERR     2
+#define EOBJ_TYPE_OTHER     3
 
 #define EoGetWin(eo)            ((eo)->o.win)
 #define EoGetType(eo)           ((eo)->o.type)
@@ -1568,6 +1570,10 @@
 void                EdgeWindowsHide(void);
 
 /* eobj.c */
+EObj               *EobjCreate(Window win);
+void                EobjDestroy(EObj * eo);
+void                EobjRegister(Window win);
+void                EobjUnregister(Window win);
 const char         *EobjGetName(const EObj * eo);
 int                 EobjGetDesk(const EObj * eo);
 int                 EobjSetDesk(EObj * eo, int desk);
@@ -1909,6 +1915,7 @@
 void                ICCCM_SetMainEInfo(void);
 void                ICCCM_GetMainEInfo(void);
 void                ICCCM_SetEInfoOnAll(void);
+char               *e16_icccm_name_get(Window win);
 
 /* iclass.c */
 int                 ImageclassConfigLoad(FILE * fs);
@@ -2145,6 +2152,7 @@
 int                 EobjListFocusRaise(EObj * eo);
 int                 EobjListStackLower(EObj * eo);
 int                 EobjListFocusLower(EObj * eo);
+EObj               *EobjListStackFind(Window win);
 EObj               *const *EobjListStackGet(int *num);
 EObj               *const *EobjListStackGetForDesk(int *num, int desk);
 EWin               *const *EwinListStackGet(int *num);
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/Attic/ecompmgr.c,v
retrieving revision 1.1.2.5
retrieving revision 1.1.2.6
diff -u -3 -r1.1.2.5 -r1.1.2.6
--- ecompmgr.c  27 Oct 2004 23:32:52 -0000      1.1.2.5
+++ ecompmgr.c  5 Dec 2004 12:27:33 -0000       1.1.2.6
@@ -56,6 +56,7 @@
  * Initially adapted for E16 by Kim Woelders.
  */
 #include "E.h"
+#include "ecompmgr.h"
 
 #include <stdlib.h>
 #include <stdio.h>
@@ -153,6 +154,7 @@
 
 static struct
 {
+   char               *args;
    int                 mode;
 #if ENABLE_SHADOWS
    int                 shadow;
@@ -1943,6 +1945,7 @@
        ECompMgrWinDel(_GET_WIN(ev->xdestroywindow.window), True, True);
        EventCallbackUnregister(ev->xcreatewindow.window, 0,
                                ECompMgrHandleWindowEvent, NULL);
+       EobjUnregister(ev->xmap.window);
        break;
 
      case ReparentNotify:
@@ -1961,6 +1964,7 @@
        break;
 
      case MapNotify:
+       EobjRegister(ev->xmap.window);
        ECompMgrWinMap(_GET_WIN(ev->xmap.window), ev->xmap.serial, True);
        break;
      case UnmapNotify:
@@ -1983,6 +1987,12 @@
      }
 }
 
+void
+ECompMgrParseArgs(const char *args)
+{
+   Conf_compmgr.args = Estrdup(args);
+}
+
 static void
 ECompMgrInit(void)
 {
@@ -1991,9 +2001,30 @@
    if (!XDamageQueryExtension(disp, &events, &errors))
      {
        Conf_compmgr.mode = ECOMPMGR_MODE_OFF;
-       return;
+       goto done;
      }
 
+   if (Conf_compmgr.args)
+     {
+       switch (Conf_compmgr.args[0])
+         {
+         case '0':
+            Conf_compmgr.mode = ECOMPMGR_MODE_OFF;
+            break;
+         case '1':
+            Conf_compmgr.mode = ECOMPMGR_MODE_ROOT;
+            break;
+         case '2':
+            Conf_compmgr.mode = ECOMPMGR_MODE_WINDOW;
+            break;
+         case '3':
+            Conf_compmgr.mode = ECOMPMGR_MODE_AUTO;
+            break;
+         }
+       _EFREE(Conf_compmgr.args);
+     }
+
+ done:
    D1printf("ECompMgrInit: mode=%d\n", Conf_compmgr.mode);
 }
 
@@ -2004,13 +2035,15 @@
    EWin               *ewin;
 #endif
 
-   if (Conf_compmgr.mode == ECOMPMGR_MODE_OFF)
+   if (sig != ESIGNAL_INIT && Conf_compmgr.mode == ECOMPMGR_MODE_OFF)
       return;
 
    switch (sig)
      {
      case ESIGNAL_INIT:
        ECompMgrInit();
+       if (Conf_compmgr.mode == ECOMPMGR_MODE_OFF)
+          break;
        ECompMgrStart();
        EventCallbackRegister(VRoot.win, 0, ECompMgrHandleRootEvent, NULL);
        break;
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/Attic/eobj.c,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -u -3 -r1.1.2.1 -r1.1.2.2
--- eobj.c      30 Nov 2004 23:31:52 -0000      1.1.2.1
+++ eobj.c      5 Dec 2004 12:27:33 -0000       1.1.2.2
@@ -33,6 +33,8 @@
        return EwinGetTitle((EWin *) eo);
      case EOBJ_TYPE_BUTTON:
        return ButtonGetName((Button *) eo);
+     case EOBJ_TYPE_OVERR:
+       return eo->name;
      }
 }
 
@@ -83,7 +85,8 @@
     *  75: Above buttons
     *  80: Ontop ewins
     *  95: Floating ewins
-    * 990: E-Menus
+    * 200: E-Menus
+    * 800: Override redirect
     */
    switch (eo->type)
      {
@@ -102,8 +105,79 @@
        if (eo->layer > 0 && eo->sticky)
           eo->floating = 1;
        break;
+     case EOBJ_TYPE_OVERR:
      case EOBJ_TYPE_OTHER:
        eo->ilayer = 10 * eo->layer;
        break;
      }
 }
+
+EObj               *
+EobjCreate(Window win)
+{
+   EObj               *eo;
+   XWindowAttributes   attr;
+
+   if (!XGetWindowAttributes(disp, win, &attr))
+      return NULL;
+   if (!attr.override_redirect)
+      return NULL;
+
+   eo = Ecalloc(1, sizeof(EObj));
+
+   eo->win = win;
+
+   eo->type = EOBJ_TYPE_OVERR;
+   eo->x = attr.x;
+   eo->x = attr.y;
+   eo->w = attr.width;
+   eo->h = attr.height;
+
+   return eo;
+}
+
+void
+EobjDestroy(EObj * eo)
+{
+   _EFREE(eo->name);
+   Efree(eo);
+}
+
+void
+EobjRegister(Window win)
+{
+   EObj               *eo;
+
+   eo = EobjListStackFind(win);
+   if (eo)
+      return;
+
+   eo = EobjCreate(win);
+   if (!eo)
+      return;
+
+   eo->name = e16_icccm_name_get(win);
+
+   if (EventDebug(EDBUG_TYPE_EWINS))
+      Eprintf("EobjRegister: %#lx %s\n", win, eo->name);
+
+   EobjSetLayer(eo, 80);
+   EobjListStackAdd(eo, 1);
+}
+
+void
+EobjUnregister(Window win)
+{
+   EObj               *eo;
+
+   eo = EobjListStackFind(win);
+   if (!eo)
+      return;
+   if (eo->type != EOBJ_TYPE_OVERR)
+      return;
+
+   if (EventDebug(EDBUG_TYPE_EWINS))
+      Eprintf("EobjUnregister: %#lx %s\n", win, eo->name);
+
+   EobjListStackDel(eo);
+}
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/Attic/ewins.c,v
retrieving revision 1.1.2.32
retrieving revision 1.1.2.33
diff -u -3 -r1.1.2.32 -r1.1.2.33
--- ewins.c     30 Nov 2004 23:31:52 -0000      1.1.2.32
+++ ewins.c     5 Dec 2004 12:27:33 -0000       1.1.2.33
@@ -552,7 +552,7 @@
        EoSetLayer(ewin, 6);
        break;
      case EWIN_TYPE_MENU:
-       EoSetLayer(ewin, 99);
+       EoSetLayer(ewin, 20);
        ewin->skiptask = 1;
        ewin->skip_ext_pager = 1;
        ewin->no_actions = 1;
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/icccm.c,v
retrieving revision 1.76.2.14
retrieving revision 1.76.2.15
diff -u -3 -r1.76.2.14 -r1.76.2.15
--- icccm.c     23 Nov 2004 23:46:28 -0000      1.76.2.14
+++ icccm.c     5 Dec 2004 12:27:33 -0000       1.76.2.15
@@ -95,20 +95,13 @@
      }
 }
 
-void
-ICCCM_GetTitle(EWin * ewin, Atom atom_change)
+char               *
+e16_icccm_name_get(Window win)
 {
+   char               *name;
    XTextProperty       xtp;
 
-   EDBUG(6, "ICCCM_GetTitle");
-
-   if (atom_change && atom_change != E_XA_WM_NAME)
-      EDBUG_RETURN_;
-
-   if (ewin->icccm.wm_name)
-      Efree(ewin->icccm.wm_name);
-
-   if (XGetWMName(disp, ewin->client.win, &xtp))
+   if (XGetWMName(disp, win, &xtp))
      {
        int                 items;
        char              **list;
@@ -119,25 +112,40 @@
             s = XmbTextPropertyToTextList(disp, &xtp, &list, &items);
             if ((s == Success) && (items > 0))
               {
-                 ewin->icccm.wm_name = Estrdup(*list);
+                 name = Estrdup(*list);
                  XFreeStringList(list);
               }
             else
               {
-                 ewin->icccm.wm_name = Estrdup((char *)xtp.value);
+                 name = Estrdup((char *)xtp.value);
               }
          }
        else
          {
-            ewin->icccm.wm_name = Estrdup((char *)xtp.value);
+            name = Estrdup((char *)xtp.value);
          }
        XFree(xtp.value);
      }
-   else if (!EwinIsInternal(ewin))
+   else
      {
-       ewin->icccm.wm_name = Estrdup("No Title");
+       name = Estrdup("None");
      }
 
+   return name;
+}
+
+void
+ICCCM_GetTitle(EWin * ewin, Atom atom_change)
+{
+   EDBUG(6, "ICCCM_GetTitle");
+
+   if (atom_change && atom_change != E_XA_WM_NAME)
+      EDBUG_RETURN_;
+
+   _EFREE(ewin->icccm.wm_name);
+
+   ewin->icccm.wm_name = e16_icccm_name_get(ewin->client.win);
+
    EwinChange(ewin, EWIN_CHANGE_NAME);
 
    EDBUG_RETURN_;
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/main.c,v
retrieving revision 1.99.2.29
retrieving revision 1.99.2.30
diff -u -3 -r1.99.2.29 -r1.99.2.30
--- main.c      19 Nov 2004 21:02:27 -0000      1.99.2.29
+++ main.c      5 Dec 2004 12:27:33 -0000       1.99.2.30
@@ -25,6 +25,9 @@
 #include <sys/utsname.h>
 #include <signal.h>
 #include <time.h>
+#ifdef USE_COMPOSITE
+#include "ecompmgr.h"
+#endif
 
 const char          e_wm_name[] = "Enlightenment";
 const char          e_wm_version[] =
@@ -193,6 +196,12 @@
          {
             Mode.debug++;
          }
+#if USE_COMPOSITE
+       else if ((!strcmp("-C", argv[i])))
+         {
+            ECompMgrParseArgs(argv[++i]);
+         }
+#endif
      }
 
    /* run most of the setup */
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/stacking.c,v
retrieving revision 1.12.2.4
retrieving revision 1.12.2.5
diff -u -3 -r1.12.2.4 -r1.12.2.5
--- stacking.c  30 Nov 2004 23:31:53 -0000      1.12.2.4
+++ stacking.c  5 Dec 2004 12:27:33 -0000       1.12.2.5
@@ -203,6 +203,18 @@
    return n;
 }
 
+static EObj        *
+EobjListFind(const EobjList * ewl, Window win)
+{
+   int                 i;
+
+   for (i = 0; i < ewl->nwins; i++)
+      if (ewl->list[i]->win == win)
+        return ewl->list[i];
+
+   return NULL;
+}
+
 static int
 EobjListTypeCount(const EobjList * ewl, int type)
 {
@@ -228,6 +240,12 @@
    return ewl->list;
 }
 
+EObj               *
+EobjListStackFind(Window win)
+{
+   return EobjListFind(&EwinListStack, win);
+}
+
 EObj               *const *
 EobjListStackGet(int *num)
 {




-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now. 
http://productguide.itmanagersjournal.com/
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to