From 9eb0130a902aa509a3f4f61d0312af807fa87936 Mon Sep 17 00:00:00 2001 From: Victor Kareh Date: Tue, 20 Jun 2017 18:28:47 -0400 Subject: Request keyboard event reports from global keybindings of other windows This allows mate-settings-daemon to honor global keybindings whenever a different application has keybindings that seem conflicting, but are usually not. For example, an application defining a `Super_L` keybinding and MATE having defining a shortcut that uses the `` key. They are the same physical keyboard, but one is a modifier and the other is not. Without requesting keyboard reports from other windows, the `` shortcuts are swallowed whenever there is a `Super_L` shortcut elsewhere. (squashed cf0b97690c9d8606be4e07b58a4cf7070b53570d + 603e331e6cf480d2f9aed1e7d096333df39215aa for 1.18 branch) --- plugins/keybindings/msd-keybindings-manager.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/plugins/keybindings/msd-keybindings-manager.c b/plugins/keybindings/msd-keybindings-manager.c index 89ae0bc..c022547 100644 --- a/plugins/keybindings/msd-keybindings-manager.c +++ b/plugins/keybindings/msd-keybindings-manager.c @@ -538,20 +538,34 @@ msd_keybindings_manager_start (MsdKeybindingsManager *manager, { GdkDisplay *dpy; GdkScreen *screen; + GdkWindow *window; int screen_num; int i; + Display *xdpy; + Window xwindow; + XWindowAttributes atts; g_debug ("Starting keybindings manager"); mate_settings_profile_start (NULL); dpy = gdk_display_get_default (); + xdpy = GDK_DISPLAY_XDISPLAY (dpy); screen_num = gdk_display_get_n_screens (dpy); for (i = 0; i < screen_num; i++) { screen = gdk_display_get_screen (dpy, i); - gdk_window_add_filter (gdk_screen_get_root_window (screen), + window = gdk_screen_get_root_window (screen); + xwindow = GDK_WINDOW_XID (window); + + gdk_window_add_filter (window, (GdkFilterFunc) keybindings_filter, manager); + + gdk_error_trap_push (); + /* 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 (); } manager->priv->screens = get_screens_list (); -- cgit v1.2.1