Enlightenment CVS committal Author : kwo Project : e16 Module : e
Dir : e16/e/src Modified Files: ecompmgr.c ecompmgr.h eobj.c Log Message: Fix various composite manager bugs (hidden damage, shape during fadeout, fading while sliding). =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/ecompmgr.c,v retrieving revision 1.69 retrieving revision 1.70 diff -u -3 -r1.69 -r1.70 --- ecompmgr.c 4 Oct 2005 16:42:01 -0000 1.69 +++ ecompmgr.c 4 Oct 2005 22:08:10 -0000 1.70 @@ -175,6 +175,9 @@ XserverRegion rgn_screen; } Mode_compmgr; +#define _ECM_SET_CLIP_CHANGED() Mode_compmgr.reorder = 1 +#define _ECM_SET_STACK_CHANGED() Mode_compmgr.reorder = 1 + static Picture rootPicture; static Picture rootBuffer; @@ -191,7 +194,11 @@ static void ECompMgrHandleRootEvent(XEvent * ev, void *prm); static void ECompMgrHandleWindowEvent(XEvent * ev, void *prm); static void doECompMgrWinFade(int val, void *data); +static void ECompMgrWinSetPicts(EObj * eo); static void ECompMgrWinFadeOutEnd(EObj * eo); +static int ECompMgrDetermineOrder(EObj * const *lst, int num, + EObj ** first, EObj ** last, + Desk * dsk, XserverRegion clip); /* * Visuals @@ -283,6 +290,18 @@ } static void +ERegionIntersect(XserverRegion dst, XserverRegion src) +{ + XFixesIntersectRegion(disp, dst, dst, src); +} + +static void +ERegionUnion(XserverRegion dst, XserverRegion src) +{ + XFixesUnionRegion(disp, dst, dst, src); +} + +static void ERegionLimit(XserverRegion rgn) { XserverRegion screen; @@ -292,13 +311,7 @@ Mode_compmgr.rgn_screen = screen = ERegionCreateRect(0, 0, VRoot.w, VRoot.h); - XFixesIntersectRegion(disp, rgn, rgn, screen); -} - -static void -ERegionUnion(XserverRegion dst, XserverRegion src) -{ - XFixesUnionRegion(disp, dst, dst, src); + ERegionIntersect(rgn, screen); } static void @@ -338,6 +351,12 @@ int i, nr; XRectangle *pr; + if (rgn == None) + { + Eprintf(" - region: %s %#lx is None\n", txt, rgn); + return; + } + pr = XFixesFetchRegion(disp, rgn, &nr); if (!pr || nr <= 0) { @@ -577,6 +596,7 @@ static void ECompMgrDamageMergeObject(EObj * eo, XserverRegion damage, int destroy) { + ECmWinInfo *cw = eo->cmhook; Desk *dsk = eo->desk; if (damage == None) @@ -589,17 +609,34 @@ return; } - if (dsk->num > 0) + if (Mode_compmgr.reorder) + ECompMgrDetermineOrder(NULL, 0, &Mode_compmgr.eo_first, + &Mode_compmgr.eo_last, DeskGet(0), None); + + if (cw->clip == None) { - if (EoGetX(dsk) != 0 || EoGetY(dsk) != 0) - { - if (!destroy) - damage = ERegionClone(damage); - ERegionTranslate(damage, EoGetX(dsk), EoGetY(dsk)); - } + /* Clip may be None if window is not in paint list */ + if (destroy) + ERegionDestroy(damage); + return; } - ECompMgrDamageMerge(damage, destroy); + if (!destroy) + damage = ERegionClone(damage); +#if 0 /* FIXME - Remove */ + ERegionShow("ECompMgrDamageMergeObject damage A:", damage); + ERegionShow("ECompMgrDamageMergeObject clip:", cw->clip); +#endif + if (eo->type != EOBJ_TYPE_DESK) + ERegionIntersect(damage, cw->clip); +#if 0 /* FIXME - Remove */ + ERegionShow("ECompMgrDamageMergeObject damage B:", damage); +#endif + + if (dsk->num > 0 && (EoGetX(dsk) != 0 || EoGetY(dsk) != 0)) + ERegionTranslate(damage, EoGetX(dsk), EoGetY(dsk)); + + ECompMgrDamageMerge(damage, 1); } static void @@ -949,6 +986,17 @@ if (EventDebug(EDBUG_TYPE_COMPMGR3)) ERegionShow("extents", rgn); +#if 0 /* FIXME - Set picture clip region */ + if (cw->shadow) + { + XserverRegion clip; + + clip = ERegionClone(cw->extents); + ERegionSubtractOffset(clip, 0, 0, cw->shape); + XFixesSetPictureClipRegion(disp, cw->shadow, 0, 0, clip); + ERegionDestroy(clip); + } +#endif return rgn; } @@ -1067,8 +1115,7 @@ D1printf("ECompMgrWinSetOpacity: %#lx opacity=%#x\n", eo->win, cw->opacity); - if (eo->shown || cw->fadeout) /* FIXME - ??? */ - /* Extents may be unchanged, however, we must repaint */ + if (eo->shown || cw->fadeout) ECompMgrDamageMergeObject(eo, cw->extents, 0); /* Invalidate stuff changed by opacity */ @@ -1082,6 +1129,10 @@ mode = WINDOW_TRANS; else mode = WINDOW_SOLID; + + if (mode != cw->mode) + _ECM_SET_CLIP_CHANGED(); + cw->mode = mode; } @@ -1192,6 +1243,7 @@ #endif cw->fadeout = 1; ECompMgrWinInvalidate(eo, INV_PICTURE); + ECompMgrWinSetPicts(eo); ECompMgrWinFade(eo, cw->opacity, 0x10000000); } @@ -1206,6 +1258,7 @@ cw->fadeout = 0; ECompMgrWinInvalidate(eo, INV_PIXMAP | INV_PICTURE); ECompMgrDamageMergeObject(eo, cw->extents, 0); + _ECM_SET_CLIP_CHANGED(); } void @@ -1216,7 +1269,7 @@ if (!cw) return; - if (Conf_compmgr.fading.enable && eo->fade) + if (eo->shown && Conf_compmgr.fading.enable && eo->fade) ECompMgrWinFade(eo, cw->opacity, opacity); else ECompMgrWinSetOpacity(eo, opacity); @@ -1239,6 +1292,8 @@ if (cw->extents == None) cw->extents = win_extents(eo); + + _ECM_SET_STACK_CHANGED(); ECompMgrDamageMergeObject(eo, cw->extents, 0); if (Conf_compmgr.fading.enable && eo->fade) @@ -1257,7 +1312,10 @@ if (Conf_compmgr.fading.enable && eo->fade) ECompMgrWinFadeOut(eo); else - ECompMgrWinInvalidate(eo, INV_PIXMAP); + { + _ECM_SET_STACK_CHANGED(); + ECompMgrWinInvalidate(eo, INV_PIXMAP); + } } static void @@ -1277,7 +1335,7 @@ return; } - if (cw->pixmap == None && + if (cw->pixmap == None && eo->shown && (Mode_compmgr.use_pixmap || Conf_compmgr.fading.enable)) { cw->pixmap = XCompositeNameWindowPixmap(disp, eo->win); @@ -1292,6 +1350,8 @@ if ((cw->pixmap && Mode_compmgr.use_pixmap) || (cw->fadeout)) draw = cw->pixmap; + if (draw == None) + return; pictfmt = XRenderFindVisualFormat(disp, cw->a.visual); pa.subwindow_mode = IncludeInferiors; @@ -1299,6 +1359,15 @@ pictfmt, CPSubwindowMode, &pa); D2printf("ECompMgrWinSetPicts %#lx: Pict=%#lx (drawable=%#lx)\n", eo->win, cw->picture, draw); + + if (draw == cw->pixmap) + { + XserverRegion clip; + + clip = ERegionCreateFromWindow(eo->win); + XFixesSetPictureClipRegion(disp, cw->picture, 0, 0, clip); + ERegionDestroy(clip); + } } } @@ -1375,7 +1444,7 @@ ECompMgrWinMoveResize(EObj * eo, int change_xy, int change_wh, int change_bw) { ECmWinInfo *cw = eo->cmhook; - XserverRegion damage = None; + XserverRegion damage; int invalidate; D1printf("ECompMgrWinMoveResize %#lx xy=%d wh=%d bw=%d\n", @@ -1400,24 +1469,28 @@ } /* Invalidate old window region */ - damage = ERegionCreate(); - if (cw->extents != None) - ERegionCopy(damage, cw->extents); + damage = cw->extents; + cw->extents = None; if (EventDebug(EDBUG_TYPE_COMPMGR3)) ERegionShow("old-extents:", damage); +#if 0 /* FIXME - We shouldn't have to update clip if transparent */ + if (cw->mode == WINDOW_UNREDIR || cw->mode == WINDOW_SOLID) +#endif + _ECM_SET_CLIP_CHANGED(); ECompMgrWinInvalidate(eo, invalidate); - /* Find new window region */ - cw->extents = win_extents(eo); - -#if 1 - /* Hmmm. Why if not changed? - To get shadows painted. */ /* Invalidate new window region */ - ERegionUnion(damage, cw->extents); -#endif - - ECompMgrDamageMergeObject(eo, damage, 1); + cw->extents = win_extents(eo); + if (damage != None) + { + ERegionUnion(damage, cw->extents); + ECompMgrDamageMergeObject(eo, damage, 1); + } + else + { + ECompMgrDamageMergeObject(eo, cw->extents, 0); + } } static void @@ -1459,7 +1532,6 @@ if (EventDebug(EDBUG_TYPE_COMPMGR3)) ERegionShow("old-extents:", cw->extents); ECompMgrDamageMergeObject(eo, cw->extents, change_xy); - if (change_xy) { cw->extents = None; @@ -1467,8 +1539,9 @@ /* Find new window region */ cw->extents = win_extents(eo); - ECompMgrDamageMergeObject(eo, cw->extents, 0); } + _ECM_SET_STACK_CHANGED(); + ECompMgrDamageMergeObject(eo, cw->extents, 0); } static void @@ -1476,7 +1549,7 @@ { D1printf("ECompMgrWinCirculate %#lx %#lx\n", ev->xany.window, eo->win); - /* FIXME - Check if stacking was changed */ + _ECM_SET_STACK_CHANGED(); } void @@ -1489,22 +1562,30 @@ ECompMgrDamageMergeObject(eo, cw->extents, 1); cw->extents = None; + _ECM_SET_CLIP_CHANGED(); ECompMgrWinInvalidate(eo, INV_SIZE); } void -ECompMgrWinChangeStacking(EObj * eo) +ECompMgrWinRaise(EObj * eo) { ECmWinInfo *cw = eo->cmhook; - D1printf("ECompMgrWinChangeStacking %#lx\n", eo->win); + D1printf("ECompMgrWinRaise %#lx\n", eo->win); -#if 0 /* FIXME - Remove? */ - if (Conf_compmgr.shadows.mode == ECM_SHADOWS_OFF) - return; -#endif + _ECM_SET_STACK_CHANGED(); + ECompMgrDamageMergeObject(eo, cw->extents, 0); +} + +void +ECompMgrWinLower(EObj * eo) +{ + ECmWinInfo *cw = eo->cmhook; + + D1printf("ECompMgrWinLower %#lx\n", eo->win); ECompMgrDamageMergeObject(eo, cw->extents, 0); + _ECM_SET_STACK_CHANGED(); } void @@ -1534,7 +1615,9 @@ XCompositeUnredirectWindow(disp, eo->win, CompositeRedirectManual); } - ECompMgrDamageMergeObject(eo, cw->extents, 0); + ECompMgrDamageMergeObject(eo, cw->extents, 1); + cw->extents = None; + _ECM_SET_STACK_CHANGED(); ECompMgrWinInvalidate(eo, INV_ALL); if (!eo->gone) @@ -1598,17 +1681,72 @@ 0, 0, 0); } +static void +ECompMgrWinDumpInfo(const char *txt, EObj * eo, XserverRegion rgn, int force) +{ + ECmWinInfo *cw = eo->cmhook; + + Eprintf("%s %#lx: %d,%d %dx%d: %s\n", txt, eo->win, eo->x, eo->y, + eo->w, eo->h, eo->name); + if (!cw) + { + Eprintf("Not managed\n"); + return; + } + + if (force || EventDebug(EDBUG_TYPE_COMPMGR3)) + { + Eprintf(" - pict=%#lx pmap=%#lx\n", cw->picture, cw->pixmap); + + ERegionShow("win extents", cw->extents); + ERegionShow("win shape ", cw->shape); + ERegionShow("win clip ", cw->clip); + ERegionShow("region", rgn); + } +} + +static void +ECompMgrDestroyClip(void) +{ + EObj *eo, *const *lst; + ECmWinInfo *cw; + int i, num; + + lst = EobjListStackGet(&num); + for (i = 0; i < num; i++) + { + eo = lst[i]; + cw = eo->cmhook; + if (!cw) + continue; + if (cw->clip != None) + ERegionDestroy(cw->clip); + cw->clip = None; + } +} + static int -ECompMgrRepaintDetermineOrder(EObj * const *lst, int num, EObj ** first, - EObj ** last, Desk * dsk) +ECompMgrDetermineOrder(EObj * const *lst, int num, EObj ** first, + EObj ** last, Desk * dsk, XserverRegion clip) { EObj *eo, *eo_prev, *eo_first; int i, stop; ECmWinInfo *cw; - D4printf("ECompMgrRepaintDetermineOrder %d\n", dsk->num); + D1printf("ECompMgrDetermineOrder %d\n", dsk->num); if (!lst) lst = EobjListStackGet(&num); + if (clip == None) + { + ECompMgrDestroyClip(); + clip = ERegionCreateRect(0, 0, VRoot.w, VRoot.h); + } + else + { + clip = ERegionClone(clip); + if (EoGetX(dsk) != 0 || EoGetY(dsk) != 0) + ERegionTranslate(clip, -EoGetX(dsk), -EoGetY(dsk)); + } /* Determine overall paint order, top to bottom */ stop = 0; @@ -1626,8 +1764,18 @@ if ((!eo->shown && !cw->fading) || eo->desk != dsk) continue; - D4printf(" - %#lx desk=%d shown=%d\n", eo->win, eo->desk->num, - eo->shown); + /* Region of shaped window in screen coordinates */ + if (cw->shape == None) + cw->shape = win_shape(eo); + + /* Region of window in screen coordinates, including shadows */ + if (cw->extents == None) + cw->extents = win_extents(eo); + + cw->clip = ERegionClone(clip); + + D4printf(" - %#lx desk=%d shown=%d fading=%d fadeout=%d\n", eo->win, + eo->desk->num, eo->shown, cw->fading, cw->fadeout); if (eo->type == EOBJ_TYPE_DESK) { @@ -1638,7 +1786,7 @@ if (!d->viewable) continue; - stop = ECompMgrRepaintDetermineOrder(lst, num, &eo1, &eo2, d); + stop = ECompMgrDetermineOrder(lst, num, &eo1, &eo2, d, clip); if (eo1) { ec1 = eo1->cmhook; @@ -1664,7 +1812,7 @@ continue; D4printf - ("ECompMgrRepaintDetermineOrder hook in %d - %#lx desk=%d shown=%d\n", + ("ECompMgrDetermineOrder hook in %d - %#lx desk=%d shown=%d\n", dsk->num, eo->win, eo->desk->num, eo->shown); if (!eo_first) @@ -1674,7 +1822,22 @@ ((ECmWinInfo *) (eo_prev->cmhook))->next = eo; eo_prev = eo; - /* FIXME - We should break when the repaint region (cw->clip) becomes empty */ + switch (cw->mode) + { + case WINDOW_UNREDIR: + case WINDOW_SOLID: + D4printf("- clip %#lx %#lx %d,%d %dx%d: %s\n", eo->win, cw->clip, + eo->x, eo->y, eo->w, eo->h, eo->name); + ERegionSubtractOffset(clip, 0, 0, cw->shape); + break; + + default: + D4printf("- noclip %#lx %#lx %d,%d %dx%d: %s\n", eo->win, cw->clip, + eo->x, eo->y, eo->w, eo->h, eo->name); + break; + } + + /* FIXME - We should break when the clip region becomes empty */ if (eo->type == EOBJ_TYPE_DESK && eo->x == 0 && eo->y == 0) stop = 1; if (stop) @@ -1686,12 +1849,15 @@ *first = eo_first; *last = eo_prev; + ERegionDestroy(clip); + Mode_compmgr.reorder = 0; return stop; } static void ECompMgrRepaintObj(Picture pbuf, XserverRegion region, EObj * eo, int mode) { + static XserverRegion clip = None; Display *dpy = disp; ECmWinInfo *cw; Desk *dsk = eo->desk; @@ -1699,35 +1865,42 @@ cw = eo->cmhook; - D2printf("ECompMgrRepaintObj mode=%d %#lx %s\n", mode, eo->win, eo->name); - +#if 1 /* FIXME - Remove? */ if (!cw->shape) cw->shape = win_shape(eo); - if (EventDebug(EDBUG_TYPE_COMPMGR3)) - ERegionShow("shape", cw->shape); - if (!cw->extents) cw->extents = win_extents(eo); - if (EventDebug(EDBUG_TYPE_COMPMGR3)) - ERegionShow("extents", cw->extents); +#endif + + if (clip == None) + clip = ERegionCreate(); x = EoGetX(dsk); y = EoGetY(dsk); + ERegionCopy(clip, cw->clip); + if (x != 0 || y != 0) + ERegionTranslate(clip, x, y); + ERegionIntersect(clip, region); + if (mode == 0) { - /* Painting opaque windows top down, updating clip regions. */ - - cw->clip = ERegionClone(region); + /* Painting opaque windows top down. */ +#if 0 + if (ERegionIsEmpty(clip)) + { + D2printf(" - Quit - repaint region is empty\n"); + return; + } +#endif switch (cw->mode) { case WINDOW_UNREDIR: case WINDOW_SOLID: - D2printf(" * solid pict=%#lx d=%d l=%d\n", - cw->picture, eo->desk->num, eo->ilayer); - ERegionLimit(region); - XFixesSetPictureClipRegion(dpy, pbuf, 0, 0, region); + if (EventDebug(EDBUG_TYPE_COMPMGR2)) + ECompMgrWinDumpInfo("ECompMgrRepaintObj solid", eo, clip, 0); + XFixesSetPictureClipRegion(dpy, pbuf, 0, 0, clip); XRenderComposite(dpy, PictOpSrc, cw->picture, None, pbuf, 0, 0, 0, 0, x + cw->rcx, y + cw->rcy, cw->rcw, cw->rch); @@ -1743,10 +1916,9 @@ { case WINDOW_TRANS: case WINDOW_ARGB: - D2printf(" * trans pict=%#lx d=%d l=%d\n", - cw->picture, eo->desk->num, eo->ilayer); - ERegionLimit(cw->clip); - XFixesSetPictureClipRegion(dpy, pbuf, 0, 0, cw->clip); + if (EventDebug(EDBUG_TYPE_COMPMGR2)) + ECompMgrWinDumpInfo("ECompMgrRepaintObj trans", eo, clip, 0); + XFixesSetPictureClipRegion(dpy, pbuf, 0, 0, clip); ECompMgrCheckAlphaMask(cw); XRenderComposite(dpy, PictOpOver, cw->picture, cw->alphaPict, pbuf, 0, 0, 0, 0, x + cw->rcx, y + cw->rcy, cw->rcw, @@ -1755,18 +1927,21 @@ } #if ENABLE_SHADOWS + if (!eo->shadow) + return; + switch (Conf_compmgr.shadows.mode) { case ECM_SHADOWS_OFF: break; + case ECM_SHADOWS_SHARP: if (cw->opacity != OPAQUE && !cw->shadowPict) cw->shadowPict = EPictureCreateSolid(True, (double)cw->opacity / OPAQUE * 0.3, 0, 0, 0); - ERegionSubtractOffset(cw->clip, x, y, cw->shape); - ERegionLimit(cw->clip); - XFixesSetPictureClipRegion(dpy, pbuf, 0, 0, cw->clip); + ERegionSubtractOffset(clip, x, y, cw->shape); + XFixesSetPictureClipRegion(dpy, pbuf, 0, 0, clip); XRenderComposite(dpy, PictOpOver, cw->shadowPict ? cw-> shadowPict : transBlackPicture, cw->picture, pbuf, @@ -1775,13 +1950,13 @@ y + cw->rcy + cw->shadow_dy, cw->shadow_width, cw->shadow_height); break; + case ECM_SHADOWS_BLURRED: if (cw->shadow == None) break; - ERegionSubtractOffset(cw->clip, x, y, cw->shape); - ERegionLimit(cw->clip); - XFixesSetPictureClipRegion(dpy, pbuf, 0, 0, cw->clip); + ERegionSubtractOffset(clip, x, y, cw->shape); + XFixesSetPictureClipRegion(dpy, pbuf, 0, 0, clip); XRenderComposite(dpy, PictOpOver, blackPicture, cw->shadow, pbuf, 0, 0, 0, 0, x + cw->rcx + cw->shadow_dx, @@ -1790,9 +1965,6 @@ break; } #endif - - ERegionDestroy(cw->clip); - cw->clip = None; } } @@ -1825,13 +1997,8 @@ /* Do paint order list linking */ if (Mode_compmgr.reorder) - { - ECompMgrRepaintDetermineOrder(NULL, 0, &Mode_compmgr.eo_first, - &Mode_compmgr.eo_last, dsk); -#if 0 /* Not yet */ - Mode_compmgr.reorder = 0; -#endif - } + ECompMgrDetermineOrder(NULL, 0, &Mode_compmgr.eo_first, + &Mode_compmgr.eo_last, dsk, None); /* Paint opaque windows top down, adjusting clip regions */ for (eo = Mode_compmgr.eo_first; eo; @@ -1851,7 +2018,7 @@ /* Paint trans windows and shadows bottom up */ for (eo = Mode_compmgr.eo_last; eo; eo = ((ECmWinInfo *) (eo->cmhook))->prev) - ECompMgrRepaintObj(pbuf, None, eo, 1); + ECompMgrRepaintObj(pbuf, allDamage, eo, 1); if (pbuf != rootPicture) { @@ -2039,8 +2206,6 @@ if (lst[i]->shown) ECompMgrWinMap(lst[i]); } - - Mode_compmgr.reorder = 1; } static void @@ -2394,6 +2559,17 @@ { /* TBD */ } + else if (!strncmp(cmd, "oi", 2)) + { + Window win; + EObj *eo; + + win = None; + sscanf(prm, "%lx", &win); + eo = EobjListStackFind(win); + if (eo) + ECompMgrWinDumpInfo("EObj", eo, None, 1); + } } IpcItem CompMgrIpcArray[] = { =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/ecompmgr.h,v retrieving revision 1.19 retrieving revision 1.20 diff -u -3 -r1.19 -r1.20 --- ecompmgr.h 18 Sep 2005 06:35:37 -0000 1.19 +++ ecompmgr.h 4 Oct 2005 22:08:12 -0000 1.20 @@ -48,7 +48,8 @@ int change_wh, int change_bw); void ECompMgrWinReparent(EObj * eo, struct _desk *dsk, int change_xy); -void ECompMgrWinChangeStacking(EObj * eo); +void ECompMgrWinRaise(EObj * eo); +void ECompMgrWinLower(EObj * eo); void ECompMgrWinChangeShape(EObj * eo); void ECompMgrWinChangeOpacity(EObj * eo, unsigned int opacity); =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/eobj.c,v retrieving revision 1.52 retrieving revision 1.53 diff -u -3 -r1.52 -r1.53 --- eobj.c 30 Sep 2005 18:56:45 -0000 1.52 +++ eobj.c 4 Oct 2005 22:08:13 -0000 1.53 @@ -394,7 +394,7 @@ return num; #if USE_COMPOSITE if (eo->shown && eo->cmhook) - ECompMgrWinChangeStacking(eo); + ECompMgrWinRaise(eo); #endif return num; } @@ -409,7 +409,7 @@ return num; #if USE_COMPOSITE if (eo->shown && eo->cmhook) - ECompMgrWinChangeStacking(eo); + ECompMgrWinLower(eo); #endif return num; } ------------------------------------------------------- This SF.Net email is sponsored by: Power Architecture Resource Center: Free content, downloads, discussions, and more. http://solutions.newsforge.com/ibmarch.tmpl _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs