Allow focus changing via window cycling without necessarily raising the selected window. Method 1: press either Ctrl while holding down (typically) Alt to activate this feature and exit window cycling. Method 2: use the new "cycle windows (no raise)" shortcut, which defaults to Ctrl-Alt-Tab. Signed-off-by: Darren Salt diff -urNad xfwm4-4.4.0~/mcs-plugin/xfwm4_shortcuteditor.c xfwm4-4.4.0/mcs-plugin/xfwm4_shortcuteditor.c --- xfwm4-4.4.0~/mcs-plugin/xfwm4_shortcuteditor.c 2007-01-20 18:20:22.000000000 +0000 +++ xfwm4-4.4.0/mcs-plugin/xfwm4_shortcuteditor.c 2007-02-03 19:25:38.655139622 +0000 @@ -323,6 +323,7 @@ "shade_window_key", "stick_window_key", "cycle_windows_key", + "cycle_windows_no_raise_key", "move_window_up_key", "move_window_down_key", "move_window_left_key", @@ -364,6 +365,7 @@ N_("Shade window"), N_("Stick window"), N_("Cycle windows"), + N_("Cycle windows (no raising)"), N_("Move window up"), N_("Move window down"), N_("Move window left"), diff -urNad xfwm4-4.4.0~/src/client.c xfwm4-4.4.0/src/client.c --- xfwm4-4.4.0~/src/client.c 2007-02-03 19:25:19.166980563 +0000 +++ xfwm4-4.4.0/src/client.c 2007-02-03 19:36:04.844250458 +0000 @@ -111,6 +111,9 @@ Tabwin *tabwin; Window wireframe; int cycle_range; + gboolean raise; + KeyCode cycle; + int modifier; }; typedef struct _ButtonPressData ButtonPressData; @@ -4597,9 +4600,7 @@ ClientCycleData *passdata; Client *c, *removed; eventFilterStatus status; - KeyCode cycle; KeyCode cancel; - int modifier; gboolean key_pressed, cycling, gone; TRACE ("entering clientCycleEventFilter"); @@ -4615,10 +4616,8 @@ c = passdata->c; screen_info = c->screen_info; display_info = screen_info->display_info; - cycle = screen_info->params->keys[KEY_CYCLE_WINDOWS].keycode; cancel = screen_info->params->keys[KEY_CANCEL].keycode; - modifier = screen_info->params->keys[KEY_CYCLE_WINDOWS].modifier; - key_pressed = ((xevent->type == KeyPress) && ((xevent->xkey.keycode == cycle) || + key_pressed = ((xevent->type == KeyPress) && ((xevent->xkey.keycode == passdata->cycle) || (xevent->xkey.keycode == cancel))); status = EVENT_FILTER_STOP; cycling = TRUE; @@ -4656,7 +4655,7 @@ cycling = FALSE; } /* If KEY_CYCLE_WINDOWS has Shift, then do not reverse */ - else if (!(modifier & ShiftMask) && (xevent->xkey.state & ShiftMask)) + else if (!(passdata->modifier & ShiftMask) && (xevent->xkey.state & ShiftMask)) { TRACE ("Cycle: previous"); c2 = tabwinSelectPrev(passdata->tabwin); @@ -4673,7 +4672,7 @@ } /* If last key press event had not our modifier pressed, finish cycling */ - if (!(xevent->xkey.state & modifier)) + if (!(xevent->xkey.state & passdata->modifier)) { cycling = FALSE; } @@ -4696,10 +4695,13 @@ { int keysym = XLookupKeysym (&xevent->xkey, 0); - if (!(xevent->xkey.state & modifier) || + if (!(xevent->xkey.state & passdata->modifier) || (IsModifierKey(keysym) && (keysym != XK_Shift_L) && (keysym != XK_Shift_R))) { cycling = FALSE; + /* If KEY_CYCLE_WINDOWS* has Control, deny raise flag negation */ + if (!(passdata->modifier & ControlMask) && ((keysym == XK_Control_L) || (keysym == XK_Control_R))) + passdata->raise = !passdata->raise; } } break; @@ -4724,7 +4726,7 @@ } void -clientCycle (Client * c, XEvent * ev) +clientCycle (Client * c, XEvent * ev, gboolean raise) { ScreenInfo *screen_info; DisplayInfo *display_info; @@ -4776,6 +4778,10 @@ passdata.c = c; } + passdata.raise = raise; + passdata.cycle = ev->xkey.keycode; + passdata.modifier = ev->xkey.state; + if (passdata.c) { GdkPixbuf *icon; @@ -4817,7 +4823,8 @@ clientShow (c, TRUE); clientSetFocus (screen_info, c, myDisplayGetCurrentTime (display_info), NO_FOCUS_FLAG); - clientRaise (c, None); + if (passdata.raise) + clientRaise (c, None); } myScreenUngrabKeyboard (screen_info); diff -urNad xfwm4-4.4.0~/src/client.h xfwm4-4.4.0/src/client.h --- xfwm4-4.4.0~/src/client.h 2007-01-20 18:20:18.000000000 +0000 +++ xfwm4-4.4.0/src/client.h 2007-02-03 19:29:33.421055736 +0000 @@ -385,7 +385,8 @@ int, XEvent *); void clientCycle (Client *, - XEvent *); + XEvent *, + gboolean); void clientButtonPress (Client *, Window, XButtonEvent *); diff -urNad xfwm4-4.4.0~/src/events.c xfwm4-4.4.0/src/events.c --- xfwm4-4.4.0~/src/events.c 2007-01-20 18:20:18.000000000 +0000 +++ xfwm4-4.4.0/src/events.c 2007-02-03 19:32:24.934455596 +0000 @@ -411,7 +411,10 @@ } break; case KEY_CYCLE_WINDOWS: - clientCycle (c, (XEvent *) ev); + clientCycle (c, (XEvent *) ev, TRUE); + break; + case KEY_CYCLE_WINDOWS_NO_RAISE: + clientCycle (c, (XEvent *) ev, FALSE); break; case KEY_CLOSE_WINDOW: clientClose (c); @@ -511,7 +514,13 @@ case KEY_CYCLE_WINDOWS: if (ev_screen_info->clients) { - clientCycle (ev_screen_info->clients->prev, (XEvent *) ev); + clientCycle (ev_screen_info->clients->prev, (XEvent *) ev, TRUE); + } + break; + case KEY_CYCLE_WINDOWS_NO_RAISE: + if (ev_screen_info->clients) + { + clientCycle (ev_screen_info->clients->prev, (XEvent *) ev, FALSE); } break; case KEY_CLOSE_WINDOW: diff -urNad xfwm4-4.4.0~/src/screen.c xfwm4-4.4.0/src/screen.c --- xfwm4-4.4.0~/src/screen.c 2007-01-20 18:20:18.000000000 +0000 +++ xfwm4-4.4.0/src/screen.c 2007-02-03 19:30:20.149437124 +0000 @@ -417,6 +417,7 @@ grabKey (dpy, &screen_info->params->keys[KEY_ADD_WORKSPACE], screen_info->xroot); grabKey (dpy, &screen_info->params->keys[KEY_CLOSE_WINDOW], screen_info->xroot); grabKey (dpy, &screen_info->params->keys[KEY_CYCLE_WINDOWS], screen_info->xroot); + grabKey (dpy, &screen_info->params->keys[KEY_CYCLE_WINDOWS_NO_RAISE], screen_info->xroot); grabKey (dpy, &screen_info->params->keys[KEY_DEL_WORKSPACE], screen_info->xroot); grabKey (dpy, &screen_info->params->keys[KEY_DOWN_WORKSPACE], screen_info->xroot); grabKey (dpy, &screen_info->params->keys[KEY_HIDE_WINDOW], screen_info->xroot); diff -urNad xfwm4-4.4.0~/src/settings.c xfwm4-4.4.0/src/settings.c --- xfwm4-4.4.0~/src/settings.c 2007-01-20 18:20:18.000000000 +0000 +++ xfwm4-4.4.0/src/settings.c 2007-02-03 19:25:38.627139393 +0000 @@ -1199,6 +1199,7 @@ parseKeyString (dpy, &screen_info->params->keys[KEY_CANCEL], getValue ("cancel_key", rc)); parseKeyString (dpy, &screen_info->params->keys[KEY_CLOSE_WINDOW], getValue ("close_window_key", rc)); parseKeyString (dpy, &screen_info->params->keys[KEY_CYCLE_WINDOWS], getValue ("cycle_windows_key", rc)); + parseKeyString (dpy, &screen_info->params->keys[KEY_CYCLE_WINDOWS_NO_RAISE], getValue ("cycle_windows_no_raise_key", rc)); parseKeyString (dpy, &screen_info->params->keys[KEY_DEL_WORKSPACE], getValue ("del_workspace_key", rc)); parseKeyString (dpy, &screen_info->params->keys[KEY_DOWN_WORKSPACE], getValue ("down_workspace_key", rc)); parseKeyString (dpy, &screen_info->params->keys[KEY_HIDE_WINDOW], getValue ("hide_window_key", rc)); @@ -1358,6 +1359,7 @@ {"cancel_key", NULL, TRUE}, {"close_window_key", NULL, TRUE}, {"cycle_windows_key", NULL, TRUE}, + {"cycle_windows_no_raise_key", NULL, TRUE}, {"del_workspace_key", NULL, TRUE}, {"down_workspace_key", NULL, TRUE}, {"fullscreen_key", NULL, TRUE}, diff -urNad xfwm4-4.4.0~/src/settings.h xfwm4-4.4.0/src/settings.h --- xfwm4-4.4.0~/src/settings.h 2007-01-20 18:20:18.000000000 +0000 +++ xfwm4-4.4.0/src/settings.h 2007-02-03 19:31:16.649898270 +0000 @@ -134,6 +134,7 @@ KEY_WORKSPACE_10, KEY_WORKSPACE_11, KEY_WORKSPACE_12, + KEY_CYCLE_WINDOWS_NO_RAISE, KEY_COUNT }; #define KEY_LAST (KEY_COUNT - 1) diff -urNad xfwm4-4.4.0~/themes/default.keys/keythemerc xfwm4-4.4.0/themes/default.keys/keythemerc --- xfwm4-4.4.0~/themes/default.keys/keythemerc 2007-01-20 18:20:15.000000000 +0000 +++ xfwm4-4.4.0/themes/default.keys/keythemerc 2007-02-03 19:25:38.627139393 +0000 @@ -2,6 +2,7 @@ cancel_key=Escape close_window_key=Alt+F4 cycle_windows_key=Alt+Tab +cycle_windows_no_raise_key=Control+Alt+Tab del_workspace_key=Alt+Delete down_workspace_key=Control+Alt+Down fullscreen_key=Alt+F11