diff options
author | Elijah Newren <newren@math.utah.edu> | 2004-10-20 23:13:13 +0000 |
---|---|---|
committer | Elijah Newren <newren@src.gnome.org> | 2004-10-20 23:13:13 +0000 |
commit | 442fb19c115d967e3b9d6a29f253797aeac8b677 (patch) | |
tree | b6d79565b23e31a1d95df57d64e6cfb7b6ff944f | |
parent | 1d173183b3624a3c91c06642f0e4200ea86ead6a (diff) | |
download | metacity-442fb19c115d967e3b9d6a29f253797aeac8b677.tar.gz |
Patch from Soeren to fix the modifier key breakage introduced by an Xorg
2004-10-20 Elijah Newren <newren@math.utah.edu>
Patch from Soeren to fix the modifier key breakage introduced by
an Xorg change. (fixes #151554)
* src/keybindings.c: include X11/XKBlib.h if available,
(handle_spew_mark): remove this unused function declaration,
(end_keyboard_grab): new function, uses XKB if available,
(process_tab_grab): use end_keyboard_grab to determine whether to
end the grab, (error_on_command): make key a const char *,
(process_workspace_switch_grab): use end_keyboard_grab to
determine whether to end the grab
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | src/keybindings.c | 51 |
2 files changed, 50 insertions, 14 deletions
@@ -1,3 +1,16 @@ +2004-10-20 Elijah Newren <newren@math.utah.edu> + + Patch from Soeren to fix the modifier key breakage introduced by + an Xorg change. (fixes #151554) + + * src/keybindings.c: include X11/XKBlib.h if available, + (handle_spew_mark): remove this unused function declaration, + (end_keyboard_grab): new function, uses XKB if available, + (process_tab_grab): use end_keyboard_grab to determine whether to + end the grab, (error_on_command): make key a const char *, + (process_workspace_switch_grab): use end_keyboard_grab to + determine whether to end the grab + 2004-10-19 Anders Carlsson <andersca@gnome.org> * src/frame.c: (meta_window_ensure_frame): diff --git a/src/keybindings.c b/src/keybindings.c index 14b098d3..44aa9ac0 100644 --- a/src/keybindings.c +++ b/src/keybindings.c @@ -36,6 +36,10 @@ #include <stdio.h> #include <stdlib.h> +#ifdef HAVE_XKB +#include <X11/XKBlib.h> +#endif + static gboolean all_bindings_disabled = FALSE; typedef void (* MetaKeyHandlerFunc) (MetaDisplay *display, @@ -186,12 +190,6 @@ static void handle_maximize_horiz (MetaDisplay *display, MetaKeyBinding *binding); /* debug */ -static void handle_spew_mark (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding); - static gboolean process_keyboard_move_grab (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, @@ -2311,6 +2309,33 @@ process_keyboard_resize_grab (MetaDisplay *display, } static gboolean +end_keyboard_grab (MetaDisplay *display, + unsigned int keycode) +{ +#ifdef HAVE_XKB + if (display->xkb_base_event_type > 0) + { + unsigned int primary_modifier; + XkbStateRec state; + + primary_modifier = get_primary_modifier (display, display->grab_mask); + + XkbGetState (display->xdisplay, XkbUseCoreKbd, &state); + + if (!(primary_modifier & state.mods)) + return TRUE; + } + else +#endif + { + if (keycode_is_primary_modifier (display, keycode, display->grab_mask)) + return TRUE; + } + + return FALSE; +} + +static gboolean process_tab_grab (MetaDisplay *display, MetaScreen *screen, XEvent *event, @@ -2325,10 +2350,9 @@ process_tab_grab (MetaDisplay *display, return FALSE; g_return_val_if_fail (screen->tab_popup != NULL, FALSE); - + if (event->type == KeyRelease && - keycode_is_primary_modifier (display, event->xkey.keycode, - display->grab_mask)) + end_keyboard_grab (display, event->xkey.keycode)) { /* We're done, move to the new window. */ Window target_xwindow; @@ -2491,7 +2515,7 @@ error_on_command (int command_index, { GError *err; char *argv[10]; - char *key; + const char *key; char numbuf[32]; char timestampbuf[32]; @@ -2509,7 +2533,7 @@ error_on_command (int command_index, argv[3] = "--timestamp"; argv[4] = timestampbuf; argv[5] = "--command-failed-error"; - argv[6] = key; + argv[6] = (char *)key; argv[7] = (char*) (command ? command : ""); argv[8] = (char*) message; argv[9] = NULL; @@ -2657,10 +2681,9 @@ process_workspace_switch_grab (MetaDisplay *display, return FALSE; g_return_val_if_fail (screen->tab_popup != NULL, FALSE); - + if (event->type == KeyRelease && - keycode_is_primary_modifier (display, event->xkey.keycode, - display->grab_mask)) + end_keyboard_grab (display, event->xkey.keycode)) { /* We're done, move to the new workspace. */ MetaWorkspace *target_workspace; |