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