diff --git a/src/desktops.c b/src/desktops.c index 8df27ef9..a3255102 100644 --- a/src/desktops.c +++ b/src/desktops.c @@ -473,12 +473,10 @@ DeskDestroy(Desk * dsk) Efree(dsk); } -Win -DeskGetBackgroundWin(const Desk * dsk) +EObj * +DeskGetBackgroundObj(const Desk * dsk) { - if (!dsk) - return VROOT; - return EobjGetWin(dsk->bg.o); + return (dsk) ? dsk->bg.o : NULL; } Pixmap diff --git a/src/desktops.h b/src/desktops.h index b40b95ab..cbeba4ca 100644 --- a/src/desktops.h +++ b/src/desktops.h @@ -69,7 +69,7 @@ void DeskSetDirtyStack(Desk * dsk, EObj * eo); void DeskGoto(Desk * dsk); void DeskGotoNum(unsigned int desk); void DeskRestack(Desk * dsk); -Win DeskGetBackgroundWin(const Desk * dsk); +EObj *DeskGetBackgroundObj(const Desk * dsk); Pixmap DeskGetBackgroundPixmap(const Desk * dsk); Background *DeskBackgroundGet(const Desk * dsk); diff --git a/src/ecompmgr.c b/src/ecompmgr.c index 64a7a055..b9f3c9c6 100644 --- a/src/ecompmgr.c +++ b/src/ecompmgr.c @@ -49,6 +49,7 @@ #include #include #include +#include #include #define ENABLE_SHADOWS 1 @@ -463,6 +464,19 @@ ERegionShow(const char *txt, XserverRegion rgn) XFree(pr); } +void +ECompMgrWinClipToGC(EObj * eo, GC gc) +{ + XserverRegion rgn = rgn_tmp2; + + if (!eo || !eo->cmhook) + return; + + ERegionCopy(rgn, Mode_compmgr.rgn_screen); + ERegionSubtract(rgn, eo->cmhook->clip); + XFixesSetGCClipRegion(disp, gc, 0, 0, rgn); +} + /* * Pictures */ diff --git a/src/ecompmgr.h b/src/ecompmgr.h index 3cda86ab..8ff4ca83 100644 --- a/src/ecompmgr.h +++ b/src/ecompmgr.h @@ -58,6 +58,7 @@ void ECompMgrWinChangeShape(EObj * eo); void ECompMgrWinChangeOpacity(EObj * eo, unsigned int opacity); void ECompMgrWinChangeShadow(EObj * eo, int shadow); Pixmap ECompMgrWinGetPixmap(const EObj * eo); +void ECompMgrWinClipToGC(EObj * eo, GC gc); void ECompMgrConfigGet(cfg_composite * cfg); void ECompMgrConfigSet(const cfg_composite * cfg); diff --git a/src/fx.c b/src/fx.c index 4d2f04fa..818030c6 100644 --- a/src/fx.c +++ b/src/fx.c @@ -23,6 +23,7 @@ #include "E.h" #include "desktops.h" #include "dialog.h" +#include "ecompmgr.h" #include "eimage.h" #include "emodule.h" #include "settings.h" @@ -53,6 +54,13 @@ typedef struct { char paused; } FXHandler; +#if USE_COMPOSITE +/* As of composite 0.4 we need to set the clip region */ +#define SET_GC_CLIP(eo, gc) ECompMgrWinClipToGC(eo, gc) +#else +#define SET_GC_CLIP(eo, gc) +#endif + /****************************** RIPPLES *************************************/ #define fx_ripple_waterh 64 @@ -67,12 +75,15 @@ FX_ripple_timeout(void *data __UNUSED__) static double incv = 0, inch = 0; static GC gc1 = 0, gc = 0; int y; + EObj *bgeo; + + bgeo = DeskGetBackgroundObj(DesksGetCurrent()); if (fx_ripple_above == None) { XGCValues gcv; - fx_ripple_win = DeskGetBackgroundWin(DesksGetCurrent()); + fx_ripple_win = EobjGetWin(bgeo); fx_ripple_above = ECreatePixmap(fx_ripple_win, WinGetW(VROOT), @@ -87,23 +98,23 @@ FX_ripple_timeout(void *data __UNUSED__) } if (fx_ripple_count == 0) - XCopyArea(disp, EoGetXwin(DesksGetCurrent()), fx_ripple_above, gc, 0, + XCopyArea(disp, WinGetXwin(fx_ripple_win), fx_ripple_above, gc, 0, WinGetH(VROOT) - (fx_ripple_waterh * 3), WinGetW(VROOT), fx_ripple_waterh * 2, 0, 0); fx_ripple_count++; if (fx_ripple_count > 32) fx_ripple_count = 0; + incv += 0.40; if (incv > (M_PI_2 * 4)) - { - incv = 0; - } + incv = 0; inch += 0.32; if (inch > (M_PI_2 * 4)) - { - inch = 0; - } + inch = 0; + + SET_GC_CLIP(bgeo, gc1); + for (y = 0; y < fx_ripple_waterh; y++) { double aa, a, p; @@ -196,6 +207,9 @@ FX_raindrops_timeout(void *data __UNUSED__) static char first = 1; static char sintab[256]; static unsigned char disttab[fx_raindrop_size][fx_raindrop_size]; + EObj *bgeo; + + bgeo = DeskGetBackgroundObj(DesksGetCurrent()); if (fx_raindrops_win == None) { @@ -221,7 +235,7 @@ FX_raindrops_timeout(void *data __UNUSED__) } } - fx_raindrops_win = DeskGetBackgroundWin(DesksGetCurrent()); + fx_raindrops_win = EobjGetWin(bgeo); if (gc) EXFreeGC(gc); @@ -252,6 +266,8 @@ FX_raindrops_timeout(void *data __UNUSED__) } } + SET_GC_CLIP(bgeo, gc1); + for (i = 0; i < fx_raindrops_number; i++) { fx_raindrops[i].count++; @@ -469,13 +485,16 @@ FX_Wave_timeout(void *data __UNUSED__) double incx2; static GC gc1 = 0, gc = 0; int y; + EObj *bgeo; + + bgeo = DeskGetBackgroundObj(DesksGetCurrent()); /* Check to see if we need to create stuff */ if (!fx_wave_above) { XGCValues gcv; - fx_wave_win = DeskGetBackgroundWin(DesksGetCurrent()); + fx_wave_win = EobjGetWin(bgeo); fx_wave_above = ECreatePixmap(fx_wave_win, WinGetW(VROOT), FX_WAVE_WATERH * 2, 0); @@ -491,7 +510,7 @@ FX_Wave_timeout(void *data __UNUSED__) /* On the zero, grab the desktop again. */ if (fx_wave_count == 0) { - XCopyArea(disp, EoGetXwin(DesksGetCurrent()), fx_wave_above, gc, 0, + XCopyArea(disp, WinGetXwin(fx_wave_win), fx_wave_above, gc, 0, WinGetH(VROOT) - (FX_WAVE_WATERH * 3), WinGetW(VROOT), FX_WAVE_WATERH * 2, 0, 0); } @@ -514,6 +533,8 @@ FX_Wave_timeout(void *data __UNUSED__) if (incx > (M_PI_2 * 4)) incx = 0; + SET_GC_CLIP(bgeo, gc1); + /* Copy the area to correct bugs */ if (fx_wave_count == 0) { @@ -620,10 +641,12 @@ static int FX_imagespinner_timeout(void *data __UNUSED__) { char *string = NULL; + EObj *bgeo; if (fx_imagespinner_win == None) { - fx_imagespinner_win = DeskGetBackgroundWin(DesksGetCurrent()); + bgeo = DeskGetBackgroundObj(DesksGetCurrent()); + fx_imagespinner_win = EobjGetWin(bgeo); } #if 0 /* Don't use getword */ @@ -671,7 +694,10 @@ FX_ImageSpinner_Init(const char *name) static void FX_ImageSpinner_Desk(void) { - fx_imagespinner_win = DeskGetBackgroundWin(DesksGetCurrent()); + EObj *bgeo; + + bgeo = DeskGetBackgroundObj(DesksGetCurrent()); + fx_imagespinner_win = EobjGetWin(bgeo); } static void