From 16d7fe107e0612923da5980372a617398012a8fe Mon Sep 17 00:00:00 2001 From: Martin Wimpress Date: Thu, 8 Mar 2018 11:33:45 +0100 Subject: [PATCH] debian/patches: Add 0002_prevent_media-keys_swallowing_modifier_keys.patch. Prevent media-keys bindings from swallowing modifier keys. --- ..._media-keys_swallowing_modifier_keys.patch | 220 ++++++++++++++++++ debian/patches/series | 1 + 2 files changed, 221 insertions(+) create mode 100644 debian/patches/0002_prevent_media-keys_swallowing_modifier_keys.patch diff --git a/debian/patches/0002_prevent_media-keys_swallowing_modifier_keys.patch b/debian/patches/0002_prevent_media-keys_swallowing_modifier_keys.patch new file mode 100644 index 0000000..5b2ce94 --- /dev/null +++ b/debian/patches/0002_prevent_media-keys_swallowing_modifier_keys.patch @@ -0,0 +1,220 @@ +diff --git a/plugins/keybindings/msd-keybindings-manager.c b/plugins/keybindings/msd-keybindings-manager.c +index f04ac54..76905db 100644 +--- a/plugins/keybindings/msd-keybindings-manager.c ++++ b/plugins/keybindings/msd-keybindings-manager.c +@@ -297,10 +297,12 @@ key_already_used (MsdKeybindingsManager *manager, + static void + binding_unregister_keys (MsdKeybindingsManager *manager) + { ++ GdkDisplay *dpy; + GSList *li; + gboolean need_flush = FALSE; + +- gdk_error_trap_push (); ++ dpy = gdk_display_get_default (); ++ gdk_x11_display_error_trap_push (dpy); + + for (li = manager->priv->binding_list; li != NULL; li = li->next) { + Binding *binding = (Binding *) li->data; +@@ -312,18 +314,20 @@ binding_unregister_keys (MsdKeybindingsManager *manager) + } + + if (need_flush) +- gdk_flush (); ++ gdk_display_flush (dpy); + +- gdk_error_trap_pop_ignored (); ++ gdk_x11_display_error_trap_pop_ignored (dpy); + } + + static void + binding_register_keys (MsdKeybindingsManager *manager) + { + GSList *li; ++ GdkDisplay *dpy; + gboolean need_flush = FALSE; + +- gdk_error_trap_push (); ++ dpy = gdk_display_get_default (); ++ gdk_x11_display_error_trap_push (dpy); + + /* Now check for changes and grab new key if not already used */ + for (li = manager->priv->binding_list; li != NULL; li = li->next) { +@@ -353,8 +357,8 @@ binding_register_keys (MsdKeybindingsManager *manager) + } + + if (need_flush) +- gdk_flush (); +- if (gdk_error_trap_pop ()) ++ gdk_display_flush (dpy); ++ if (gdk_x11_display_error_trap_pop (dpy)) + g_warning ("Grab failed for some keys, another application may already have access the them."); + + } +@@ -540,11 +544,11 @@ msd_keybindings_manager_start (MsdKeybindingsManager *manager, + (GdkFilterFunc) keybindings_filter, + manager); + +- gdk_error_trap_push (); ++ gdk_x11_display_error_trap_push (dpy); + /* Add KeyPressMask to the currently reportable event masks */ + XGetWindowAttributes (xdpy, xwindow, &atts); + XSelectInput (xdpy, xwindow, atts.your_event_mask | KeyPressMask); +- gdk_error_trap_pop_ignored (); ++ gdk_x11_display_error_trap_pop_ignored (dpy); + + manager->priv->screens = get_screens_list (); + +diff --git a/plugins/media-keys/msd-media-keys-manager.c b/plugins/media-keys/msd-media-keys-manager.c +index 5fab74e..34e4c01 100644 +--- a/plugins/media-keys/msd-media-keys-manager.c ++++ b/plugins/media-keys/msd-media-keys-manager.c +@@ -264,11 +264,13 @@ update_kbd_cb (GSettings *settings, + MsdMediaKeysManager *manager) + { + int i; ++ GdkDisplay *dpy; + gboolean need_flush = TRUE; + + g_return_if_fail (settings_key != NULL); + +- gdk_error_trap_push (); ++ dpy = gdk_display_get_default (); ++ gdk_x11_display_error_trap_push (dpy); + + /* Find the key that was modified */ + for (i = 0; i < HANDLED_KEYS; i++) { +@@ -313,19 +315,21 @@ update_kbd_cb (GSettings *settings, + } + + if (need_flush) +- gdk_flush (); +- if (gdk_error_trap_pop ()) ++ gdk_display_flush (dpy); ++ if (gdk_x11_display_error_trap_pop (dpy)) + g_warning ("Grab failed for some keys, another application may already have access the them."); + } + + static void init_kbd(MsdMediaKeysManager* manager) + { + int i; ++ GdkDisplay *dpy; + gboolean need_flush = FALSE; + + mate_settings_profile_start(NULL); + +- gdk_error_trap_push(); ++ dpy = gdk_display_get_default (); ++ gdk_x11_display_error_trap_push (dpy); + + for (i = 0; i < HANDLED_KEYS; i++) + { +@@ -373,10 +377,10 @@ static void init_kbd(MsdMediaKeysManager* manager) + + if (need_flush) + { +- gdk_flush(); ++ gdk_display_flush (dpy); + } + +- if (gdk_error_trap_pop ()) ++ if (gdk_x11_display_error_trap_pop (dpy)) + { + g_warning("Grab failed for some keys, another application may already have access the them."); + } +@@ -1057,7 +1061,7 @@ acme_filter_events (GdkXEvent *xevent, + int i; + + /* verify we have a key event */ +- if (xev->type != KeyPress && xev->type != KeyRelease) { ++ if (xev->type != KeyPress) { + return GDK_FILTER_CONTINUE; + } + +@@ -1071,10 +1075,6 @@ acme_filter_events (GdkXEvent *xevent, + return GDK_FILTER_CONTINUE; + } + break; +- default: +- if (xev->type != KeyRelease) { +- return GDK_FILTER_CONTINUE; +- } + } + + manager->priv->current_screen = acme_get_screen_from_event (manager, xany); +@@ -1094,9 +1094,15 @@ static gboolean + start_media_keys_idle_cb (MsdMediaKeysManager *manager) + { + GSList *l; ++ GdkDisplay *dpy; ++ Display *xdpy; + + g_debug ("Starting media_keys manager"); + mate_settings_profile_start (NULL); ++ ++ dpy = gdk_display_get_default (); ++ xdpy = GDK_DISPLAY_XDISPLAY (dpy); ++ + manager->priv->volume_monitor = g_volume_monitor_get (); + manager->priv->settings = g_settings_new (BINDING_SCHEMA); + +@@ -1105,14 +1111,28 @@ start_media_keys_idle_cb (MsdMediaKeysManager *manager) + + /* Start filtering the events */ + for (l = manager->priv->screens; l != NULL; l = l->next) { ++ GdkWindow *window; ++ Window xwindow; ++ XWindowAttributes atts; ++ + mate_settings_profile_start ("gdk_window_add_filter"); + ++ window = gdk_screen_get_root_window (l->data); ++ xwindow = GDK_WINDOW_XID (window); ++ + g_debug ("adding key filter for screen: %d", + gdk_x11_screen_get_screen_number (l->data)); + +- gdk_window_add_filter (gdk_screen_get_root_window (l->data), ++ gdk_window_add_filter (window, + (GdkFilterFunc)acme_filter_events, + manager); ++ ++ gdk_x11_display_error_trap_push (dpy); ++ /* Add KeyPressMask to the currently reportable event masks */ ++ XGetWindowAttributes (xdpy, xwindow, &atts); ++ XSelectInput (xdpy, xwindow, atts.your_event_mask | KeyPressMask); ++ gdk_x11_display_error_trap_pop_ignored (dpy); ++ + mate_settings_profile_end ("gdk_window_add_filter"); + } + +@@ -1161,6 +1181,7 @@ void + msd_media_keys_manager_stop (MsdMediaKeysManager *manager) + { + MsdMediaKeysManagerPrivate *priv = manager->priv; ++ GdkDisplay *dpy; + GSList *ls; + GList *l; + int i; +@@ -1190,7 +1211,8 @@ msd_media_keys_manager_stop (MsdMediaKeysManager *manager) + } + + need_flush = FALSE; +- gdk_error_trap_push (); ++ dpy = gdk_display_get_default (); ++ gdk_x11_display_error_trap_push (dpy); + + for (i = 0; i < HANDLED_KEYS; ++i) { + if (keys[i].key) { +@@ -1204,9 +1226,9 @@ msd_media_keys_manager_stop (MsdMediaKeysManager *manager) + } + + if (need_flush) +- gdk_flush (); ++ gdk_display_flush (dpy); + +- gdk_error_trap_pop_ignored (); ++ gdk_x11_display_error_trap_pop_ignored (dpy); + + g_slist_free (priv->screens); + priv->screens = NULL; diff --git a/debian/patches/series b/debian/patches/series index f701fdc..3745eda 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1 +1,2 @@ 0001_scale_osd_on_hidpi_displays.patch +0002_prevent_media-keys_swallowing_modifier_keys.patch