Author: olivier Date: 2009-04-09 11:30:27 +0000 (Thu, 09 Apr 2009) New Revision: 29734
Modified: xfwm4/trunk/ChangeLog xfwm4/trunk/NEWS xfwm4/trunk/src/events.c xfwm4/trunk/src/keyboard.c Log: * src/events.c, src/keyboard.c: Fix grab remaining if shortcut is not used (Bug #5207) Modified: xfwm4/trunk/ChangeLog =================================================================== --- xfwm4/trunk/ChangeLog 2009-04-09 08:06:49 UTC (rev 29733) +++ xfwm4/trunk/ChangeLog 2009-04-09 11:30:27 UTC (rev 29734) @@ -1,3 +1,8 @@ +2009-04-09 olivier + + * src/events.c, src/keyboard.c: Fix grab remaining if shortcut is not + used (Bug #5207) + 2009-04-08 olivier * src/compositor.c: Ignore stacking when detecting overlays Modified: xfwm4/trunk/NEWS =================================================================== --- xfwm4/trunk/NEWS 2009-04-09 08:06:49 UTC (rev 29733) +++ xfwm4/trunk/NEWS 2009-04-09 11:30:27 UTC (rev 29734) @@ -15,6 +15,7 @@ (Bug #5030) - Check fullscreen status against each monitor and not just the overall screen size in the compositor. +- Fix remaining active grab if shortcut if shortcut is not used (Bug #5207) - Plug various memory leaks Modified: xfwm4/trunk/src/events.c =================================================================== --- xfwm4/trunk/src/events.c 2009-04-09 08:06:49 UTC (rev 29733) +++ xfwm4/trunk/src/events.c 2009-04-09 11:30:27 UTC (rev 29734) @@ -291,6 +291,7 @@ eventFilterStatus status; ScreenInfo *screen_info; ScreenInfo *ev_screen_info; + gboolean handled; Client *c; int key; @@ -304,6 +305,7 @@ return EVENT_FILTER_PASS; } + handled = FALSE; status = EVENT_FILTER_PASS; c = clientGetFocus (); if (c) @@ -315,23 +317,28 @@ switch (key) { case KEY_MOVE: + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); clientMove (c, (XEvent *) ev); break; case KEY_RESIZE: + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); clientResize (c, CORNER_BOTTOM_RIGHT, (XEvent *) ev); break; case KEY_CYCLE_WINDOWS: case KEY_CYCLE_REVERSE_WINDOWS: + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); clientCycle (c, ev); break; case KEY_CLOSE_WINDOW: + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); clientClose (c); break; case KEY_HIDE_WINDOW: + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); if (CLIENT_CAN_HIDE_WINDOW (c)) { @@ -339,22 +346,27 @@ } break; case KEY_MAXIMIZE_WINDOW: + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); clientToggleMaximized (c, WIN_STATE_MAXIMIZED, TRUE); break; case KEY_MAXIMIZE_VERT: + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); clientToggleMaximized (c, WIN_STATE_MAXIMIZED_VERT, TRUE); break; case KEY_MAXIMIZE_HORIZ: + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); clientToggleMaximized (c, WIN_STATE_MAXIMIZED_HORIZ, TRUE); break; case KEY_SHADE_WINDOW: + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); clientToggleShaded (c); break; case KEY_STICK_WINDOW: + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); if (FLAG_TEST(c->xfwm_flags, XFWM_FLAG_HAS_STICK)) { @@ -363,42 +375,52 @@ } break; case KEY_RAISE_WINDOW: + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); clientRaise (c, None); break; case KEY_LOWER_WINDOW: + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); clientLower (c, None); break; case KEY_TOGGLE_ABOVE: + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); clientToggleLayerAbove (c); break; case KEY_TOGGLE_FULLSCREEN: + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); clientToggleFullscreen (c); break; case KEY_MOVE_NEXT_WORKSPACE: + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); workspaceSwitch (screen_info, screen_info->current_ws + 1, c, TRUE, ev->time); break; case KEY_MOVE_PREV_WORKSPACE: + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); workspaceSwitch (screen_info, screen_info->current_ws - 1, c, TRUE, ev->time); break; case KEY_MOVE_UP_WORKSPACE: + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); workspaceMove (screen_info, -1, 0, c, ev->time); break; case KEY_MOVE_DOWN_WORKSPACE: + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); workspaceMove (screen_info, 1, 0, c, ev->time); break; case KEY_MOVE_LEFT_WORKSPACE: + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); workspaceMove (screen_info, 0, -1, c, ev->time); break; case KEY_MOVE_RIGHT_WORKSPACE: + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); workspaceMove (screen_info, 0, 1, c, ev->time); break; @@ -414,6 +436,7 @@ case KEY_MOVE_WORKSPACE_10: case KEY_MOVE_WORKSPACE_11: case KEY_MOVE_WORKSPACE_12: + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); if (key - KEY_MOVE_WORKSPACE_1 < screen_info->workspace_count) { @@ -422,20 +445,24 @@ } break; case KEY_POPUP_MENU: + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); show_window_menu (c, frameX (c) + frameLeft (c), frameY (c) + frameTop (c), Button1, ev->time); break; case KEY_FILL_WINDOW: + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); clientFill (c, CLIENT_FILL); break; case KEY_FILL_VERT: + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); clientFill (c, CLIENT_FILL_VERT); break; case KEY_FILL_HORIZ: + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); clientFill (c, CLIENT_FILL_HORIZ); break; @@ -450,6 +477,7 @@ { case KEY_CYCLE_WINDOWS: status = EVENT_FILTER_REMOVE; + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); if (ev_screen_info->clients) { @@ -458,6 +486,7 @@ break; case KEY_CLOSE_WINDOW: status = EVENT_FILTER_REMOVE; + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); if (display_info->session) { @@ -473,50 +502,60 @@ { case KEY_NEXT_WORKSPACE: status = EVENT_FILTER_REMOVE; + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); workspaceSwitch (ev_screen_info, ev_screen_info->current_ws + 1, NULL, TRUE, ev->time); break; case KEY_PREV_WORKSPACE: status = EVENT_FILTER_REMOVE; + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); workspaceSwitch (ev_screen_info, ev_screen_info->current_ws - 1, NULL, TRUE, ev->time); break; case KEY_UP_WORKSPACE: status = EVENT_FILTER_REMOVE; + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); workspaceMove(ev_screen_info, -1, 0, NULL, ev->time); break; case KEY_DOWN_WORKSPACE: status = EVENT_FILTER_REMOVE; + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); workspaceMove(ev_screen_info, 1, 0, NULL, ev->time); break; case KEY_LEFT_WORKSPACE: status = EVENT_FILTER_REMOVE; + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); workspaceMove(ev_screen_info, 0, -1, NULL, ev->time); break; case KEY_RIGHT_WORKSPACE: status = EVENT_FILTER_REMOVE; + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); workspaceMove(ev_screen_info, 0, 1, NULL, ev->time); break; case KEY_ADD_WORKSPACE: status = EVENT_FILTER_REMOVE; + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); workspaceSetCount (ev_screen_info, ev_screen_info->workspace_count + 1); break; case KEY_DEL_WORKSPACE: status = EVENT_FILTER_REMOVE; + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); workspaceSetCount (ev_screen_info, ev_screen_info->workspace_count - 1); break; case KEY_ADD_ADJACENT_WORKSPACE: XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); + handled = TRUE; workspaceInsert (ev_screen_info, ev_screen_info->current_ws + 1); break; case KEY_DEL_ACTIVE_WORKSPACE: XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); + handled = TRUE; workspaceDelete (ev_screen_info, ev_screen_info->current_ws); break; case KEY_WORKSPACE_1: @@ -532,6 +571,7 @@ case KEY_WORKSPACE_11: case KEY_WORKSPACE_12: status = EVENT_FILTER_REMOVE; + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); if (key - KEY_WORKSPACE_1 < ev_screen_info->workspace_count) { @@ -540,6 +580,7 @@ break; case KEY_SHOW_DESKTOP: status = EVENT_FILTER_REMOVE; + handled = TRUE; XAllowEvents (display_info->dpy, AsyncKeyboard, ev->time); toggle_show_desktop (ev_screen_info); break; @@ -547,6 +588,13 @@ break; } + if (!handled) + { + /* That should not happen, really */ + g_warning ("Unhandled keyboard shortcut"); + XAllowEvents (display_info->dpy, AsyncKeyboard, CurrentTime); + } + return status; } Modified: xfwm4/trunk/src/keyboard.c =================================================================== --- xfwm4/trunk/src/keyboard.c 2009-04-09 08:06:49 UTC (rev 29733) +++ xfwm4/trunk/src/keyboard.c 2009-04-09 11:30:27 UTC (rev 29734) @@ -129,48 +129,43 @@ status = GrabSuccess; if (key->keycode) { - if (key->modifier == 0) + if (key->modifier != 0) { status |= - XGrabKey (dpy, key->keycode, AnyModifier, w, - TRUE, GrabModeAsync, GrabModeSync); - } - else - { - /* Here we grab all combinations of well known modifiers */ - status |= XGrabKey (dpy, key->keycode, key->modifier, w, TRUE, GrabModeAsync, GrabModeSync); - status |= - XGrabKey (dpy, key->keycode, - key->modifier | ScrollLockMask, w, - TRUE, GrabModeAsync, GrabModeSync); - status |= - XGrabKey (dpy, key->keycode, - key->modifier | NumLockMask, w, - TRUE, GrabModeAsync, GrabModeSync); - status |= - XGrabKey (dpy, key->keycode, - key->modifier | LockMask, w, - TRUE, GrabModeAsync, GrabModeSync); - status |= - XGrabKey (dpy, key->keycode, - key->modifier | ScrollLockMask | NumLockMask, w, - TRUE, GrabModeAsync, GrabModeSync); - status |= - XGrabKey (dpy, key->keycode, - key->modifier | ScrollLockMask | LockMask, w, - TRUE, GrabModeAsync, GrabModeSync); - status |= - XGrabKey (dpy, key->keycode, - key->modifier | LockMask | NumLockMask, w, - TRUE, GrabModeAsync, GrabModeSync); - status |= - XGrabKey (dpy, key->keycode, - key->modifier | ScrollLockMask | LockMask | NumLockMask, w, - TRUE, GrabModeAsync, GrabModeSync); } + + /* Here we grab all combinations of well known modifiers */ + status |= + XGrabKey (dpy, key->keycode, + key->modifier | ScrollLockMask, w, + TRUE, GrabModeAsync, GrabModeSync); + status |= + XGrabKey (dpy, key->keycode, + key->modifier | NumLockMask, w, + TRUE, GrabModeAsync, GrabModeSync); + status |= + XGrabKey (dpy, key->keycode, + key->modifier | LockMask, w, + TRUE, GrabModeAsync, GrabModeSync); + status |= + XGrabKey (dpy, key->keycode, + key->modifier | ScrollLockMask | NumLockMask, w, + TRUE, GrabModeAsync, GrabModeSync); + status |= + XGrabKey (dpy, key->keycode, + key->modifier | ScrollLockMask | LockMask, w, + TRUE, GrabModeAsync, GrabModeSync); + status |= + XGrabKey (dpy, key->keycode, + key->modifier | LockMask | NumLockMask, w, + TRUE, GrabModeAsync, GrabModeSync); + status |= + XGrabKey (dpy, key->keycode, + key->modifier | ScrollLockMask | LockMask | NumLockMask, w, + TRUE, GrabModeAsync, GrabModeSync); } return (status == GrabSuccess); _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits