From 2b59b4c793f417e15a61df969e23920d6e608538 Mon Sep 17 00:00:00 2001 From: Rui Matos Date: Wed, 10 Feb 2016 20:17:49 +0100 Subject: [PATCH] keybindings: Grab buttons with any modifier combo on unfocused windows We currently only focus unfocused windows on button press if no modifiers (or just ignored modifiers) are in effect. This behavior seems surprising and counter-intuitive so let's do it for any modifier combination instead. https://bugzilla.gnome.org/show_bug.cgi?id=746642 --- src/core/keybindings.c | 14 ++++++++++++-- src/core/window.c | 7 ++++++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/core/keybindings.c b/src/core/keybindings.c index 4821c09ee..59d3c40e2 100644 --- a/src/core/keybindings.c +++ b/src/core/keybindings.c @@ -902,6 +902,16 @@ calc_grab_modifiers (MetaKeyBindingManager *keys, XIGrabModifiers mods; GArray *mods_array = g_array_new (FALSE, TRUE, sizeof (XIGrabModifiers)); + /* The X server crashes if XIAnyModifier gets passed in with any + other bits. It doesn't make sense to ask for a grab of + XIAnyModifier plus other bits anyway so we avoid that. */ + if (modmask & XIAnyModifier) + { + mods = (XIGrabModifiers) { XIAnyModifier, 0 }; + g_array_append_val (mods_array, mods); + return mods_array; + } + mods = (XIGrabModifiers) { modmask, 0 }; g_array_append_val (mods_array, mods); @@ -1061,7 +1071,7 @@ meta_display_grab_focus_window_button (MetaDisplay *display, * XSync() */ - meta_change_buttons_grab (keys, window->xwindow, TRUE, TRUE, 0); + meta_change_buttons_grab (keys, window->xwindow, TRUE, TRUE, XIAnyModifier); window->have_focus_click_grab = TRUE; } @@ -1076,7 +1086,7 @@ meta_display_ungrab_focus_window_button (MetaDisplay *display, if (!window->have_focus_click_grab) return; - meta_change_buttons_grab (keys, window->xwindow, FALSE, FALSE, 0); + meta_change_buttons_grab (keys, window->xwindow, FALSE, FALSE, XIAnyModifier); window->have_focus_click_grab = FALSE; } diff --git a/src/core/window.c b/src/core/window.c index 21557f363..1ffd48458 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -4816,7 +4816,12 @@ meta_window_set_focused_internal (MetaWindow *window, */ if (meta_prefs_get_focus_mode () == G_DESKTOP_FOCUS_MODE_CLICK || !meta_prefs_get_raise_on_click()) - meta_display_ungrab_focus_window_button (window->display, window); + { + meta_display_ungrab_focus_window_button (window->display, window); + /* Since we ungrab with XIAnyModifier above, all button + grabs go way so we need to re-grab the window buttons. */ + meta_display_grab_window_buttons (window->display, window->xwindow); + } g_signal_emit (window, window_signals[FOCUS], 0);