summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElijah Newren <newren@math.utah.edu>2004-10-20 23:13:13 +0000
committerElijah Newren <newren@src.gnome.org>2004-10-20 23:13:13 +0000
commit442fb19c115d967e3b9d6a29f253797aeac8b677 (patch)
treeb6d79565b23e31a1d95df57d64e6cfb7b6ff944f
parent1d173183b3624a3c91c06642f0e4200ea86ead6a (diff)
downloadmetacity-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--ChangeLog13
-rw-r--r--src/keybindings.c51
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 <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;