Enlightenment CVS committal Author : kwo Project : e16 Module : e
Dir : e16/e/src Modified Files: E.h areas.c desktops.c ecompmgr.c ecompmgr.h eobj.c ewin-ops.c ewins.c main.c tooltips.c Log Message: Major composite manager changes. Associated fixups. Not finished (things may be broken). =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/E.h,v retrieving revision 1.408 retrieving revision 1.409 diff -u -3 -r1.408 -r1.409 --- E.h 17 Apr 2005 21:58:31 -0000 1.408 +++ E.h 20 Apr 2005 22:49:13 -0000 1.409 @@ -575,9 +575,6 @@ int current_area_x; int current_area_y; long event_mask; -#if USE_COMPOSITE - void *cmhook; -#endif } Desk; typedef struct _constraints @@ -1216,8 +1213,6 @@ void SetCurrentLinearArea(int a); int GetCurrentLinearArea(void); void MoveCurrentLinearAreaBy(int a); -void SlideWindowsBy(Window * win, int num, int dx, int dy, - int speed); void MoveEwinToLinearArea(EWin * ewin, int a); void MoveEwinLinearAreaBy(EWin * ewin, int a); @@ -1406,8 +1401,6 @@ void DesksSetCurrent(int desk); void DesksResize(int w, int h); -void SlideWindowTo(Window win, int fx, int fy, int tx, int ty, - int speed); void DeskRefresh(int num); void DesksRefresh(void); void DeskAssignBg(int desk, Background * bg); @@ -1558,6 +1551,10 @@ void EobjSetLayer(EObj * eo, int layer); void EobjSetFloating(EObj * eo, int floating); int EobjIsShaped(const EObj * eo); +void EobjSlideTo(EObj * eo, int fx, int fy, int tx, int ty, + int speed); +void EobjsSlideBy(EObj ** peo, int num, int dx, int dy, + int speed); /* events.c */ /* Re-mapped X-events */ =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/areas.c,v retrieving revision 1.81 retrieving revision 1.82 diff -u -3 -r1.81 -r1.82 --- areas.c 17 Apr 2005 21:58:31 -0000 1.81 +++ areas.c 20 Apr 2005 22:49:13 -0000 1.82 @@ -164,45 +164,6 @@ } void -SlideWindowsBy(Window * win, int num, int dx, int dy, int speed) -{ - int i, k, x, y; - struct _xy - { - int x, y; - } *xy; - - if (num < 1) - return; - - xy = Emalloc(sizeof(struct _xy) * num); - - for (i = 0; i < num; i++) - EGetGeometry(win[i], NULL, &(xy[i].x), &(xy[i].y), NULL, NULL, NULL, - NULL); - - ETimedLoopInit(0, 1024, speed); - for (k = 0; k <= 1024;) - { - for (i = 0; i < num; i++) - { - x = ((xy[i].x * (1024 - k)) + ((xy[i].x + dx) * k)) >> 10; - y = ((xy[i].y * (1024 - k)) + ((xy[i].y + dy) * k)) >> 10; - EMoveWindow(win[i], x, y); - } - ecore_x_sync(); - - k = ETimedLoopNext(); - } - - for (i = 0; i < num; i++) - EMoveWindow(win[i], xy[i].x + dx, xy[i].y + dy); - - if (xy) - Efree(xy); -} - -void SetCurrentArea(int ax, int ay) { EWin *const *lst, *ewin; @@ -249,7 +210,7 @@ if (Conf.desks.slidein) { int wnum = 0; - Window *wl = NULL; + EObj **wl = NULL; /* create the list of windwos to move */ for (i = 0; i < num; i++) @@ -263,20 +224,21 @@ if (!(EoIsFloating(ewin) && Conf.movres.mode_move == 0)) { wnum++; - wl = Erealloc(wl, sizeof(Window) * wnum); - wl[wnum - 1] = EoGetWin(ewin); + wl = Erealloc(wl, sizeof(EObj *) * wnum); + wl[wnum - 1] = &ewin->o; } } /* slide them */ if (wl) { - SlideWindowsBy(wl, wnum, -dx, -dy, Conf.desks.slidespeed); + EobjsSlideBy(wl, wnum, -dx, -dy, Conf.desks.slidespeed); Efree(wl); } } /* move all windows to their final positions */ + Mode.move.check = 0; for (i = 0; i < num; i++) { ewin = lst[i]; @@ -288,8 +250,9 @@ continue; if (!(EoIsFloating(ewin) && Conf.movres.mode_move == 0)) - MoveEwin(ewin, EoGetX(ewin) - dx, EoGetY(ewin) - dy); + MoveEwin(ewin, EoGetX(ewin), EoGetY(ewin)); } + Mode.move.check = 1; /* set hints up for it */ HintsSetDesktopViewport(); =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/desktops.c,v retrieving revision 1.138 retrieving revision 1.139 diff -u -3 -r1.138 -r1.139 --- desktops.c 17 Apr 2005 21:58:31 -0000 1.138 +++ desktops.c 20 Apr 2005 22:49:13 -0000 1.139 @@ -817,28 +817,6 @@ } void -SlideWindowTo(Window win, int fx, int fy, int tx, int ty, int speed) -{ - int k, x, y; - - ecore_x_grab(); - - ETimedLoopInit(0, 1024, speed); - for (k = 0; k <= 1024;) - { - x = ((fx * (1024 - k)) + (tx * k)) >> 10; - y = ((fy * (1024 - k)) + (ty * k)) >> 10; - EMoveWindow(win, x, y); - ecore_x_sync(); - - k = ETimedLoopNext(); - } - EMoveWindow(win, tx, ty); - - ecore_x_ungrab(); -} - -void DeskRefresh(int desk) { Desk *d; @@ -1018,26 +996,26 @@ case 0: DeskMove(desk, VRoot.w, 0); DeskRaise(desk); - SlideWindowTo(EoGetWin(d), VRoot.w, 0, 0, 0, - Conf.desks.slidespeed); + EobjSlideTo(&d->o, VRoot.w, 0, 0, 0, + Conf.desks.slidespeed); break; case 1: DeskMove(desk, -VRoot.w, 0); DeskRaise(desk); - SlideWindowTo(EoGetWin(d), -VRoot.w, 0, 0, 0, - Conf.desks.slidespeed); + EobjSlideTo(&d->o, -VRoot.w, 0, 0, 0, + Conf.desks.slidespeed); break; case 2: DeskMove(desk, 0, VRoot.h); DeskRaise(desk); - SlideWindowTo(EoGetWin(d), 0, VRoot.h, 0, 0, - Conf.desks.slidespeed); + EobjSlideTo(&d->o, 0, VRoot.h, 0, 0, + Conf.desks.slidespeed); break; case 3: DeskMove(desk, 0, -VRoot.h); DeskRaise(desk); - SlideWindowTo(EoGetWin(d), 0, -VRoot.h, 0, 0, - Conf.desks.slidespeed); + EobjSlideTo(&d->o, 0, -VRoot.h, 0, 0, + Conf.desks.slidespeed); break; default: break; @@ -1045,8 +1023,8 @@ } else { - SlideWindowTo(EoGetWin(d), EoGetX(d), EoGetY(d), 0, 0, - Conf.desks.slidespeed); + EobjSlideTo(&d->o, EoGetX(d), EoGetY(d), 0, 0, + Conf.desks.slidespeed); DeskRaise(desk); } StackDesktops(); =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/ecompmgr.c,v retrieving revision 1.20 retrieving revision 1.21 diff -u -3 -r1.20 -r1.21 --- ecompmgr.c 12 Apr 2005 16:43:34 -0000 1.20 +++ ecompmgr.c 20 Apr 2005 22:49:15 -0000 1.21 @@ -92,8 +92,11 @@ #define EDBUG_TYPE_COMPMGR 161 #define EDBUG_TYPE_COMPMGR2 162 #define EDBUG_TYPE_COMPMGR3 163 +#define EDBUG_TYPE_COMPMGR4 164 #define D1printf(fmt...) if(EventDebug(EDBUG_TYPE_COMPMGR))Eprintf(fmt) #define D2printf(fmt...) if(EventDebug(EDBUG_TYPE_COMPMGR2))Eprintf(fmt) +#define D3printf(fmt...) if(EventDebug(EDBUG_TYPE_COMPMGR3))Eprintf(fmt) +#define D4printf(fmt...) if(EventDebug(EDBUG_TYPE_COMPMGR4))Eprintf(fmt) #else #define D1printf(fmt...) #define D2printf(fmt...) @@ -141,11 +144,6 @@ unsigned long damage_sequence; /* sequence when damage was created */ } ECmWinInfo; -typedef struct -{ - Picture bgpict; /* The background picture */ -} ECmDeskInfo; - /* * Configuration */ @@ -283,6 +281,20 @@ return pict; } +#if 0 +static Picture +EPictureCreate(Window win, int depth, Visual * vis) +{ + Picture pict; + XRenderPictFormat *pictfmt; + + pictfmt = XRenderFindVisualFormat(disp, vis); + pict = XRenderCreatePicture(disp, win, pictfmt, 0, 0); + + return pict; +} +#endif + /* Hack to fix redirected window resize bug(?) */ void ECompMgrMoveResizeFix(EObj * eo, int x, int y, int w, int h) @@ -324,7 +336,7 @@ #if 0 /* FIXME - the screen update seems to be delayed? */ if (c->extents != None) - ECompMgrDamageMerge(c->extents, 0); + ECompMgrDamageMerge(eo->desk, c->extents, 0); #endif } @@ -335,15 +347,15 @@ static Picture DeskBackgroundPictureGet(Desk * d) { - ECmDeskInfo *cmdi = d->cmhook; + ECmWinInfo *cw = d->o.cmhook; Picture pict; Pixmap pmap; Bool fill; XRenderPictFormat *pictfmt; XRenderPictureAttributes pa; - if (cmdi->bgpict) - return cmdi->bgpict; + if (cw->picture != None) + return cw->picture; fill = False; pmap = BackgroundGetPixmap(DeskGetBackground(d->num)); @@ -372,7 +384,7 @@ /* New background, all must be repainted */ ECompMgrDamageAll(); - cmdi->bgpict = pict; + cw->picture = pict; return pict; } @@ -380,17 +392,19 @@ static void DeskBackgroundPictureFree(Desk * d) { - ECmDeskInfo *cmdi = d->cmhook; + ECmWinInfo *cw = d->o.cmhook; Picture pict; - pict = cmdi->bgpict; + pict = cw->picture; if (pict == None) return; + D1printf("DeskBackgroundPictureFree: Desk %d: pict=%#lx\n", d->num, pict); + XClearArea(disp, EoGetWin(d), 0, 0, 0, 0, True); XRenderFreePicture(disp, pict); - cmdi->bgpict = None; + cw->picture = None; } /* @@ -398,8 +412,26 @@ */ static void -ECompMgrDamageMerge(XserverRegion damage, int destroy) +ECompMgrDamageMerge(int desk, XserverRegion damage, int destroy) { + if (desk) + { + Desk *d = DeskGet(desk); + + if (EoGetX(d) != 0 || EoGetY(d) != 0) + { + if (!destroy) + { + XserverRegion region; + + region = XFixesCreateRegion(disp, 0, 0); + XFixesCopyRegion(disp, region, damage); + damage = region; + } + XFixesTranslateRegion(disp, damage, EoGetX(d), EoGetY(d)); + } + } + if (allDamage) { if (EventDebug(EDBUG_TYPE_COMPMGR3)) @@ -426,7 +458,7 @@ static void ECompMgrDamageAll(void) { - ECompMgrDamageMerge(ERegionCreate(0, 0, VRoot.w, VRoot.h), 1); + ECompMgrDamageMerge(0, ERegionCreate(0, 0, VRoot.w, VRoot.h), 1); } #if ENABLE_FADING @@ -861,10 +893,10 @@ 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; - r.height = w->a.height + w->a.border_width * 2; + r.x = w->rcx; + r.y = w->rcy; + r.width = w->rcw; + r.height = w->rch; #if ENABLE_SHADOWS if (eo->shadow && Conf_compmgr.shadow != ECM_SHADOWS_OFF && @@ -877,8 +909,8 @@ { w->shadow_dx = 2; w->shadow_dy = 7; - w->shadow_width = w->a.width; - w->shadow_height = w->a.height; + w->shadow_width = w->rcw; + w->shadow_height = w->rcw; } else { @@ -890,17 +922,13 @@ if (w->mode == WINDOW_TRANS) opacity *= ((double)w->opacity) / OPAQUE; - w->shadow = shadow_picture(dpy, opacity, - w->a.width + - w->a.border_width * 2, - w->a.height + - w->a.border_width * 2, + w->shadow = shadow_picture(dpy, opacity, w->rcw, w->rch, &w->shadow_width, &w->shadow_height); } } - sr.x = w->a.x + w->shadow_dx; - sr.y = w->a.y + w->shadow_dy; + sr.x = w->rcx + w->shadow_dx; + sr.y = w->rcy + w->shadow_dy; sr.width = w->shadow_width; sr.height = w->shadow_height; if (sr.x < r.x) @@ -931,16 +959,16 @@ { ECmWinInfo *w = eo->cmhook; XserverRegion border; + int x, y; border = XFixesCreateRegionFromWindow(disp, eo->win, WindowRegionBounding); /* translate this */ - XFixesTranslateRegion(disp, border, - w->a.x + w->a.border_width, - w->a.y + w->a.border_width); + x = eo->x + w->a.border_width; + y = eo->y + w->a.border_width; + XFixesTranslateRegion(disp, border, x, y); - D2printf("border_size %#lx: %d %d\n", - eo->win, w->a.x + w->a.border_width, w->a.y + w->a.border_width); + D2printf("border_size %#lx: %d %d\n", eo->win, x, y); return border; } @@ -1016,7 +1044,11 @@ if ((what & (INV_GEOM | INV_SHADOW)) && w->extents != None) { +#if 0 /* FIXME - ??? */ ECompMgrDamageMerge(w->extents, 1); +#else + XFixesDestroyRegion(dpy, w->extents); +#endif w->extents = None; } } @@ -1040,9 +1072,10 @@ /* Invalidate stuff changed by opacity */ ECompMgrWinInvalidate(eo, INV_OPACITY); - /* Extents may be unchanged, however, we must repaint */ - if (w->extents != None) - ECompMgrDamageMerge(w->extents, 0); + if (eo->shown) /* FIXME - ??? */ + /* Extents may be unchanged, however, we must repaint */ + if (w->extents != None) + ECompMgrDamageMerge(eo->desk, w->extents, 0); if (w->a.class == InputOnly) pictfmt = NULL; @@ -1058,9 +1091,8 @@ w->mode = mode; } -static void -ECompMgrWinMap(EObj * eo, unsigned long sequence __UNUSED__, - Bool do_fade __UNUSED__) +void +ECompMgrWinMap(EObj * eo) { ECmWinInfo *w = eo->cmhook; @@ -1080,7 +1112,7 @@ w->damage_bounds.x = w->damage_bounds.y = 0; w->damage_bounds.width = w->damage_bounds.height = 0; #endif - ECompMgrDamageMerge(w->extents, 0); + ECompMgrDamageMerge(eo->desk, w->extents, 0); } static void @@ -1101,12 +1133,12 @@ if (w->extents != None) { - ECompMgrDamageMerge(w->extents, 1); + ECompMgrDamageMerge(eo->desk, w->extents, 1); w->extents = None; } #else if (w->extents != None) - ECompMgrDamageMerge(w->extents, 0); + ECompMgrDamageMerge(eo->desk, w->extents, 0); #endif } @@ -1118,8 +1150,8 @@ } #endif -static void -ECompMgrWinUnmap(EObj * eo, Bool do_fade __UNUSED__) +void +ECompMgrWinUnmap(EObj * eo) { D1printf("ECompMgrWinUnmap %#lx\n", eo->win); @@ -1165,18 +1197,26 @@ #endif if (w->picture == None) { - XRenderPictFormat *pictfmt; - XRenderPictureAttributes pa; - Drawable draw = eo->win; + if (eo->type == EOBJ_TYPE_DESK) + { + w->picture = DeskBackgroundPictureGet((Desk *) eo); + w->damaged = 1; /* FIXME - ??? */ + } + else + { + XRenderPictFormat *pictfmt; + XRenderPictureAttributes pa; + Drawable draw = eo->win; #if HAS_NAME_WINDOW_PIXMAP - if (w->pixmap) - draw = w->pixmap; + if (w->pixmap) + draw = w->pixmap; #endif - pictfmt = XRenderFindVisualFormat(disp, w->a.visual); - pa.subwindow_mode = IncludeInferiors; - w->picture = XRenderCreatePicture(disp, draw, - pictfmt, CPSubwindowMode, &pa); + pictfmt = XRenderFindVisualFormat(disp, w->a.visual); + pa.subwindow_mode = IncludeInferiors; + w->picture = XRenderCreatePicture(disp, draw, + pictfmt, CPSubwindowMode, &pa); + } D2printf("New picture %#lx\n", w->picture); } } @@ -1185,6 +1225,10 @@ ECompMgrWinNew(EObj * eo) { ECmWinInfo *w; + Status ok; + + if (!Conf_compmgr.enable) /* FIXME - Here? */ + return; w = Ecalloc(1, sizeof(ECmWinInfo)); if (!w) @@ -1192,29 +1236,34 @@ D1printf("ECompMgrWinNew %#lx\n", eo->win); - if (!XGetWindowAttributes(disp, eo->win, &w->a)) + eo->cmhook = w; + + ok = XGetWindowAttributes(disp, eo->win, &w->a); + if (!ok || w->a.class == InputOnly) { free(w); + eo->cmhook = NULL; return; } - eo->cmhook = w; - w->damaged = 0; #if CAN_DO_USABLE w->usable = False; #endif +#if 0 if (w->a.class == InputOnly) { w->damage_sequence = 0; w->damage = None; } else - { -#if 0 - XCompositeRedirectWindow(disp, eo->win, CompositeRedirectManual); #endif + + if (eo->type != EOBJ_TYPE_DESK) + { + if (Conf_compmgr.mode == ECM_MODE_WINDOW) + XCompositeRedirectWindow(disp, eo->win, CompositeRedirectManual); w->damage_sequence = NextRequest(disp); w->damage = XDamageCreate(disp, eo->win, XDamageReportNonEmpty); } @@ -1238,17 +1287,18 @@ w->shadow_height = 0; #endif -#if 0 - /* moved mode setting to one place */ - ESelectInputAdd(disp, eo->win, - PropertyChangeMask /* | StructureNotifyMask */ ); +#if 1 + if (Conf_compmgr.mode == ECM_MODE_WINDOW) + ESelectInputAdd(eo->win, StructureNotifyMask); #endif w->opacity = 0xdeadbeef; ECompMgrWinChangeOpacity(eo, eo->opacity); +#if 1 /* FIXME - Do we need this? */ /* Find new window region */ w->extents = win_extents(disp, eo); +#endif EventCallbackRegister(eo->win, 0, ECompMgrHandleWindowEvent, eo); @@ -1258,34 +1308,31 @@ #endif } -static void -ECompMgrWinConfigure(EObj * eo, XEvent * ev) +void +ECompMgrWinMoveResize(EObj * eo, int x, int y, int w, int h, int bw) { - ECmWinInfo *w = eo->cmhook; + ECmWinInfo *cw = eo->cmhook; XserverRegion damage = None; int change_xy, change_wh, change_bw, invalidate; - D1printf("ECompMgrWinConfigure %#lx %#lx\n", eo->win, w->extents); + D1printf("ECompMgrWinMoveResize %#lx %#lx\n", eo->win, cw->extents); /* Invalidate old window region */ #if CAN_DO_USABLE - if (w->usable) + if (cw->usable) #endif - { - damage = XFixesCreateRegion(disp, 0, 0); - if (w->extents != None) - XFixesCopyRegion(disp, damage, w->extents); - if (EventDebug(EDBUG_TYPE_COMPMGR3)) - ERegionShow("ECompMgrWinConfigure old-extents:", damage); - } - - /* Can this change ?!? */ - w->a.override_redirect = ev->xconfigure.override_redirect; + if (eo->shown) /* FIXME - ??? */ + { + damage = XFixesCreateRegion(disp, 0, 0); + if (cw->extents != None) + XFixesCopyRegion(disp, damage, cw->extents); + if (EventDebug(EDBUG_TYPE_COMPMGR3)) + ERegionShow("ECompMgrWinConfigure old-extents:", damage); + } - 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; + change_xy = cw->a.x != x || cw->a.y != y; + change_wh = cw->a.width != w || cw->a.height != h; + change_bw = cw->a.border_width != bw; invalidate = 0; if (change_xy || change_bw) @@ -1296,23 +1343,41 @@ if (invalidate) { ECompMgrWinInvalidate(eo, invalidate); - if (invalidate & INV_SIZE) - ECompMgrWinSetPicts(eo); - - 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; + if (eo->shown) /* FIXME - ??? */ + if (invalidate & INV_SIZE) + ECompMgrWinSetPicts(eo); + + cw->a.x = x; + cw->a.y = y; + cw->a.width = w; + cw->a.height = h; + cw->a.border_width = bw; /* Find new window region */ - w->extents = win_extents(disp, eo); + if (eo->shown) /* FIXME - ??? */ + cw->extents = win_extents(disp, eo); + } + + if (eo->shown) /* FIXME - ??? */ + { + /* Hmmm. Why if not changed? */ + /* Invalidate new window region */ + XFixesUnionRegion(disp, damage, damage, cw->extents); + ECompMgrDamageMerge(eo->desk, damage, 1); } +} + +static void +ECompMgrWinConfigure(EObj * eo, XEvent * ev) +{ + ECmWinInfo *cw = eo->cmhook; + + /* Can this change ?!? */ + cw->a.override_redirect = ev->xconfigure.override_redirect; - /* Hmmm. Why if not changed? */ - /* Invalidate new window region */ - XFixesUnionRegion(disp, damage, damage, w->extents); - ECompMgrDamageMerge(damage, 1); + ECompMgrWinMoveResize(eo, ev->xconfigure.x, ev->xconfigure.y, + ev->xconfigure.width, ev->xconfigure.height, + ev->xconfigure.border_width); } static void @@ -1378,9 +1443,12 @@ finish_destroy_win(eo, gone); do_fade = False; -#if 0 - XCompositeUnredirectWindow(disp, eo->win, CompositeRedirectManual); -#endif + if (eo->type != EOBJ_TYPE_DESK) + { + if (Conf_compmgr.mode == ECM_MODE_WINDOW) + XCompositeUnredirectWindow(disp, eo->win, CompositeRedirectManual); + } + EventCallbackUnregister(eo->win, 0, ECompMgrHandleWindowEvent, eo); } @@ -1456,14 +1524,15 @@ { parts = win_extents(dpy, eo); XDamageSubtract(dpy, w->damage, None, None); + w->damaged = 1; } else { parts = XFixesCreateRegion(dpy, 0, 0); XDamageSubtract(dpy, w->damage, None, parts); XFixesTranslateRegion(dpy, parts, - w->a.x + w->a.border_width, - w->a.y + w->a.border_width); + eo->x + w->a.border_width, + eo->y + w->a.border_width); #if ENABLE_SHADOWS if (Conf_compmgr.shadow == ECM_SHADOWS_SHARP) { @@ -1477,8 +1546,7 @@ } #endif } - ECompMgrDamageMerge(parts, 1); - w->damaged = 1; + ECompMgrDamageMerge(eo->desk, parts, 1); } /* Ensure that the blend mask is up to date */ @@ -1490,29 +1558,64 @@ 0, 0, 0); } -static void -ECompMgrRepaintDetermineOrder(void) +static int +ECompMgrRepaintDetermineOrder(EObj * const *lst, int num, EObj ** first, + EObj ** last, int desk) { - EObj *const *lst, *eo, *eo_prev, *eo_first; - int i, num; + EObj *eo, *eo_prev, *eo_first; + int i, stop; ECmWinInfo *w; -#if 0 - lst = EobjListStackGet(&num); -#else - lst = EobjListStackGetForDesk(&num, 0 /*desk */ ); -#endif + D4printf("ECompMgrRepaintDetermineOrder %d\n", desk); + if (!lst) + lst = EobjListStackGet(&num); /* Determine overall paint order, top to bottom */ + stop = 0; eo_first = eo_prev = NULL; for (i = 0; i < num; i++) { eo = lst[i]; - if (!eo->cmhook) + + if (eo->desk != desk) continue; + + D4printf(" - %#lx desk=%d shown=%d\n", eo->win, eo->desk, eo->shown); + + if (eo->type == EOBJ_TYPE_DESK) + { + EObj *eo1, *eo2; + ECmWinInfo *ec1; + Desk *d = (Desk *) eo; + + if (!d->viewable) + continue; + + stop = ECompMgrRepaintDetermineOrder(lst, num, &eo1, &eo2, + ((Desk *) eo)->num); + if (eo1) + { + ec1 = eo1->cmhook; + if (!eo_first) + eo_first = eo1; + if (eo_prev) + ((ECmWinInfo *) (eo_prev->cmhook))->next = eo1; + ((ECmWinInfo *) (eo1->cmhook))->prev = eo_prev; + eo_prev = eo2; + } + ECompMgrWinSetPicts(&d->o); + } + w = eo->cmhook; + if (!w /* || !eo->shown */ ) + continue; + + D4printf(" - %#lx desk=%d shown=%d vis=%d dam=%d pict=%#lx\n", + eo->win, eo->desk, eo->shown, w->visible, w->damaged, + w->picture); + if (!w->visible) continue; #if CAN_DO_USABLE @@ -1524,6 +1627,10 @@ if (!w->picture) continue; + D4printf + ("ECompMgrRepaintDetermineOrder hook in %d - %#lx desk=%d shown=%d\n", + desk, eo->win, eo->desk, eo->shown); + if (!eo_first) eo_first = eo; w->prev = eo_prev; @@ -1531,17 +1638,19 @@ ((ECmWinInfo *) (eo_prev->cmhook))->next = eo; eo_prev = eo; -#if 0 /* FIXME - We should break when the repaint region (w->clip) becomes empty */ if (eo->type == EOBJ_TYPE_DESK && eo->x == 0 && eo->y == 0) + stop = 1; + if (stop) break; -#endif } if (eo_prev) ((ECmWinInfo *) (eo_prev->cmhook))->next = NULL; - Mode_compmgr.eo_first = eo_first; - Mode_compmgr.eo_last = eo_prev; + *first = eo_first; + *last = eo_prev; + + return stop; } static void @@ -1549,6 +1658,9 @@ { Display *dpy = disp; ECmWinInfo *w; + Desk *d = DeskGet(eo->desk); + XserverRegion breg; /* Border region in screen coordinates */ + int x, y; w = eo->cmhook; @@ -1571,6 +1683,9 @@ if (EventDebug(EDBUG_TYPE_COMPMGR3)) ERegionShow("Window extents", w->extents); + x = EoGetX(d); + y = EoGetY(d); + if (mode == 0) { /* Painting opaque windows top down, updating clip regions. */ @@ -1581,10 +1696,24 @@ switch (w->mode) { case WINDOW_SOLID: + D2printf("ECompMgrRepaintObj %d %#lx %d %#lx d=%d l=%d: %s\n", + mode, eo->win, w->mode, w->picture, eo->desk, eo->ilayer, + eo->name); XFixesSetPictureClipRegion(dpy, pbuf, 0, 0, region); - XFixesSubtractRegion(dpy, region, region, w->borderSize); XRenderComposite(dpy, PictOpSrc, w->picture, None, pbuf, - 0, 0, 0, 0, w->rcx, w->rcy, w->rcw, w->rch); + 0, 0, 0, 0, x + w->rcx, y + w->rcy, w->rcw, + w->rch); + if (x == 0 && y == 0) + { + breg = w->borderSize; + } + else + { + breg = XFixesCreateRegion(dpy, 0, 0); + XFixesCopyRegion(dpy, breg, w->borderSize); + XFixesTranslateRegion(disp, breg, x, y); + } + XFixesSubtractRegion(dpy, region, region, breg); break; } } @@ -1596,10 +1725,14 @@ { case WINDOW_TRANS: case WINDOW_ARGB: + D2printf("ECompMgrRepaintObj %d %#lx %d %#lx d=%d l=%d: %s\n", + mode, eo->win, w->mode, w->picture, eo->desk, eo->ilayer, + eo->name); XFixesSetPictureClipRegion(dpy, pbuf, 0, 0, w->clip); ECompMgrCheckAlphaMask(w); XRenderComposite(dpy, PictOpOver, w->picture, w->alphaPict, pbuf, - 0, 0, 0, 0, w->rcx, w->rcy, w->rcw, w->rch); + 0, 0, 0, 0, x + w->rcx, y + w->rcy, w->rcw, + w->rch); break; } @@ -1666,19 +1799,36 @@ return; /* Do paint order list linking */ - ECompMgrRepaintDetermineOrder(); + ECompMgrRepaintDetermineOrder(NULL, 0, &Mode_compmgr.eo_first, + &Mode_compmgr.eo_last, 0); /* Paint opaque windows top down, adjusting clip regions */ for (eo = Mode_compmgr.eo_first; eo; eo = ((ECmWinInfo *) (eo->cmhook))->next) ECompMgrRepaintObj(pbuf, region, eo, 0); +#if 1 /* FIXME- New code+?? */ + if (EventDebug(EDBUG_TYPE_COMPMGR2)) + ERegionShow("ECompMgrRepaint-2", region); + { + /* Draw desktop background picture */ + pict = DeskBackgroundPictureGet(d); + D1printf("ECompMgrRepaint desk picture=%#lx\n", pict); +#if 1 + XFixesSetPictureClipRegion(dpy, pbuf, 0, 0, region); + XRenderComposite(dpy, PictOpSrc, pict, None, pbuf, + 0, 0, 0, 0, 0, 0, VRoot.w, VRoot.h); +#endif + } + +#else /* FIXME - ??? */ /* Repaint background, clipped by damage region and opaque windows */ pict = DeskBackgroundPictureGet(d); D1printf("ECompMgrRepaint desk picture=%#lx\n", pict); XFixesSetPictureClipRegion(dpy, pbuf, 0, 0, region); XRenderComposite(dpy, PictOpSrc, pict, None, pbuf, 0, 0, 0, 0, 0, 0, VRoot.w, VRoot.h); +#endif /* FIXME - ??? */ /* Paint trans windows and shadows bottom up */ for (eo = Mode_compmgr.eo_last; eo; eo = ((ECmWinInfo *) (eo->cmhook))->prev) @@ -1757,48 +1907,17 @@ region = XFixesCreateRegion(dpy, expose_rects, n_expose); - ECompMgrDamageMerge(region, 1); + ECompMgrDamageMerge(0, region, 1); n_expose = 0; } } static void -ECompMgrDeskAdd(int desk) -{ - Desk *d = DeskGet(desk); - - if (!d || d->cmhook) - return; - - D1printf("ECompMgrDeskAdd: desk=%d\n", desk); - - d->cmhook = Emalloc(sizeof(ECmDeskInfo)); - if (!d->cmhook) - return; - - ((ECmDeskInfo *) d->cmhook)->bgpict = None; -} - -static void -ECompMgrDeskDel(int desk) -{ - Desk *d = DeskGet(desk); - - if (!d || !d->cmhook) - return; - - D1printf("ECompMgrDeskDel: desk=%d\n", desk); - - DeskBackgroundPictureFree(d); - Efree(d->cmhook); -} - -static void ECompMgrDeskChanged(int desk) { Desk *d = DeskGet(desk); - if (!d || !d->cmhook) + if (!d || !d->o.cmhook) return; D1printf("ECompMgrDeskChanged: desk=%d\n", desk); @@ -1854,6 +1973,8 @@ static void ECompMgrStart(void) { + EObj *const *lst; + int i, num; XRenderPictFormat *pictfmt; XRenderPictureAttributes pa; @@ -1876,12 +1997,15 @@ SubstructureNotifyMask | ExposureMask | StructureNotifyMask); break; + case ECM_MODE_WINDOW: + ESelectInputAdd(VRoot.win, + SubstructureNotifyMask | + ExposureMask | StructureNotifyMask); + break; case ECM_MODE_AUTO: XCompositeRedirectSubwindows(disp, VRoot.win, CompositeRedirectAutomatic); break; - case ECM_MODE_WINDOW: - break; } allDamage = None; @@ -1894,6 +2018,16 @@ } EventCallbackRegister(VRoot.win, 0, ECompMgrHandleRootEvent, NULL); + + ECompMgrWinNew(&DeskGet(0)->o); + + lst = EobjListStackGet(&num); + for (i = 0; i < num; i++) + { + ECompMgrWinNew(lst[i]); + if (lst[i]->shown) + ECompMgrWinMap(lst[i]); + } } static void @@ -1922,7 +2056,12 @@ for (i = 0; i < num; i++) ECompMgrWinDel(lst[i], False, False); - XCompositeUnredirectSubwindows(disp, VRoot.win, CompositeRedirectManual); + if (allDamage) + XFixesDestroyRegion(disp, allDamage); + allDamage = None; + + if (Conf_compmgr.mode == ECM_MODE_ROOT) + XCompositeUnredirectSubwindows(disp, VRoot.win, CompositeRedirectManual); EventCallbackUnregister(VRoot.win, 0, ECompMgrHandleRootEvent, NULL); } @@ -1982,24 +2121,27 @@ /* * Event handlers */ +#define USE_WINDOW_EVENTS 0 static void ECompMgrHandleWindowEvent(XEvent * ev, void *prm) { EObj *eo = prm; + D2printf("ECompMgrHandleWindowEvent: type=%d\n", ev->type); + switch (ev->type) { -#if 0 +#if USE_WINDOW_EVENTS case ConfigureNotify: ECompMgrWinConfigure(eo, ev); break; case MapNotify: - ECompMgrWinMap(eo, ev->xmap.serial, True); + ECompMgrWinMap(eo); break; case UnmapNotify: - ECompMgrWinUnmap(eo, True); + ECompMgrWinUnmap(eo); break; case CirculateNotify: @@ -2018,6 +2160,8 @@ { EObj *eo; + D2printf("ECompMgrHandleRootEvent: type=%d\n", ev->type); + switch (ev->type) { case CreateNotify: @@ -2035,10 +2179,14 @@ EobjUnregister(ev->xdestroywindow.window); break; +#if 0 case ReparentNotify: - eo = EobjListStackFind(ev->xreparent.window); - if (eo && eo->cmhook) - ECompMgrWinUnmap(eo, True); + if (Conf_compmgr.mode != ECM_MODE_WINDOW) + { + eo = EobjListStackFind(ev->xreparent.window); + if (eo && eo->cmhook) + ECompMgrWinUnmap(eo); + } #if 0 if (ev->xreparent.parent == VRoot.win) goto case_CreateNotify; @@ -2047,6 +2195,7 @@ ECompMgrWinDel(eo, False, True); #endif break; +#endif case ConfigureNotify: if (ev->xconfigure.window == VRoot.win) @@ -2062,18 +2211,22 @@ break; case MapNotify: +#if 0 /* FIXME */ eo = EobjListStackFind(ev->xmap.window); if (!eo) eo = EobjRegister(ev->xmap.window, EOBJ_TYPE_EXT); else EobjListStackRaise(eo); /* FIXME - Use Configure/CirculateNotify */ if (eo) - ECompMgrWinMap(eo, ev->xmap.serial, True); + ECompMgrWinMap(eo); +#endif break; case UnmapNotify: +#if 0 /* FIXME */ eo = EobjListStackFind(ev->xunmap.window); if (eo && eo->cmhook) - ECompMgrWinUnmap(eo, True); + ECompMgrWinUnmap(eo); +#endif break; case CirculateNotify: @@ -2125,6 +2278,9 @@ if (Conf_compmgr.mode == ECM_MODE_OFF) Conf_compmgr.mode = ECM_MODE_ROOT; + /* FIXME - Hardcode for now. */ + Conf_compmgr.mode = ECM_MODE_WINDOW; + if (Mode_compmgr.args) { switch (Mode_compmgr.args[0]) @@ -2165,13 +2321,6 @@ ECompMgrStart(); break; - case ESIGNAL_DESK_ADDED: - ECompMgrDeskAdd((int)(prm)); - break; - case ESIGNAL_DESK_REMOVED: - ECompMgrDeskDel((int)(prm)); - break; - case ESIGNAL_BACKGROUND_CHANGE: ECompMgrDeskChanged((int)prm); break; =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/ecompmgr.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- ecompmgr.h 31 Mar 2005 23:22:02 -0000 1.5 +++ ecompmgr.h 20 Apr 2005 22:49:15 -0000 1.6 @@ -35,6 +35,10 @@ void ECompMgrWinNew(EObj * eo); void ECompMgrWinDel(EObj * eo, Bool gone, Bool do_fade); +void ECompMgrWinMap(EObj * eo); +void ECompMgrWinUnmap(EObj * eo); +void ECompMgrWinMoveResize(EObj * eo, int x, int y, int w, int h, + int bw); void ECompMgrWinChangeOpacity(EObj * eo, unsigned int opacity); Pixmap ECompMgrWinGetPixmap(const EObj * eo); void ECompMgrConfigGet(cfg_composite * cfg); =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/eobj.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -3 -r1.18 -r1.19 --- eobj.c 17 Apr 2005 21:58:32 -0000 1.18 +++ eobj.c 20 Apr 2005 22:49:15 -0000 1.19 @@ -150,6 +150,7 @@ if (eo->opacity == 0) eo->opacity = 0xFFFFFFFF; eo->shadow = 1; + ECompMgrWinNew(eo); #endif if (eo->win != VRoot.win) EobjListStackAdd(eo, 1); @@ -164,6 +165,10 @@ if (EventDebug(EDBUG_TYPE_EWINS)) Eprintf("EobjFini: %#lx %s\n", eo->win, eo->name); +#if USE_COMPOSITE + ECompMgrWinDel(eo, False, False); +#endif + EobjListStackDel(eo); if (eo->name) @@ -279,6 +284,9 @@ EobjListStackRaise(eo); EMapWindow(eo->win); +#if USE_COMPOSITE + ECompMgrWinMap(eo); +#endif } void @@ -286,9 +294,13 @@ { if (!eo->shown) return; - eo->shown = 0; EUnmapWindow(eo->win); +#if USE_COMPOSITE + if (eo->cmhook) + ECompMgrWinUnmap(eo); +#endif + eo->shown = 0; } void @@ -310,6 +322,10 @@ { EMoveResizeWindow(eo->win, x, y, w, h); } +#if USE_COMPOSITE + if (eo->cmhook) + ECompMgrWinMoveResize(eo, x, y, w, h, 0); +#endif } void @@ -341,3 +357,67 @@ ECompMgrWinChangeOpacity(eo, opacity); } #endif + +void +EobjSlideTo(EObj * eo, int fx, int fy, int tx, int ty, int speed) +{ + int k, x, y; + + ecore_x_grab(); + + ETimedLoopInit(0, 1024, speed); + for (k = 0; k <= 1024;) + { + x = ((fx * (1024 - k)) + (tx * k)) >> 10; + y = ((fy * (1024 - k)) + (ty * k)) >> 10; + EobjMove(eo, x, y); + ecore_x_sync(); + + k = ETimedLoopNext(); + } + EobjMove(eo, tx, ty); + + ecore_x_ungrab(); +} + +void +EobjsSlideBy(EObj ** peo, int num, int dx, int dy, int speed) +{ + int i, k, x, y; + struct _xy + { + int x, y; + } *xy; + + if (num <= 0) + return; + + xy = Emalloc(sizeof(struct _xy) * num); + if (!xy) + return; + + for (i = 0; i < num; i++) + { + xy[i].x = peo[i]->x; + xy[i].y = peo[i]->y; + } + + ETimedLoopInit(0, 1024, speed); + for (k = 0; k <= 1024;) + { + for (i = 0; i < num; i++) + { + x = ((xy[i].x * (1024 - k)) + ((xy[i].x + dx) * k)) >> 10; + y = ((xy[i].y * (1024 - k)) + ((xy[i].y + dy) * k)) >> 10; + EobjMove(peo[i], x, y); + } + ecore_x_sync(); + + k = ETimedLoopNext(); + } + + for (i = 0; i < num; i++) + EobjMove(peo[i], xy[i].x + dx, xy[i].y + dy); + + Efree(xy); +} =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/ewin-ops.c,v retrieving revision 1.22 retrieving revision 1.23 diff -u -3 -r1.22 -r1.23 --- ewin-ops.c 12 Apr 2005 16:43:35 -0000 1.22 +++ ewin-ops.c 20 Apr 2005 22:49:15 -0000 1.23 @@ -22,7 +22,6 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "E.h" -#include "ecompmgr.h" /* FIXME - Resize hack - to be removed */ #include "ewin-ops.h" #include "snaps.h" #include <sys/time.h> @@ -627,8 +626,7 @@ } ewin->shaded = 2; - ExMoveResizeWindow(&ewin->o, EoGetX(ewin), EoGetY(ewin), - EoGetW(ewin), EoGetH(ewin)); + EoMoveResize(ewin, EoGetX(ewin), EoGetY(ewin), EoGetW(ewin), EoGetH(ewin)); EMoveResizeWindow(ewin->win_container, -30, -30, 1, 1); EwinBorderCalcSizes(ewin); ecore_x_sync(); @@ -761,8 +759,8 @@ EMoveResizeWindow(ewin->win_container, ewin->border->border.left, ewin->border->border.top, ww, hh); - ExMoveResizeWindow(&ewin->o, EoGetX(ewin), EoGetY(ewin), - EoGetW(ewin), EoGetH(ewin)); + EoMoveResize(ewin, EoGetX(ewin), EoGetY(ewin), + EoGetW(ewin), EoGetH(ewin)); EwinBorderCalcSizes(ewin); if (ewin->client.shaped) EShapeCombineShape(ewin->win_container, @@ -802,8 +800,8 @@ EMoveResizeWindow(ewin->win_container, ewin->border->border.left, ewin->border->border.top, ww, hh); - ExMoveResizeWindow(&ewin->o, EoGetX(ewin), EoGetY(ewin), - EoGetW(ewin), EoGetH(ewin)); + EoMoveResize(ewin, EoGetX(ewin), EoGetY(ewin), + EoGetW(ewin), EoGetH(ewin)); EwinBorderCalcSizes(ewin); if (ewin->client.shaped) EShapeCombineShape(ewin->win_container, @@ -840,8 +838,8 @@ EMoveResizeWindow(ewin->win_container, ewin->border->border.left, ewin->border->border.top, ww, hh); - ExMoveResizeWindow(&ewin->o, EoGetX(ewin), EoGetY(ewin), - EoGetW(ewin), EoGetH(ewin)); + EoMoveResize(ewin, EoGetX(ewin), EoGetY(ewin), + EoGetW(ewin), EoGetH(ewin)); EwinBorderCalcSizes(ewin); if (ewin->client.shaped) EShapeCombineShape(ewin->win_container, @@ -883,8 +881,8 @@ EMoveResizeWindow(ewin->win_container, ewin->border->border.left, ewin->border->border.top, ww, hh); - ExMoveResizeWindow(&ewin->o, EoGetX(ewin), EoGetY(ewin), - EoGetW(ewin), EoGetH(ewin)); + EoMoveResize(ewin, EoGetX(ewin), EoGetY(ewin), + EoGetW(ewin), EoGetH(ewin)); EwinBorderCalcSizes(ewin); if (ewin->client.shaped) EShapeCombineShape(ewin->win_container, @@ -973,8 +971,8 @@ ewin->border->border.top, EoGetW(ewin) - ewin->border->border.left - ewin->border->border.right, ewin->client.h); - ExMoveResizeWindow(&ewin->o, EoGetX(ewin), EoGetY(ewin), - EoGetW(ewin), EoGetH(ewin)); + EoMoveResize(ewin, EoGetX(ewin), EoGetY(ewin), + EoGetW(ewin), EoGetH(ewin)); EwinBorderCalcSizes(ewin); if (ewin->client.shaped) EShapeCombineShape(ewin->win_container, @@ -1023,8 +1021,8 @@ ewin->border->border.top, EoGetW(ewin) - ewin->border->border.left - ewin->border->border.right, ewin->client.h); - ExMoveResizeWindow(&ewin->o, EoGetX(ewin), EoGetY(ewin), - EoGetW(ewin), EoGetH(ewin)); + EoMoveResize(ewin, EoGetX(ewin), EoGetY(ewin), + EoGetW(ewin), EoGetH(ewin)); EwinBorderCalcSizes(ewin); if (ewin->client.shaped) EShapeCombineShape(ewin->win_container, @@ -1065,8 +1063,8 @@ ewin->border->border.top, ewin->client.w, EoGetH(ewin) - ewin->border->border.top - ewin->border->border.bottom); - ExMoveResizeWindow(&ewin->o, EoGetX(ewin), EoGetY(ewin), - EoGetW(ewin), EoGetH(ewin)); + EoMoveResize(ewin, EoGetX(ewin), EoGetY(ewin), + EoGetW(ewin), EoGetH(ewin)); EwinBorderCalcSizes(ewin); if (ewin->client.shaped) EShapeCombineShape(ewin->win_container, @@ -1115,8 +1113,8 @@ ewin->border->border.top, ewin->client.w, EoGetH(ewin) - ewin->border->border.top - ewin->border->border.bottom); - ExMoveResizeWindow(&ewin->o, EoGetX(ewin), EoGetY(ewin), - EoGetW(ewin), EoGetH(ewin)); + EoMoveResize(ewin, EoGetX(ewin), EoGetY(ewin), + EoGetW(ewin), EoGetH(ewin)); EwinBorderCalcSizes(ewin); if (ewin->client.shaped) EShapeCombineShape(ewin->win_container, =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/ewins.c,v retrieving revision 1.42 retrieving revision 1.43 diff -u -3 -r1.42 -r1.43 --- ewins.c 17 Apr 2005 22:26:44 -0000 1.42 +++ ewins.c 20 Apr 2005 22:49:15 -0000 1.43 @@ -173,9 +173,6 @@ Eprintf("EwinDestroy %#lx %s state=%d\n", ewin->client.win, EwinGetName(ewin), ewin->state); - /* FIXME - Fading */ - ECompMgrWinDel(&ewin->o, True, False); - RemoveItem(NULL, ewin->client.win, LIST_FINDBY_ID, LIST_TYPE_EWIN); EventCallbackUnregister(EoGetWin(ewin), 0, EwinHandleEventsToplevel, ewin); EventCallbackUnregister(ewin->win_container, 0, EwinHandleEventsContainer, =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/main.c,v retrieving revision 1.123 retrieving revision 1.124 diff -u -3 -r1.123 -r1.124 --- main.c 7 Apr 2005 16:38:56 -0000 1.123 +++ main.c 20 Apr 2005 22:49:15 -0000 1.124 @@ -26,9 +26,6 @@ #include <sys/utsname.h> #include <signal.h> #include <time.h> -#if USE_COMPOSITE -#include "ecompmgr.h" -#endif const char e_wm_name[] = "Enlightenment"; const char e_wm_version[] = @@ -218,11 +215,6 @@ Mode.wm.master = 0; Mode.wm.master_screen = strtoul(eoptarg, NULL, 10); break; -#if USE_COMPOSITE - case 'C': - ECompMgrParseArgs(eoptarg); - break; -#endif } } =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/tooltips.c,v retrieving revision 1.74 retrieving revision 1.75 diff -u -3 -r1.74 -r1.75 --- tooltips.c 17 Apr 2005 13:58:09 -0000 1.74 +++ tooltips.c 20 Apr 2005 22:49:16 -0000 1.75 @@ -89,9 +89,7 @@ eo = EobjWindowCreate(EOBJ_TYPE_MISC, -50, -100, wh, wh, 1, NULL); tt->iclass[i]->ref_count++; -#if USE_COMPOSITE - eo->opacity = OpacityExt(Conf_tooltips.opacity); -#endif + EobjChangeOpacity(eo, OpacityExt(Conf_tooltips.opacity)); tt->win[i] = eo; } tt->iwin = ECreateWindow(tt->TTWIN->win, 0, 0, 1, 1, 0); ------------------------------------------------------- This SF.Net email is sponsored by: New Crystal Reports XI. Version 11 adds new functionality designed to reduce time involved in creating, integrating, and deploying reporting solutions. Free runtime info, new features, or free trial, at: http://www.businessobjects.com/devxi/728 _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs