Index: beryl-plugins/src/fadedesktop.c =================================================================== --- beryl-plugins/src/fadedesktop.c (Revision 4223) +++ beryl-plugins/src/fadedesktop.c (Arbeitskopie) @@ -29,27 +29,24 @@ #include #include -#define FD_INITIATE_KEY_DEFAULT "F6" -#define FD_INITIATE_MODIFIERS_DEFAULT CompSuperMask -#define FD_INITIATE_EDGE_DEFAULT 0 +#define FD_FADETIME_DEFAULT 500 +#define FD_FADETIME_MIN 1 +#define FD_FADETIME_MAX 5000 -#define FD_SPEED_DEFAULT 20 -#define FD_SPEED_MIN 1 -#define FD_SPEED_MAX 100 +#define FD_SCREEN_OPTION_FADETIME 0 +#define FD_SCREEN_OPTION_NUM 1 +typedef enum +{ + FD_STATE_OFF = 0, + FD_STATE_OUT, + FD_STATE_ON, + FD_STATE_IN +} FadeDesktopState; -#define FD_DISPLAY_OPTION_INITIATE 0 -#define FD_DISPLAY_OPTION_NUM 1 - -#define FD_SCREEN_OPTION_SPEED 0 -#define FD_SCREEN_OPTION_NUM 1 - - - typedef struct _FadeDesktopDisplay { int screenPrivateIndex; - CompOption opt[FD_DISPLAY_OPTION_NUM]; } FadeDesktopDisplay; typedef struct _FadeDesktopScreen @@ -58,15 +55,17 @@ PreparePaintScreenProc preparePaintScreen; DonePaintScreenProc donePaintScreen; + EnterShowDesktopNotifyProc enterShowDesktopNotify; + LeaveShowDesktopNotifyProc leaveShowDesktopNotify; CompOption opt[FD_SCREEN_OPTION_NUM]; - - Bool showingDesktop; - Bool reverting; + FadeDesktopState state; + int fadeTime; } FadeDesktopScreen; typedef struct _FadeDesktopWindow { + Bool fading; Bool isHidden; } FadeDesktopWindow; @@ -101,201 +100,163 @@ if (w->state & CompWindowStateOffscreenMask) return FALSE; - if (w->wmType & (CompWindowTypeDesktopMask | CompWindowTypeDockMask)) + if (w->attrib.override_redirect) return FALSE; - if (w->type & (CompWindowTypeNormalMask | CompWindowTypeDialogMask ) ) - { - return TRUE; - } - return FALSE; + if (!w->managed) + return FALSE; + + if (!(w->wmType & w->screen->showingDesktopMask)) + return FALSE; + + if (!(w->type & w->screen->showingDesktopMask)) + return FALSE; + + return TRUE; } -static Bool -fadeDesktopTerminate(CompDisplay *d, CompAction * action, CompActionState state, CompOption *option, int nOption) +static void +fadeDesktopPreparePaintScreen(CompScreen *s, int msSinceLastPaint) { - CompScreen *s; - Window xid; + FD_SCREEN(s); - xid = getIntOptionNamed(option,nOption,"root",0); - s = findScreenAtDisplay(d,xid); + fs->fadeTime -= msSinceLastPaint; + if (fs->fadeTime < 0) + fs->fadeTime = 0; - - if (s) + if ((fs->state == FD_STATE_OUT) || (fs->state == FD_STATE_IN)) { - FD_SCREEN(s); - fs->reverting = TRUE; CompWindow *w; - for (w=s->windows; w; w=w->next) + for (w = s->windows; w; w = w->next) { FD_WINDOW(w); - if (fw->isHidden && (w->state & CompWindowStateOffscreenMask)) + if (fw->fading) { - moveWindowOnscreen(w); + int newOpacity = w->opacity * ((fs->state == FD_STATE_OUT) ? fs->fadeTime : + fs->opt[FD_SCREEN_OPTION_FADETIME].value.i - fs->fadeTime) / + fs->opt[FD_SCREEN_OPTION_FADETIME].value.i; + setWindowOpacity(w, newOpacity, PL_TEMP_HELLO); + + if (fs->fadeTime == 0) + { + resetWindowOpacity(w, PL_TEMP_HELLO); + if (fs->state == FD_STATE_OUT) + { + moveWindowOffscreen(w); + fw->isHidden = TRUE; + } + fw->fading = FALSE; + } } - fw->isHidden = FALSE; } - } - return TRUE; - + UNWRAP(fs,s,preparePaintScreen); + (*s->preparePaintScreen) (s,msSinceLastPaint); + WRAP(fs,s,preparePaintScreen,fadeDesktopPreparePaintScreen); } - -static Bool -fadeDesktopInitiate(CompDisplay *d, CompAction *action, CompActionState state, CompOption *option, int nOption) +static void fadeDesktopDonePaintScreen(CompScreen *s) { - CompScreen *s; - Window xid; - xid = getIntOptionNamed(option,nOption,"root",0); - s = findScreenAtDisplay(d,xid); - - - - if (s) + FD_SCREEN(s); + + if ((fs->state == FD_STATE_OUT) || (fs->state == FD_STATE_IN)) { - FD_SCREEN(s); - - if (fs->showingDesktop) + if (fs->fadeTime <= 0) { - fs->showingDesktop = FALSE; - fadeDesktopTerminate(d, action, state, option, nOption); - return TRUE; + if (fs->state == FD_STATE_OUT) + fs->state = FD_STATE_ON; + else + fs->state = FD_STATE_OFF; } - else if (fs->reverting) - { - fs->reverting = FALSE; - } - fs->showingDesktop = TRUE; - - unsigned long data = 0; - XChangeProperty(s->display->display, s->root, - s->display->showingDesktopAtom, - XA_CARDINAL, 32, PropModeReplace, - (unsigned char *)&data, 1); - + else + damageScreen(s); } - return TRUE; - + + UNWRAP(fs,s,donePaintScreen); + (*s->donePaintScreen)(s); + WRAP(fs,s,donePaintScreen,fadeDesktopDonePaintScreen); } -static void -fadeDesktopPreparePaintScreen(CompScreen *s, int msSinceLastPaint) +static int fadeDesktopEnterShowDesktopNotify(CompScreen *s) { FD_SCREEN(s); - #define SPEED ((fs->opt[FD_SCREEN_OPTION_SPEED].value.i ? fs->opt[FD_SCREEN_OPTION_SPEED].value.i : 1)) - - int numWins=0; - int numReverts=0; - CompWindow *w; - for (w=s->windows; w; w=w->next) + int count = 0; + + if ((fs->state == FD_STATE_OFF) || (fs->state == FD_STATE_IN)) { - if (isFDWin(w)) + fs->state = FD_STATE_OUT; + + fs->fadeTime = fs->opt[FD_SCREEN_OPTION_FADETIME].value.i - + fs->fadeTime; + + for (w = s->windows; w; w = w->next) { - if (fs->showingDesktop) + if (isFDWin(w)) { - if (w->paint.opacity > OPAQUE/SPEED) - { - setWindowOpacity(w,w->paint.opacity-OPAQUE/SPEED,PL_TEMP_HELLO); - } - else if (w->paint.opacity != 0) - { - FD_WINDOW(w); + FD_WINDOW(w); - moveWindowOffscreen(w); - fw->isHidden = TRUE; - } + fw->fading = TRUE; + w->inShowDesktopMode = TRUE; + count++; } - - if (fs->reverting) - { - if (w->paint.opacity + OPAQUE/SPEED <= w->opacity) - { - setWindowOpacity(w,w->paint.opacity + OPAQUE/SPEED,PL_TEMP_HELLO); - } - else - { - resetWindowOpacity(w, PL_TEMP_HELLO); - numReverts++; - } - - } - numWins++; - - - } - } - if (numWins == numReverts) - { - fs->reverting = FALSE; - unsigned long data = 0; - XChangeProperty(s->display->display, s->root, - s->display->showingDesktopAtom, - XA_CARDINAL, 32, PropModeReplace, - (unsigned char *)&data, 1); - } - UNWRAP(fs,s,preparePaintScreen); - (*s->preparePaintScreen) (s,msSinceLastPaint); - WRAP(fs,s,preparePaintScreen,fadeDesktopPreparePaintScreen); + damageScreen(s); + } + return count; } -static void fadeDesktopDonePaintScreen(CompScreen *s) +static int fadeDesktopLeaveShowDesktopNotify(CompScreen *s, CompWindow *w) { FD_SCREEN(s); - if (fs->showingDesktop || fs->reverting) + + if ((fs->state == FD_STATE_ON) || (fs->state == FD_STATE_OUT)) { + fs->state = FD_STATE_IN; + + fs->fadeTime = fs->opt[FD_SCREEN_OPTION_FADETIME].value.i - + fs->fadeTime; + + for (w = s->windows; w; w = w->next) + { + if (w->inShowDesktopMode) + { + FD_WINDOW(w); + if (fw->isHidden) + { + moveWindowOnscreen(w); + fw->isHidden = FALSE; + fw->fading = TRUE; + } + w->inShowDesktopMode = FALSE; + } + } + damageScreen(s); } - UNWRAP(fs,s,donePaintScreen); - (*s->donePaintScreen)(s); - WRAP(fs,s,donePaintScreen,fadeDesktopDonePaintScreen); -} -static void -fadeDesktopDisplayInitOptions(FadeDesktopDisplay *fd) -{ - CompOption *o; - o = &fd->opt[FD_DISPLAY_OPTION_INITIATE]; - o->advanced = False; - o->name = "initiate"; - o->group = N_("Misc. Options"); - o->subGroup = N_(""); - o->displayHints = ""; - o->shortDesc = N_("Initiate Fade to Desktop"); - o->longDesc = N_("Initiate Fade to Desktop mode."); - o->type = CompOptionTypeAction; - o->value.action.initiate= fadeDesktopInitiate; - o->value.action.terminate = fadeDesktopTerminate; - o->value.action.bell = FALSE; - o->value.action.edgeMask = FD_INITIATE_EDGE_DEFAULT; - o->value.action.type = CompBindingTypeKey; - o->value.action.state = CompActionStateInitKey; - o->value.action.state |= CompActionStateInitEdge; - o->value.action.key.modifiers = FD_INITIATE_MODIFIERS_DEFAULT; - o->value.action.key.keysym = XStringToKeysym(FD_INITIATE_KEY_DEFAULT); + return TRUE; } static void fadeDesktopScreenInitOptions(FadeDesktopScreen * fs) { CompOption *o; - o = &fs->opt[FD_SCREEN_OPTION_SPEED]; + o = &fs->opt[FD_SCREEN_OPTION_FADETIME]; o->advanced = False; - o->name = "speed"; + o->name = "fadetime"; o->group = N_("Misc. Options"); o->subGroup = N_(""); o->displayHints = ""; - o->shortDesc = N_("Time to Fade"); + o->shortDesc = N_("Time to Fade (ms)"); o->longDesc = N_("Time to Fade."); o->type = CompOptionTypeInt; - o->value.i = FD_SPEED_DEFAULT; - o->rest.i.min = FD_SPEED_MIN; - o->rest.i.max = FD_SPEED_MAX; + o->value.i = FD_FADETIME_DEFAULT; + o->rest.i.min = FD_FADETIME_MIN; + o->rest.i.max = FD_FADETIME_MAX; } static Bool fadeDesktopInit(CompPlugin *p) @@ -326,7 +287,6 @@ free(fd); return FALSE; } - fadeDesktopDisplayInitOptions(fd); d->privates[displayPrivateIndex].ptr = fd; return TRUE; @@ -356,13 +316,13 @@ } fadeDesktopScreenInitOptions(fs); - - fs->showingDesktop = FALSE; + fs->state = FD_STATE_OFF; + fs->fadeTime = 0; - addScreenAction(s, &fd->opt[FD_DISPLAY_OPTION_INITIATE].value.action); - WRAP(fs,s,preparePaintScreen,fadeDesktopPreparePaintScreen); WRAP(fs,s,donePaintScreen,fadeDesktopDonePaintScreen); + WRAP(fs, s, enterShowDesktopNotify, fadeDesktopEnterShowDesktopNotify); + WRAP(fs, s, leaveShowDesktopNotify, fadeDesktopLeaveShowDesktopNotify); s->privates[fd->screenPrivateIndex].ptr = fs; @@ -373,13 +333,12 @@ static void fadeDesktopFiniScreen(CompPlugin *p, CompScreen *s) { FD_SCREEN(s); - FD_DISPLAY(s->display); UNWRAP(fs,s,preparePaintScreen); UNWRAP(fs,s,donePaintScreen); + UNWRAP(fs, s, enterShowDesktopNotify); + UNWRAP(fs, s, leaveShowDesktopNotify); - removeScreenAction(s, &fd->opt[FD_DISPLAY_OPTION_INITIATE].value.action); - freeWindowPrivateIndex(s, fs->windowPrivateIndex); free (fs); @@ -395,6 +354,7 @@ return FALSE; fw->isHidden = FALSE; + fw->fading = FALSE; w->privates[fs->windowPrivateIndex].ptr = fw; @@ -405,7 +365,6 @@ static void fadeDesktopFiniWindow(CompPlugin *p, CompWindow *w) { FD_WINDOW(w); - FD_SCREEN(w->screen); free (fw); } @@ -413,48 +372,6 @@ #define NUM_OPTIONS(s) (sizeof ((s)->opt) / sizeof (CompOption)) -static CompOption *fadeDesktopGetDisplayOptions(CompDisplay *display, int *count) -{ - if (display) - { - FD_DISPLAY(display); - - *count = NUM_OPTIONS(fd); - return fd->opt; - } - else - { - FadeDesktopDisplay *fd = malloc(sizeof(FadeDesktopDisplay)); - - fadeDesktopDisplayInitOptions(fd); - *count = NUM_OPTIONS(fd); - return fd->opt; - } -} - -static Bool -fadeDesktopSetDisplayOption(CompDisplay *display, char * name, CompOptionValue *value) -{ - - FD_DISPLAY(display); - CompOption *o; - int index; - o = compFindOption(fd->opt,FD_DISPLAY_OPTION_NUM,name,&index); - - if (!o) - return FALSE; - - switch (index) - { - case FD_DISPLAY_OPTION_INITIATE: - if (setDisplayAction(display,o,value)) - return TRUE; - default: - break; - } - return FALSE; -} - static CompOption *fadeDesktopGetScreenOptions(CompScreen * screen, int *count) { @@ -488,7 +405,7 @@ switch (index) { - case FD_SCREEN_OPTION_SPEED: + case FD_SCREEN_OPTION_FADETIME: if (compSetIntOption(o,value)) { return TRUE; @@ -515,8 +432,8 @@ fadeDesktopFiniScreen, fadeDesktopInitWindow, fadeDesktopFiniWindow, - fadeDesktopGetDisplayOptions, - fadeDesktopSetDisplayOption, + NULL, + NULL, fadeDesktopGetScreenOptions, fadeDesktopSetScreenOption, 0, Index: beryl-core/include/beryl.h =================================================================== --- beryl-core/include/beryl.h (Revision 4223) +++ beryl-core/include/beryl.h (Arbeitskopie) @@ -26,7 +26,7 @@ #ifndef _BERYL_H #define _BERYL_H -#define BERYL_VERSION 54 +#define BERYL_VERSION 55 #define BERYL_ABI_INFO \ BERYL_VERSION, \ @@ -1643,6 +1643,9 @@ typedef void (*OutputChangeNotifyProc) (CompScreen *s); +typedef int (*EnterShowDesktopNotifyProc) (CompScreen *s); +typedef Bool (*LeaveShowDesktopNotifyProc) (CompScreen *s, CompWindow *w); + #define COMP_SCREEN_DAMAGE_PENDING_MASK (1 << 0) #define COMP_SCREEN_DAMAGE_REGION_MASK (1 << 1) #define COMP_SCREEN_DAMAGE_ALL_MASK (1 << 2) @@ -1923,6 +1926,9 @@ WindowGrabNotifyProc windowGrabNotify; WindowUngrabNotifyProc windowUngrabNotify; + EnterShowDesktopNotifyProc enterShowDesktopNotify; + LeaveShowDesktopNotifyProc leaveShowDesktopNotify; + WindowStateChangeNotifyProc windowStateChangeNotify; OutputChangeNotifyProc outputChangeNotify; @@ -2131,6 +2137,12 @@ leaveShowDesktopMode (CompScreen *s, CompWindow *window); +int +enterShowDesktopNotify (CompScreen *s); + +Bool +leaveShowDesktopNotify (CompScreen *s, CompWindow *w); + void sendWindowActivationRequest (CompScreen *s, Window id); Index: beryl-core/src/screen.c =================================================================== --- beryl-core/src/screen.c (Revision 4223) +++ beryl-core/src/screen.c (Arbeitskopie) @@ -1341,6 +1341,9 @@ s->windowGrabNotify = windowGrabNotify; s->windowUngrabNotify = windowUngrabNotify; + s->enterShowDesktopNotify = enterShowDesktopNotify; + s->leaveShowDesktopNotify = leaveShowDesktopNotify; + s->windowStateChangeNotify = windowStateChangeNotify; s->outputChangeNotify = outputChangeNotify; @@ -3490,31 +3493,48 @@ } } +int enterShowDesktopNotify(CompScreen *s) +{ + return -1; +} + +Bool leaveShowDesktopNotify(CompScreen *s, CompWindow *w) +{ + return FALSE; +} + void enterShowDesktopMode(CompScreen * s) { CompDisplay *d = s->display; CompWindow *w; unsigned long data = 1; int count = 0; - CompOption *st = &d->opt[COMP_DISPLAY_OPTION_HIDE_SKIP_TASKBAR_WINDOWS]; s->showingDesktopMask = ~(CompWindowTypeDesktopMask | CompWindowTypeDockMask); + + count = (*s->enterShowDesktopNotify)(s); - for (w = s->windows; w; w = w->next) + if (count < 0) { + count = 0; + CompOption *st = &d->opt[COMP_DISPLAY_OPTION_HIDE_SKIP_TASKBAR_WINDOWS]; + + for (w = s->windows; w; w = w->next) + { if ((s->showingDesktopMask & w->type) && (!(w->state & CompWindowStateSkipTaskbarMask) || st->value.b)) { - if ((*s->focusWindow) (w)) - { - w->inShowDesktopMode = TRUE; - hideWindow(w); - } + if ((*s->focusWindow) (w)) + { + w->inShowDesktopMode = TRUE; + hideWindow(w); + } } if (w->inShowDesktopMode) count++; + } } if (!count) @@ -3536,11 +3556,14 @@ if (window) { - if (!window->inShowDesktopMode) + if (!(*s->leaveShowDesktopNotify)(s, window)) + { + if (!window->inShowDesktopMode) return; - window->inShowDesktopMode = FALSE; - showWindow(window); + window->inShowDesktopMode = FALSE; + showWindow(window); + } /* return if some other window is still in show desktop mode */ for (w = s->windows; w; w = w->next) @@ -3553,13 +3576,16 @@ { s->showingDesktopMask = 0; - for (w = s->windows; w; w = w->next) + if (!(*s->leaveShowDesktopNotify)(s, NULL)) { + for (w = s->windows; w; w = w->next) + { if (!w->inShowDesktopMode) continue; w->inShowDesktopMode = FALSE; showWindow(w); + } } } Index: makeall =================================================================== --- makeall (Revision 4223) +++ makeall (Arbeitskopie) @@ -3,12 +3,14 @@ DEFCFLAGS="-O0 -ggdb3 -gstabs+ -Wall" MYCFLAGS=${CFLAGS:-$DEFCFLAGS} -DEFPREFIX="/usr" +DEFPREFIX="/usr/local" MYPREFIX=${PREFIX:-$DEFPREFIX} +export PKG_CONFIG_PATH=$DEFPREFIX/lib/pkgconfig:$PKG_CONFIG_PATH + if svn up then - ITEMS="beryl-core beryl-plugins beryl-settings-bindings beryl-settings beryl-manager emerald emerald-themes aquamarine heliodor" + ITEMS="beryl-core beryl-plugins beryl-plugins-unsupported beryl-settings-bindings beryl-settings beryl-manager emerald emerald-themes aquamarine heliodor" for item in $ITEMS do cd $item