Enlightenment CVS committal Author : kwo Project : e16 Module : e
Dir : e16/e/src Modified Files: Tag: branch-exp E.h buttons.c ecompmgr.c ecompmgr.h eobj.c ewin-ops.c ewins.c ewmh.c ipc.c Log Message: Use object stack in composite manager. =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/E.h,v retrieving revision 1.314.2.67 retrieving revision 1.314.2.68 diff -u -3 -r1.314.2.67 -r1.314.2.68 --- E.h 5 Dec 2004 12:27:32 -0000 1.314.2.67 +++ E.h 9 Dec 2004 21:40:40 -0000 1.314.2.68 @@ -554,6 +554,10 @@ int x, y; int w, h; char *name; /* Debug only */ +#if USE_COMPOSITE + unsigned int opacity; + void *cmhook; +#endif }; #define EOBJ_TYPE_EWIN 0 @@ -582,6 +586,7 @@ #define EoSetFloating(eo, _x) (eo)->o.floating = (_x) #define EoSetDesk(eo, _d) EobjSetDesk(&((eo)->o), (_d)) #define EoSetLayer(eo, _l) EobjSetLayer(&((eo)->o), (_l)) +#define EoSetOpacity(eo, _o) (eo)->o.opacity = (_o) typedef struct _constraints { @@ -787,7 +792,6 @@ void (*MoveResize) (EWin * ewin, int resize); void (*Refresh) (EWin * ewin); void (*Close) (EWin * ewin); - void *cmhook; }; typedef struct _groupconfig @@ -1572,7 +1576,7 @@ /* eobj.c */ EObj *EobjCreate(Window win); void EobjDestroy(EObj * eo); -void EobjRegister(Window win); +EObj *EobjRegister(Window win); void EobjUnregister(Window win); const char *EobjGetName(const EObj * eo); int EobjGetDesk(const EObj * eo); @@ -1695,6 +1699,7 @@ void EwinOpShade(EWin * ewin, int on); void EwinOpSetLayer(EWin * ewin, int layer); void EwinOpSetBorder(EWin * ewin, const char *name); +void EwinOpSetOpacity(EWin * ewin, int opacity); void EwinOpMoveToDesk(EWin * ewin, int desk); void EwinOpMoveToArea(EWin * ewin, int x, int y); =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/buttons.c,v retrieving revision 1.36.2.18 retrieving revision 1.36.2.19 diff -u -3 -r1.36.2.18 -r1.36.2.19 --- buttons.c 30 Nov 2004 23:31:51 -0000 1.36.2.18 +++ buttons.c 9 Dec 2004 21:40:41 -0000 1.36.2.19 @@ -84,9 +84,10 @@ if (desk < 0 || desk >= DesksGetNumber()) return NULL; + if (sticky && ontop == 1) + desk = 0; b = Ecalloc(1, sizeof(Button)); - EoSetType(b, EOBJ_TYPE_BUTTON); b->name = Estrdup(name); b->label = Estrdup(label); @@ -110,11 +111,6 @@ b->label = label; b->flags = flags; - EoSetSticky(b, sticky); - if (sticky && ontop == 1) - desk = 0; - EoSetDesk(b, desk); - EoSetLayer(b, ontop); b->visible = 0; b->geom.width.min = minw; b->geom.width.max = maxw; @@ -138,13 +134,6 @@ b->default_show = 1; b->used = 0; b->left = 0; - EoSetWin(b, ECreateWindow(DeskGetWin(desk), -100, -100, 50, 50, 0)); - XSelectInput(disp, EoGetWin(b), BUTTON_EVENT_MASK); - EventCallbackRegister(EoGetWin(b), 0, ButtonHandleEvents, b); - EoSetX(b, -1); - EoSetY(b, -1); - EoSetW(b, -1); - EoSetH(b, -1); b->cx = -10; b->cy = -10; b->cw = -10; @@ -153,8 +142,23 @@ b->expose = 0; b->ref_count = 0; + EoSetWin(b, ECreateWindow(DeskGetWin(desk), -100, -100, 50, 50, 0)); + XSelectInput(disp, EoGetWin(b), BUTTON_EVENT_MASK); + EventCallbackRegister(EoGetWin(b), 0, ButtonHandleEvents, b); + + EoSetType(b, EOBJ_TYPE_BUTTON); + EoSetX(b, -1); + EoSetY(b, -1); + EoSetW(b, -1); + EoSetH(b, -1); + EoSetSticky(b, sticky); + EoSetDesk(b, desk); + EoSetLayer(b, ontop); + EoSetOpacity(b, 0xFFFFFFFF); + EobjListStackAdd(&b->o, 0); EwinListStackRaise(b); + AddItem(b, b->name, id, LIST_TYPE_BUTTON); EDBUG_RETURN(b); =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/Attic/ecompmgr.c,v retrieving revision 1.1.2.6 retrieving revision 1.1.2.7 diff -u -3 -r1.1.2.6 -r1.1.2.7 --- ecompmgr.c 5 Dec 2004 12:27:33 -0000 1.1.2.6 +++ ecompmgr.c 9 Dec 2004 21:40:41 -0000 1.1.2.7 @@ -80,8 +80,6 @@ #define CAN_DO_USABLE 0 -#define USE_MOSTLY_ROOT_EVENTS 1 - #define ENABLE_SHADOWS 1 #define ENABLE_FADING 0 @@ -104,12 +102,10 @@ extern Atom _NET_WM_WINDOW_OPACITY; -typedef struct _Win ECmWinInfo; /* TBD */ +typedef struct _ecmwininfo ECmWinInfo; /* TBD */ -typedef struct _Win +struct _ecmwininfo { - struct _Win *next; - Window id; #if HAS_NAME_WINDOW_PIXMAP Pixmap pixmap; #endif @@ -140,8 +136,7 @@ /* for drawing translucent windows */ XserverRegion borderClip; - struct _Win *prev_trans; -} Win; +}; #if ENABLE_SHADOWS typedef enum _compMode @@ -171,8 +166,6 @@ char active; } Mode_compmgr; -static Win *list; - static Picture rootPicture; static Picture rootBuffer; @@ -184,7 +177,6 @@ static Bool hasNamePixmap; #endif -#define TRANSLUCENT 0xe0000000 #define OPAQUE 0xffffffff #define WINDOW_SOLID 0 @@ -193,8 +185,9 @@ #define TRANS_OPACITY 0.75 -static void restack_win(Win * w, Window new_above); static void ECompMgrDamageMerge(XserverRegion damage, int destroy); +static void ECompMgrHandleWindowEvent(XEvent * ev, void *prm); +static void ECompMgrWinNew(EObj * eo); static void ESelectInputAdd(Display * dpy, Window win, long mask) @@ -404,10 +397,10 @@ typedef struct _fade { struct _fade *next; - Win *w; + EObj *eo; double cur; double step; - void (*callback) (Display * dpy, Win * w, Bool gone); + void (*callback) (Display * dpy, EObj * eo, Bool gone); Display *dpy; Bool gone; } fade; @@ -429,16 +422,16 @@ } static fade * -find_fade(Win * w) +find_fade(EObj * eo) { fade *f; for (f = fades; f; f = f->next) { - if (f->w == w) + if (f->eo == eo) return f; } - return 0; + return NULL; } static void @@ -451,16 +444,16 @@ { *prev = f->next; if (f->callback) - (*f->callback) (dpy, f->w, f->gone); + (*f->callback) (dpy, f->eo, f->gone); free(f); break; } } static void -cleanup_fade(Display * dpy, Win * w) +cleanup_fade(Display * dpy, EObj * eo) { - fade *f = find_fade(w); + fade *f = find_fade(eo); if (f) dequeue_fade(dpy, f); @@ -476,17 +469,17 @@ } static void -set_fade(Display * dpy, Win * w, Bool in, - void (*callback) (Display * dpy, Win * w, Bool gone), Bool gone) +set_fade(Display * dpy, EObj * eo, Bool in, + void (*callback) (Display * dpy, EObj * eo, Bool gone), Bool gone) { fade *f; - f = find_fade(w); + f = find_fade(eo); if (!f) { f = malloc(sizeof(fade)); f->next = 0; - f->w = w; + f->eo = eo; if (in) f->cur = 0; else @@ -500,7 +493,7 @@ f->callback = callback; f->gone = gone; - ECompMgrWinChangeOpacity(w, f->cur * OPAQUE); + ECompMgrWinChangeOpacity(eo, f->cur * OPAQUE); } static int @@ -534,8 +527,6 @@ steps = 1 + (now - fade_time) / fade_delta; for (next = fades; (f = next);) { - Win *w = f->w; - next = f->next; f->cur += f->step * steps; if (f->cur >= 1) @@ -554,7 +545,7 @@ dequeue_fade(dpy, f); } - ECompMgrWinChangeOpacity(w, f->cur * OPAQUE); + ECompMgrWinChangeOpacity(f->eo, f->cur * OPAQUE); } fade_time = now + fade_delta; } @@ -819,10 +810,23 @@ */ static XserverRegion -win_extents(Display * dpy, Win * w) +win_extents(Display * dpy, EObj * eo) { + ECmWinInfo *w = eo->cmhook; XRectangle r; +#if HAS_NAME_WINDOW_PIXMAP + w->rcx = w->a.x; + w->rcy = w->a.y; + w->rcw = w->a.width + w->a.border_width * 2; + w->rch = w->w->a.height + w->a.border_width * 2; +#else + w->rcx = w->a.x + w->a.border_width; + w->rcy = w->a.y + w->a.border_width; + w->rcw = w->a.width; + w->rch = w->a.height; +#endif + r.x = w->a.x; r.y = w->a.y; r.width = w->a.width + w->a.border_width * 2; @@ -881,28 +885,29 @@ } #endif - D2printf("win_extents %#lx %d %d %d %d\n", w->id, r.x, r.y, r.width, + D2printf("win_extents %#lx %d %d %d %d\n", eo->win, r.x, r.y, r.width, r.height); return XFixesCreateRegion(dpy, &r, 1); } static XserverRegion -border_size(Display * dpy, Win * w) +border_size(EObj * eo) { + ECmWinInfo *w = eo->cmhook; XserverRegion border; - set_ignore(dpy, NextRequest(dpy)); - border = XFixesCreateRegionFromWindow(dpy, w->id, WindowRegionBounding); + set_ignore(disp, NextRequest(disp)); + border = XFixesCreateRegionFromWindow(disp, eo->win, WindowRegionBounding); /* translate this */ - set_ignore(dpy, NextRequest(dpy)); - XFixesTranslateRegion(dpy, border, + set_ignore(disp, NextRequest(disp)); + XFixesTranslateRegion(disp, border, w->a.x + w->a.border_width, w->a.y + w->a.border_width); D2printf("border_size %#lx: %d %d\n", - w->id, w->a.x + w->a.border_width, w->a.y + w->a.border_width); + eo->win, w->a.x + w->a.border_width, w->a.y + w->a.border_width); return border; } @@ -913,6 +918,12 @@ { Display *dpy = disp; + if (w->extents != None) + { + XFixesDestroyRegion(dpy, w->extents); + w->extents = None; + } + #if HAS_NAME_WINDOW_PIXMAP if (w->pixmap != None) { @@ -936,11 +947,16 @@ } #if ENABLE_SHADOWS - if (w->shadowPict != None) + if (w->shadow != None) { XRenderFreePicture(dpy, w->shadow); w->shadow = None; } + if (w->shadowPict != None) + { + XRenderFreePicture(dpy, w->shadowPict); + w->shadowPict = None; + } #endif if (w->borderClip != None) @@ -951,7 +967,7 @@ } static void -ECompMgrWinInvalidateOpacity(Win * w) +ECompMgrWinInvalidateOpacity(ECmWinInfo * w) { Display *dpy = disp; @@ -969,19 +985,21 @@ #endif } -static void -ECompMgrWinChangeOpacity(ECmWinInfo * w, unsigned int opacity) +void +ECompMgrWinChangeOpacity(EObj * eo, unsigned int opacity) { + ECmWinInfo *w = eo->cmhook; Display *dpy = disp; int mode; XRenderPictFormat *pictfmt; - if (w->opacity == opacity) + if (!w || w->opacity == opacity) return; w->opacity = opacity; - D1printf("ECompMgrWinChangeOpacity: %#lx opacity=%#x\n", w->id, w->opacity); + D1printf("ECompMgrWinChangeOpacity: %#lx opacity=%#x\n", eo->win, + w->opacity); /* Invalidate stuff changed by opacity */ ECompMgrWinInvalidateOpacity(w); @@ -1004,30 +1022,41 @@ } static void -ECompMgrWinMap(ECmWinInfo * w, unsigned long sequence __UNUSED__, +ECompMgrWinMap(EObj * eo, unsigned long sequence __UNUSED__, Bool do_fade __UNUSED__) { + ECmWinInfo *w = eo->cmhook; + if (!w) - return; + { + ECompMgrWinNew(eo); + w = eo->cmhook; + if (!w) + return; + } + w->a.map_state = IsViewable; - D1printf("ECompMgrWinMap %#lx\n", w->id); + D1printf("ECompMgrWinMap %#lx\n", eo->win); #if CAN_DO_USABLE w->damage_bounds.x = w->damage_bounds.y = 0; w->damage_bounds.width = w->damage_bounds.height = 0; #endif +#if 0 w->damaged = 0; +#endif if (w->extents) - { - XFixesDestroyRegion(disp, w->extents); - } - w->extents = win_extents(disp, w); + XFixesDestroyRegion(disp, w->extents); + w->extents = win_extents(disp, eo); } static void -finish_unmap_win(Display * dpy __UNUSED__, Win * w) +finish_unmap_win(EObj * eo) { + ECmWinInfo *w = eo->cmhook; + +#if 0 w->damaged = 0; #if CAN_DO_USABLE @@ -1041,6 +1070,10 @@ ECompMgrDamageMerge(w->extents, 1); w->extents = None; } +#else + if (w->extents != None) + ECompMgrDamageMerge(w->extents, 0); +#endif clipChanged = True; } @@ -1048,7 +1081,7 @@ #if ENABLE_FADING #if HAS_NAME_WINDOW_PIXMAP static void -unmap_callback(Display * dpy, Win * w, Bool gone __UNUSED__) +unmap_callback(Display * dpy, ECmWinInfo * w, Bool gone __UNUSED__) { finish_unmap_win(dpy, w); } @@ -1056,219 +1089,156 @@ #endif static void -ECompMgrWinUnmap(ECmWinInfo * w, Bool do_fade __UNUSED__) +ECompMgrWinUnmap(EObj * eo, Bool do_fade __UNUSED__) { - if (!w) - return; - - D1printf("ECompMgrWinUnmap %#lx\n", w->id); + D1printf("ECompMgrWinUnmap %#lx\n", eo->win); #if ENABLE_FADING #if HAS_NAME_WINDOW_PIXMAP + ECmWinInfo *w = eo->cmhook; + if (w->pixmap && do_fade && fadeWindows) set_fade(dpy, w, False, unmap_callback, False); else #endif #endif - finish_unmap_win(disp, w); + finish_unmap_win(eo); } -/* Get the opacity prop from window - not found: default - otherwise the value - */ -static unsigned int -get_opacity_prop(Win * w, unsigned int def) +static void +ECompMgrWinNew(EObj * eo) { - Atom actual; - int pictfmt; - unsigned long n, left; - unsigned char *data; + ECmWinInfo *w; - data = NULL; - XGetWindowProperty(disp, w->id, _NET_WM_WINDOW_OPACITY, 0L, 1L, False, - XA_CARDINAL, &actual, &pictfmt, &n, &left, &data); - if (data) - { - unsigned int i; - memcpy(&i, data, sizeof(unsigned int)); - XFree(data); - return i; - } - return def; -} - -static ECmWinInfo * -ECompMgrWinNew(Window id, Window prev) -{ - Win *new = malloc(sizeof(Win)); - Win **p; - Display *dpy = disp; + w = Ecalloc(1, sizeof(ECmWinInfo)); + if (!w) + return; - if (!new) - return NULL; + D1printf("ECompMgrWinNew %#lx\n", eo->win); - if (prev) + set_ignore(disp, NextRequest(disp)); + if (!XGetWindowAttributes(disp, eo->win, &w->a)) { - for (p = &list; *p; p = &(*p)->next) - if ((*p)->id == prev) - break; + free(w); + return; } - else - p = &list; - new->id = id; - D1printf("ECompMgrWinNew %#lx\n", new->id); + eo->cmhook = w; - set_ignore(dpy, NextRequest(dpy)); - if (!XGetWindowAttributes(dpy, id, &new->a)) - { - free(new); - return NULL; - } - new->damaged = 0; + w->damaged = 0; #if CAN_DO_USABLE - new->usable = False; + w->usable = False; #endif #if HAS_NAME_WINDOW_PIXMAP - new->pixmap = None; + w->pixmap = None; #endif - new->picture = None; - if (new->a.class == InputOnly) + w->picture = None; + if (w->a.class == InputOnly) { - new->damage_sequence = 0; - new->damage = None; + w->damage_sequence = 0; + w->damage = None; } else { - new->damage_sequence = NextRequest(dpy); - new->damage = XDamageCreate(dpy, id, XDamageReportNonEmpty); + w->damage_sequence = NextRequest(disp); + w->damage = XDamageCreate(disp, eo->win, XDamageReportNonEmpty); } - new->alphaPict = None; - new->borderSize = None; - new->extents = None; + w->alphaPict = None; + w->borderSize = None; + w->extents = None; #if ENABLE_SHADOWS - new->shadowPict = None; - new->shadow = None; - new->shadow_dx = 0; - new->shadow_dy = 0; - new->shadow_width = 0; - new->shadow_height = 0; + w->shadowPict = None; + w->shadow = None; + w->shadow_dx = 0; + w->shadow_dy = 0; + w->shadow_width = 0; + w->shadow_height = 0; #endif - new->opacity = OPAQUE; - new->borderClip = None; - new->prev_trans = 0; + w->borderClip = None; /* moved mode setting to one place */ - ESelectInputAdd(dpy, id, PropertyChangeMask); - new->opacity = 0xdeadbeef; - ECompMgrWinChangeOpacity(new, get_opacity_prop(new, OPAQUE)); + ESelectInputAdd(disp, eo->win, PropertyChangeMask); + + /* Find new window region */ + w->extents = win_extents(disp, eo); + + clipChanged = True; + + w->opacity = 0xdeadbeef; + ECompMgrWinChangeOpacity(eo, eo->opacity); - new->next = *p; - *p = new; - if (new->a.map_state == IsViewable) - ECompMgrWinMap(new, new->damage_sequence - 1, False); + EventCallbackRegister(eo->win, 0, ECompMgrHandleWindowEvent, eo); - return new; +#if 0 + if (w->a.map_state == IsViewable) + ECompMgrWinMap(eo, w->damage_sequence - 1, False); +#endif } static void -ECompMgrWinConfigure(ECmWinInfo * w, XEvent * ev) +ECompMgrWinConfigure(EObj * eo, XEvent * ev) { - Display *dpy = disp; + ECmWinInfo *w = eo->cmhook; XserverRegion damage = None; + int change_xy, change_wh, change_bw; - if (!w) - return; - - D1printf("ECompMgrWinConfigure %#lx %#lx\n", w->id, w->extents); + D1printf("ECompMgrWinConfigure %#lx %#lx\n", eo->win, w->extents); /* Invalidate old window region */ #if CAN_DO_USABLE if (w->usable) #endif { - damage = XFixesCreateRegion(dpy, 0, 0); + damage = XFixesCreateRegion(disp, 0, 0); if (w->extents != None) - XFixesCopyRegion(dpy, damage, w->extents); + XFixesCopyRegion(disp, damage, w->extents); if (EventDebug(EDBUG_TYPE_COMPMGR3)) ERegionShow("ECompMgrWinConfigure old-extents:", damage); } - w->a.x = ev->xconfigure.x; - w->a.y = ev->xconfigure.y; - if (w->a.width != ev->xconfigure.width || - w->a.height != ev->xconfigure.height) - { -#if HAS_NAME_WINDOW_PIXMAP - if (w->pixmap) - { - XFreePixmap(dpy, w->pixmap); - w->pixmap = None; - if (w->picture) - { - XRenderFreePicture(dpy, w->picture); - w->picture = None; - } - } -#endif -#if ENABLE_SHADOWS - if (w->shadow) - { - XRenderFreePicture(dpy, w->shadow); - w->shadow = None; - } -#endif - } - - w->a.width = ev->xconfigure.width; - w->a.height = ev->xconfigure.height; - w->a.border_width = ev->xconfigure.border_width; + /* Can this change ?!? */ w->a.override_redirect = ev->xconfigure.override_redirect; - restack_win(w, ev->xconfigure.above); -#if HAS_NAME_WINDOW_PIXMAP - w->rcx = w->a.x; - w->rcy = w->a.y; - w->rcw = w->a.width + w->a.border_width * 2; - w->rch = w->w->a.height + w->a.border_width * 2; -#else - w->rcx = w->a.x + w->a.border_width; - w->rcy = w->a.y + w->a.border_width; - w->rcw = w->a.width; - w->rch = w->a.height; -#endif + change_xy = w->a.x != ev->xconfigure.x || w->a.y != ev->xconfigure.y; + change_wh = w->a.width != ev->xconfigure.width || + w->a.height != ev->xconfigure.height; + change_bw = w->a.border_width != ev->xconfigure.border_width; - /* Find new window region */ - w->extents = win_extents(dpy, w); + if (change_xy || change_wh || change_bw) + { + ECompMgrWinInvalidateSize(w); + + w->a.x = ev->xconfigure.x; + w->a.y = ev->xconfigure.y; + w->a.width = ev->xconfigure.width; + w->a.height = ev->xconfigure.height; + w->a.border_width = ev->xconfigure.border_width; + /* Find new window region */ + w->extents = win_extents(disp, eo); + } + + /* Hmmm. Why if not changed? */ /* Invalidate new window region */ - XFixesUnionRegion(dpy, damage, damage, w->extents); + XFixesUnionRegion(disp, damage, damage, w->extents); ECompMgrDamageMerge(damage, 1); clipChanged = True; } static void -ECompMgrWinCirculate(ECmWinInfo * w, XEvent * ev) +ECompMgrWinCirculate(EObj * eo, XEvent * ev) { - Window new_above; - - D1printf("ECompMgrWinCirculate %#lx %#lx\n", ev->xany.window, w->id); - - if (ev->xcirculate.place == PlaceOnTop) - new_above = list->id; - else - new_above = None; - restack_win(w, new_above); + D1printf("ECompMgrWinCirculate %#lx %#lx\n", ev->xany.window, eo->win); + /* FIXME - Check if stacking was changed */ clipChanged = True; } static void -ECompMgrWinInvalidateAll(Win * w) +ECompMgrWinInvalidateAll(ECmWinInfo * w) { /* Free pixmap, picture, borderSize, shadowPict, borderClip */ ECompMgrWinInvalidateSize(w); @@ -1278,86 +1248,71 @@ } static void -finish_destroy_win(Display * dpy, Window id, Bool gone) +finish_destroy_win(EObj * eo, Bool gone) { - Win **prev, *w; - - for (prev = &list; (w = *prev); prev = &w->next) - { - if (w->id != id) - continue; + ECmWinInfo *w = eo->cmhook; - if (!gone) - finish_unmap_win(dpy, w); - - *prev = w->next; - goto cleanup; - } - - /* No match */ - return; - - cleanup: + if (!gone) + finish_unmap_win(eo); ECompMgrWinInvalidateAll(w); if (w->damage != None) { set_ignore(dpy, NextRequest(dpy)); - XDamageDestroy(dpy, w->damage); + XDamageDestroy(disp, w->damage); } #if ENABLE_FADING - cleanup_fade(dpy, w); + cleanup_fade(disp, eo); #endif - free(w); + + _EFREE(eo->cmhook); } #if ENABLE_FADING #if HAS_NAME_WINDOW_PIXMAP static void -destroy_callback(Display * dpy, Win * w, Bool gone) +destroy_callback(EObj * eo, Bool gone) { - finish_destroy_win(dpy, w->id, gone); + finish_destroy_win(eo, gone); } #endif #endif static void -ECompMgrWinDel(ECmWinInfo * w, Bool gone, Bool do_fade) +ECompMgrWinDel(EObj * eo, Bool gone, Bool do_fade) { - Display *dpy = disp; - - if (!w) - return; - - D1printf("ECompMgrWinDel %#lx\n", w->id); +#if ENABLE_FADING +#if HAS_NAME_WINDOW_PIXMAP + ECmWinInfo *w = eo->cmhook; +#endif +#endif + D1printf("ECompMgrWinDel %#lx\n", eo->win); #if ENABLE_FADING #if HAS_NAME_WINDOW_PIXMAP if (w && w->pixmap && do_fade && fadeWindows) - set_fade(dpy, w, False, destroy_callback, gone); + set_fade(disp, w, False, destroy_callback, gone); else #endif #endif - { - finish_destroy_win(dpy, w->id, gone); - } + finish_destroy_win(eo, gone); do_fade = False; + + EventCallbackUnregister(eo->win, 0, ECompMgrHandleWindowEvent, eo); } static void -ECompMgrWinDamage(Win * w, XEvent * ev __UNUSED__) +ECompMgrWinDamage(EObj * eo, XEvent * ev __UNUSED__) { + ECmWinInfo *w = eo->cmhook; Display *dpy = disp; XDamageNotifyEvent *de = (XDamageNotifyEvent *) ev; XserverRegion parts; - if (!w) - return; - - D1printf("ECompMgrWinDamage %#lx %#lx %d %d %d %d\n", - ev->xany.window, w->id, + D1printf("ECompMgrWinDamage %#lx %#lx damaged=%d %d,%d %dx%d\n", + ev->xany.window, eo->win, w->damaged, de->area.x, de->area.y, de->area.width, de->area.height); #if CAN_DO_USABLE @@ -1419,7 +1374,7 @@ if (!w->damaged) { - parts = win_extents(dpy, w); + parts = win_extents(dpy, eo); set_ignore(dpy, NextRequest(dpy)); XDamageSubtract(dpy, w->damage, None, None); } @@ -1448,58 +1403,24 @@ w->damaged = 1; } +#if 0 /* FIXME - Remove */ static void -ECompMgrWinProperty(Win * w, XEvent * ev) +ECompMgrWinProperty(EObj * eo, XEvent * ev) { - if (!w) - return; - /* check if Trans property was changed */ if (ev->xproperty.atom == _NET_WM_WINDOW_OPACITY) { /* reset mode and redraw window */ - D1printf("ECompMgrWinProperty %#lx\n", w->id); + D1printf("ECompMgrWinProperty %#lx\n", eo->win); - ECompMgrWinChangeOpacity(w, get_opacity_prop(w, OPAQUE)); - } -} - -static void -restack_win(Win * w, Window new_above) -{ - Window old_above; - - D2printf("restack_win %#lx\n", w->id); - - if (w->next) - old_above = w->next->id; - else - old_above = None; - - if (old_above != new_above) - { - Win **prev; - - /* unhook */ - for (prev = &list; *prev; prev = &(*prev)->next) - if ((*prev) == w) - break; - *prev = w->next; - - /* rehook */ - for (prev = &list; *prev; prev = &(*prev)->next) - { - if ((*prev)->id == new_above) - break; - } - w->next = *prev; - *prev = w; + ECompMgrWinChangeOpacity(eo, get_opacity_prop(eo, OPAQUE)); } } +#endif /* Ensure that the blend mask is up to date */ static void -ECompMgrCheckAlphaMask(Win * w) +ECompMgrCheckAlphaMask(ECmWinInfo * w) { if (w->opacity != OPAQUE && !w->alphaPict) w->alphaPict = EPictureCreateSolid(False, (double)w->opacity / OPAQUE, @@ -1509,7 +1430,9 @@ static void ECompMgrRepaint(Display * dpy, XserverRegion region) { - Win *w, *t; + EObj *const *lst, *eo; + int i, num; + ECmWinInfo *w; Picture pict, pbuf; XRenderPictFormat *pictfmt; @@ -1523,13 +1446,6 @@ VRoot.depth, VRoot.vis); pbuf = rootBuffer; - /* Reverse link the list(?) */ - for (w = list, t = NULL; w; w = w->next) - { - w->prev_trans = t; - t = w; - } - XFixesSetPictureClipRegion(dpy, pbuf, 0, 0, region); /* Draw desktop background picture */ @@ -1538,8 +1454,17 @@ XRenderComposite(dpy, PictOpSrc, pict, None, pbuf, 0, 0, 0, 0, 0, 0, VRoot.w, VRoot.h); - for (w = t; w; w = w->prev_trans) + lst = EobjListStackGetForDesk(&num, 0 /*desk */ ); + + for (i = num - 1; i >= 0; i--) { + eo = lst[i]; + if (!eo->cmhook) + { + Eprintf("??? %#lx %s\n", eo->win, EobjGetName(eo)); + } + w = eo->cmhook; + #if CAN_DO_USABLE if (!w->usable) continue; @@ -1551,11 +1476,11 @@ { XRenderPictureAttributes pa; - Drawable draw = w->id; + Drawable draw = eo->win; #if HAS_NAME_WINDOW_PIXMAP if (hasNamePixmap && !w->pixmap) - w->pixmap = XCompositeNameWindowPixmap(dpy, w->id); + w->pixmap = XCompositeNameWindowPixmap(dpy, eo->win); if (w->pixmap) draw = w->pixmap; #endif @@ -1565,7 +1490,7 @@ pictfmt, CPSubwindowMode, &pa); } - D2printf("paint %#lx %d %#lx\n", w->id, w->mode, w->picture); + D2printf("paint %#lx %d %#lx\n", eo->win, w->mode, w->picture); #if 0 /* FIXME - Why? */ if (clipChanged) { @@ -1590,13 +1515,13 @@ /* Region of shaped window in screen coordinates */ if (!w->borderSize) - w->borderSize = border_size(dpy, w); + w->borderSize = border_size(eo); if (EventDebug(EDBUG_TYPE_COMPMGR3)) ERegionShow("Window borderSize", w->borderSize); /* Region of window in screen coordinates */ if (!w->extents) - w->extents = win_extents(dpy, w); + w->extents = win_extents(dpy, eo); if (EventDebug(EDBUG_TYPE_COMPMGR3)) ERegionShow("Window extents", w->extents); @@ -1612,14 +1537,14 @@ } #endif -#if 1 +#if 0 if (!w->borderClip) { w->borderClip = XFixesCreateRegion(dpy, 0, 0); XFixesCopyRegion(dpy, w->borderClip, region); } -#endif XFixesSetPictureClipRegion(dpy, pbuf, 0, 0, w->borderClip); +#endif #if ENABLE_SHADOWS switch (Conf_compmgr.shadow) { @@ -1778,21 +1703,6 @@ DeskBackgroundPictureFree(desk); } -#if USE_MOSTLY_ROOT_EVENTS - -static Win * -find_win(Window id) -{ - Win *w; - - for (w = list; w; w = w->next) - if (w->id == id) - return w; - return 0; -} - -#endif - static void ECompMgrStart(void) { @@ -1841,7 +1751,7 @@ break; } -#if USE_MOSTLY_ROOT_EVENTS +#if 0 /* Build initial list of children */ if (Conf_compmgr.mode != ECOMPMGR_MODE_AUTO) { @@ -1867,6 +1777,9 @@ static void ECompMgrStop(void) { + EObj *const *lst; + int i, num; + if (!Mode_compmgr.active) return; Mode_compmgr.active = 0; @@ -1881,105 +1794,116 @@ DeskBackgroundPictureFree(0); - while (list) - ECompMgrWinDel(list, False, False); + lst = EobjListStackGetForDesk(&num, 0 /*desk */ ); + + for (i = 0; i < num; i++) + ECompMgrWinDel(lst[i], False, False); XCompositeRedirectSubwindows(disp, VRoot.win, CompositeRedirectAutomatic); } -#if USE_MOSTLY_ROOT_EVENTS -#define _GET_WIN(a) find_win(a) -#else -#define _GET_WIN(a) ((Win*)((EWin*)prm)->cmhook) -#endif - static void ECompMgrHandleWindowEvent(XEvent * ev, void *prm) { + EObj *eo = prm; + switch (ev->type) { -#if !USE_MOSTLY_ROOT_EVENTS +#if 0 case ConfigureNotify: - ECompMgrWinConfigure(_GET_WIN(ev->xconfigure.window), ev); + ECompMgrWinConfigure(eo, ev); break; case MapNotify: - ECompMgrWinMap(_GET_WIN(ev->xmap.window), ev->xmap.serial, True); + ECompMgrWinMap(eo, ev->xmap.serial, True); break; case UnmapNotify: - ECompMgrWinUnmap(_GET_WIN(ev->xunmap.window), True); + ECompMgrWinUnmap(eo, True); break; case CirculateNotify: - ECompMgrWinCirculate(_GET_WIN(ev->xcirculate.window), ev); + ECompMgrWinCirculate(eo, ev); break; #endif +#if 0 /* FIXME - Remove */ case PropertyNotify: - ECompMgrWinProperty(_GET_WIN(ev->xproperty.window), ev); + ECompMgrWinProperty(eo, ev); break; +#endif case EX_EVENT_DAMAGE_NOTIFY: - ECompMgrWinDamage(_GET_WIN(((XDamageNotifyEvent *) ev)->drawable), ev); + ECompMgrWinDamage(eo, ev); break; } - -#if USE_MOSTLY_ROOT_EVENTS - prm = NULL; -#endif } static void ECompMgrHandleRootEvent(XEvent * ev, void *prm) { + EObj *eo; + switch (ev->type) { -#if USE_MOSTLY_ROOT_EVENTS case CreateNotify: +#if 0 case_CreateNotify: - ECompMgrWinNew(ev->xcreatewindow.window, 0); - EventCallbackRegister(ev->xcreatewindow.window, 0, - ECompMgrHandleWindowEvent, NULL); + eo = EobjListStackFind(ev->xcreatewindow.window); + if (eo) + ECompMgrWinNew(eo); +#endif break; case DestroyNotify: - ECompMgrWinDel(_GET_WIN(ev->xdestroywindow.window), True, True); - EventCallbackUnregister(ev->xcreatewindow.window, 0, - ECompMgrHandleWindowEvent, NULL); - EobjUnregister(ev->xmap.window); + eo = EobjListStackFind(ev->xdestroywindow.window); + if (eo && eo->cmhook) + ECompMgrWinDel(eo, True, True); + EobjUnregister(ev->xdestroywindow.window); break; case ReparentNotify: + eo = EobjListStackFind(ev->xreparent.window); + if (eo && eo->cmhook) + ECompMgrWinUnmap(eo, True); +#if 0 if (ev->xreparent.parent == VRoot.win) goto case_CreateNotify; - ECompMgrWinDel(_GET_WIN(ev->xreparent.window), False, True); - EventCallbackUnregister(ev->xcreatewindow.window, 0, - ECompMgrHandleWindowEvent, NULL); + eo = EobjListStackFind(ev->xreparent.window); + if (eo) + ECompMgrWinDel(eo, False, True); +#endif break; case ConfigureNotify: if (ev->xconfigure.window == VRoot.win) - ECompMgrRootConfigure(prm, ev); + { + ECompMgrRootConfigure(prm, ev); + } else - ECompMgrWinConfigure(_GET_WIN(ev->xconfigure.window), ev); + { + eo = EobjListStackFind(ev->xconfigure.window); + if (eo && eo->cmhook) + ECompMgrWinConfigure(eo, ev); + } break; case MapNotify: - EobjRegister(ev->xmap.window); - ECompMgrWinMap(_GET_WIN(ev->xmap.window), ev->xmap.serial, True); + eo = EobjListStackFind(ev->xmap.window); + if (!eo) + eo = EobjRegister(ev->xmap.window); + if (eo) + ECompMgrWinMap(eo, ev->xmap.serial, True); break; case UnmapNotify: - ECompMgrWinUnmap(_GET_WIN(ev->xunmap.window), True); + eo = EobjListStackFind(ev->xunmap.window); + if (eo && eo->cmhook) + ECompMgrWinUnmap(eo, True); break; case CirculateNotify: - ECompMgrWinCirculate(_GET_WIN(ev->xcirculate.window), ev); + eo = EobjListStackFind(ev->xcirculate.window); + if (eo && eo->cmhook) + ECompMgrWinCirculate(eo, ev); break; -#else - case ConfigureNotify: - if (ev->xconfigure.window == VRoot.win) - ECompMgrRootConfigure(prm, ev); - break; -#endif case Expose: ECompMgrRootExpose(prm, ev); @@ -2031,10 +1955,6 @@ static void ECompMgrSighan(int sig, void *prm) { -#if !USE_MOSTLY_ROOT_EVENTS - EWin *ewin; -#endif - if (sig != ESIGNAL_INIT && Conf_compmgr.mode == ECOMPMGR_MODE_OFF) return; @@ -2055,20 +1975,6 @@ case ESIGNAL_IDLE: ECompMgrIdle(); break; - -#if !USE_MOSTLY_ROOT_EVENTS - case ESIGNAL_EWIN_CREATE: - ewin = (EWin *) prm; - ewin->cmhook = ECompMgrWinNew(EoGetWin(ewin), None); - EventCallbackRegister(EoGetWin(ewin), 0, ECompMgrHandleWindowEvent, - ewin); - break; - - case ESIGNAL_EWIN_DESTROY: - ewin = (EWin *) prm; - ECompMgrWinDel(ewin->cmhook, True, True); - break; -#endif } } =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/Attic/ecompmgr.h,v retrieving revision 1.1.2.1 retrieving revision 1.1.2.2 diff -u -3 -r1.1.2.1 -r1.1.2.2 --- ecompmgr.h 5 Dec 2004 12:27:33 -0000 1.1.2.1 +++ ecompmgr.h 9 Dec 2004 21:40:42 -0000 1.1.2.2 @@ -3,4 +3,10 @@ void ECompMgrParseArgs(const char *args); +#if USE_COMPOSITE +void ECompMgrWinChangeOpacity(EObj * eo, unsigned int opacity); +#else +#define ECompMgrWinChangeOpacity(eo, opacity) +#endif + #endif /* _ECOMPMGR_H */ =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/Attic/eobj.c,v retrieving revision 1.1.2.2 retrieving revision 1.1.2.3 diff -u -3 -r1.1.2.2 -r1.1.2.3 --- eobj.c 5 Dec 2004 12:27:33 -0000 1.1.2.2 +++ eobj.c 9 Dec 2004 21:40:42 -0000 1.1.2.3 @@ -132,6 +132,7 @@ eo->x = attr.y; eo->w = attr.width; eo->h = attr.height; + eo->opacity = 0xFFFFFFFF; return eo; } @@ -143,19 +144,20 @@ Efree(eo); } -void +EObj * EobjRegister(Window win) { EObj *eo; eo = EobjListStackFind(win); if (eo) - return; + return eo; eo = EobjCreate(win); if (!eo) - return; + return eo; + /* Just for debug */ eo->name = e16_icccm_name_get(win); if (EventDebug(EDBUG_TYPE_EWINS)) @@ -163,6 +165,8 @@ EobjSetLayer(eo, 80); EobjListStackAdd(eo, 1); + + return eo; } void =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/Attic/ewin-ops.c,v retrieving revision 1.1.2.20 retrieving revision 1.1.2.21 diff -u -3 -r1.1.2.20 -r1.1.2.21 --- ewin-ops.c 5 Dec 2004 11:07:20 -0000 1.1.2.20 +++ ewin-ops.c 9 Dec 2004 21:40:57 -0000 1.1.2.21 @@ -21,6 +21,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "E.h" +#include "ecompmgr.h" #include <sys/time.h> void @@ -1601,6 +1602,14 @@ } void +EwinOpSetOpacity(EWin * ewin, int opacity) +{ + HintsSetWindowOpacity(ewin, opacity); + ECompMgrWinChangeOpacity(&ewin->o, opacity); + RememberImportantInfoForEwin(ewin); +} + +void EwinOpMoveToDesk(EWin * ewin, int desk) { MoveEwinToDesktop(ewin, desk); =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/Attic/ewins.c,v retrieving revision 1.1.2.33 retrieving revision 1.1.2.34 diff -u -3 -r1.1.2.33 -r1.1.2.34 --- ewins.c 5 Dec 2004 12:27:33 -0000 1.1.2.33 +++ ewins.c 9 Dec 2004 21:40:57 -0000 1.1.2.34 @@ -66,11 +66,6 @@ ewin = Ecalloc(1, sizeof(EWin)); ewin->state = (Mode.wm.startup) ? EWIN_STATE_STARTUP : EWIN_STATE_NEW; - EoSetType(ewin, EOBJ_TYPE_EWIN); - EoSetX(ewin, -1); - EoSetY(ewin, -1); - EoSetW(ewin, -1); - EoSetH(ewin, -1); ewin->lx = -1; ewin->ly = -1; ewin->lw = -1; @@ -97,8 +92,6 @@ ewin->client.mwm_func_minimize = 1; ewin->client.mwm_func_maximize = 1; ewin->client.mwm_func_close = 1; - EoSetDesk(ewin, DesksGetCurrent()); - EoSetLayer(ewin, 4); EoSetWin(ewin, ECreateWindow(VRoot.win, -10, -10, 1, 1, 1)); ewin->win_container = ECreateWindow(EoGetWin(ewin), 0, 0, 1, 1, 0); #if 0 /* ENABLE_GNOME - Not actually used */ @@ -108,6 +101,15 @@ ewin->area_x = -1; ewin->area_y = -1; + EoSetType(ewin, EOBJ_TYPE_EWIN); + EoSetX(ewin, -1); + EoSetY(ewin, -1); + EoSetW(ewin, -1); + EoSetH(ewin, -1); + EoSetDesk(ewin, DesksGetCurrent()); + EoSetLayer(ewin, 4); + EoSetOpacity(ewin, 0xFFFFFFFF); + att.event_mask = EWIN_CONTAINER_EVENT_MASK; att.do_not_propagate_mask = ButtonPressMask | ButtonReleaseMask; XChangeWindowAttributes(disp, ewin->win_container, @@ -121,6 +123,7 @@ ewin->client.win = win; FocusEwinSetGrabs(ewin); GrabButtonGrabs(ewin); + EobjListStackAdd(&ewin->o, 0); EobjListFocusAdd(&ewin->o, 0); @@ -1883,6 +1886,7 @@ case LeaveNotify: FocusHandleLeave(NULL, ev); break; + case MapRequest: AddToFamily(ev->xmaprequest.window); break; @@ -1907,6 +1911,7 @@ #endif EwinEventCirculateRequest(NULL, ev); break; + default: #if 0 Eprintf("EwinHandleEventsRoot: type=%2d win=%#lx\n", =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/ewmh.c,v retrieving revision 1.55.2.18 retrieving revision 1.55.2.19 diff -u -3 -r1.55.2.18 -r1.55.2.19 --- ewmh.c 8 Dec 2004 20:06:16 -0000 1.55.2.18 +++ ewmh.c 9 Dec 2004 21:40:58 -0000 1.55.2.19 @@ -507,6 +507,7 @@ ecore_x_netwm_opacity_set(ewin->client.win, opacity); ewin->props.opacity = opacity; } + EoSetOpacity(ewin, opacity); ecore_x_netwm_opacity_set(EoGetWin(ewin), opacity); } =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/ipc.c,v retrieving revision 1.174.2.37 retrieving revision 1.174.2.38 diff -u -3 -r1.174.2.37 -r1.174.2.38 --- ipc.c 9 Dec 2004 19:22:20 -0000 1.174.2.37 +++ ipc.c 9 Dec 2004 21:40:58 -0000 1.174.2.38 @@ -746,7 +746,7 @@ val = 0xff; sscanf(param1, "%i", &val); val = (val << 24) | (val << 16) | (val << 8) | val; - HintsSetWindowOpacity(ewin, val); + EwinOpSetOpacity(ewin, val); } } else if (!strncmp(operation, "border", 2)) ------------------------------------------------------- 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