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