diff -ruN compiz-20060223./plugins/switcher.c compiz-20060223/plugins/switcher.c --- compiz-20060223./plugins/switcher.c 2006-02-23 02:36:26.000000000 +0100 +++ compiz-20060223/plugins/switcher.c 2006-02-23 16:33:23.330820040 +0100 @@ -61,6 +61,8 @@ #define SWITCH_MIPMAP_DEFAULT TRUE +#define SWITCH_ALL_DESKTOPS_DEFAULT TRUE + static char *winType[] = { "Toolbar", "Utility", @@ -87,7 +89,8 @@ #define SWITCH_SCREEN_OPTION_TIMESTEP 5 #define SWITCH_SCREEN_OPTION_WINDOW_TYPE 6 #define SWITCH_SCREEN_OPTION_MIPMAP 7 -#define SWITCH_SCREEN_OPTION_NUM 8 +#define SWITCH_SCREEN_OPTION_ALL_DESKTOPS 8 +#define SWITCH_SCREEN_OPTION_NUM 9 typedef struct _SwitchScreen { PreparePaintScreenProc preparePaintScreen; @@ -240,6 +243,10 @@ case SWITCH_SCREEN_OPTION_MIPMAP: if (compSetBoolOption (o, value)) return TRUE; + break; + case SWITCH_SCREEN_OPTION_ALL_DESKTOPS: + if (compSetBoolOption (o, value)) + return TRUE; default: break; } @@ -339,6 +346,13 @@ o->longDesc = "Generate mipmaps when possible for higher quality scaling"; o->type = CompOptionTypeBool; o->value.b = SWITCH_MIPMAP_DEFAULT; + + o = &ss->opt[SWITCH_SCREEN_OPTION_ALL_DESKTOPS]; + o->name = "all_dekstops"; + o->shortDesc = "All Desktops"; + o->longDesc = "Switch between windows on all virtual desktops"; + o->type = CompOptionTypeBool; + o->value.b = SWITCH_ALL_DESKTOPS_DEFAULT; } static void @@ -355,6 +369,7 @@ static Bool isSwitchWin (CompWindow *w) { + int workspaceX, winRealX, winWorkspace; SWITCH_SCREEN (w->screen); if (!w->mapNum || w->attrib.map_state != IsViewable) @@ -369,6 +384,17 @@ if (w->state & CompWindowStateSkipPagerMask) return FALSE; + if (!ss->opt[SWITCH_SCREEN_OPTION_ALL_DESKTOPS].value.b) + { + /* only switch between windows in the current workspace + Tiago Sousa */ + workspaceX = w->screen->width * w->screen->x; + winRealX = w->serverX + workspaceX; + winWorkspace = floor((double)winRealX / (double)w->screen->width); + if (winWorkspace != w->screen->x) + return FALSE; + } + return TRUE; }