diff --git a/libxfce4kbd-private/xfce-shortcuts-grabber.c b/libxfce4kbd-private/xfce-shortcuts-grabber.c index 43dfca6..457a1d7 100644 --- a/libxfce4kbd-private/xfce-shortcuts-grabber.c +++ b/libxfce4kbd-private/xfce-shortcuts-grabber.c @@ -68,6 +68,7 @@ static GdkFilterReturn xfce_shortcuts_grabber_event_filter (GdkXEvent struct _XfceShortcutsGrabberPrivate { GHashTable *keys; + gboolean super_pressed; }; struct _XfceKey @@ -112,6 +113,7 @@ xfce_shortcuts_grabber_init (XfceShortcutsGrabber *grabber) { grabber->priv = XFCE_SHORTCUTS_GRABBER_GET_PRIVATE (grabber); grabber->priv->keys = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + grabber->priv->super_pressed = FALSE; /* Workaround: Make sure modmap is up to date * There is possibly a bug in GTK+ where virtual modifiers are not @@ -392,6 +394,40 @@ find_event_key (const gchar *shortcut, +static GdkFilterReturn +filter_superkey (XEvent *xevent, + guint keyval, + XfceShortcutsGrabber *grabber) +{ + if (keyval == GDK_KEY_Super_L || keyval == GDK_KEY_Super_R) + { + if (xevent->type == KeyRelease) + { + if (grabber->priv->super_pressed) + { + xevent->type = KeyPress; + xevent->xkey.state &= ~GDK_MOD4_MASK; + grabber->priv->super_pressed = FALSE; + return GDK_FILTER_TRANSLATE; + } + return GDK_FILTER_CONTINUE; + } + + if (xevent->type == KeyPress) + { + grabber->priv->super_pressed = TRUE; + return GDK_FILTER_CONTINUE; + } + } + else if (xevent->type == KeyPress) + { + grabber->priv->super_pressed = FALSE; + } + return GDK_FILTER_TRANSLATE; +} + + + static GdkFilterReturn xfce_shortcuts_grabber_event_filter (GdkXEvent *gdk_xevent, GdkEvent *event, @@ -409,7 +445,7 @@ xfce_shortcuts_grabber_event_filter (GdkXEvent *gdk_xevent, xevent = (XEvent *) gdk_xevent; - if (xevent->type != KeyPress) + if (xevent->type != KeyPress && xevent->type != KeyRelease) return GDK_FILTER_CONTINUE; context.grabber = grabber; @@ -420,13 +456,18 @@ xfce_shortcuts_grabber_event_filter (GdkXEvent *gdk_xevent, gdk_error_trap_push (); keymap = gdk_keymap_get_default (); mod_mask = gtk_accelerator_get_default_mod_mask (); - modifiers = xevent->xkey.state; gdk_keymap_translate_keyboard_state (keymap, xevent->xkey.keycode, - modifiers, + xevent->xkey.state, XkbGroupForCoreState (xevent->xkey.state), &keyval, NULL, NULL, &consumed); + if (filter_superkey (xevent, keyval, grabber) == GDK_FILTER_CONTINUE || + xevent->type != KeyPress) + goto out_continue; + + modifiers = xevent->xkey.state; + /* We want Alt + Print to be Alt + Print not SysReq. See bug #7897 */ if (keyval == GDK_KEY_Sys_Req && (modifiers & GDK_MOD1_MASK) != 0) { @@ -479,6 +520,8 @@ xfce_shortcuts_grabber_event_filter (GdkXEvent *gdk_xevent, gdk_flush (); + out_continue: + #if GTK_CHECK_VERSION (3, 0, 0) gdk_error_trap_pop_ignored (); #else