From 442fb19c115d967e3b9d6a29f253797aeac8b677 Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Wed, 20 Oct 2004 23:13:13 +0000 Subject: Patch from Soeren to fix the modifier key breakage introduced by an Xorg 2004-10-20 Elijah Newren 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 --- ChangeLog | 13 +++++++++++++ src/keybindings.c | 51 +++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 50 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index 619709c0..95d85ec6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2004-10-20 Elijah Newren + + 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 * 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 #include +#ifdef HAVE_XKB +#include +#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, @@ -2310,6 +2308,33 @@ process_keyboard_resize_grab (MetaDisplay *display, return handled; } +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, @@ -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; -- cgit v1.2.1