diff options
author | Victor Kareh <[email protected]> | 2017-08-14 06:31:10 -0400 |
---|---|---|
committer | Martin Wimpress <[email protected]> | 2017-08-14 11:31:10 +0100 |
commit | 680dca33ba526ae0d2dc333ac26a1c5872d86120 (patch) | |
tree | d03b3776818c3f2c5a6e26b01e36f11087575289 | |
parent | d051953c1412ced4a140f7f4253c823bbe358165 (diff) | |
download | marco-680dca33ba526ae0d2dc333ac26a1c5872d86120.tar.bz2 marco-680dca33ba526ae0d2dc333ac26a1c5872d86120.tar.xz |
Fix synthetic keybinding/button-grab window (#342)
* Determine focused window when processing synthetic events
When a client is passively grabbing keybindings that it does not need,
it sends them up for other clients to process.
Often in this situation, the event contains the wrong window (either
root, for global keybindings, or the original client itself). This means
that Marco will attempt to process the event for the wrong window.
This is not an issue for global keybindings within Marco, as the focused
window does not matter. However, for shortcuts that operate directly on
specific windows, the event gets lost.
This change addresses this by determining what the currently-focused
window is, regardless of which client forwarded the event.
* Determine window under pointer when processing synthetic events
When a client is passively grabbing mouse clicks that it does not need,
it sends them up for other clients to process.
Often in this situation, the event contains the wrong window (either
root, for global keybindings, or the original client itself). This means
that Marco will attempt to process the event for the wrong window.
This change addresses this by determining what the current window under
the mouse pointer is, regardless of which client forwarded the event.
* Remove unused development data
-rw-r--r-- | src/core/display.c | 14 | ||||
-rw-r--r-- | src/core/keybindings.c | 8 |
2 files changed, 22 insertions, 0 deletions
diff --git a/src/core/display.c b/src/core/display.c index 7b3ec502..e247ed33 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -1779,6 +1779,20 @@ static gboolean event_callback(XEvent* event, gpointer data) meta_display_process_key_event (display, window, event); break; case ButtonPress: + /* Use window under pointer when processing synthetic events from another client */ + if (window == NULL && event->xbutton.send_event) + { + int x, y, root_x, root_y; + Window root, child; + guint mask; + XQueryPointer (display->xdisplay, + event->xany.window, + &root, &child, + &root_x, &root_y, + &x, &y, + &mask); + window = meta_display_lookup_x_window (display, child); + } if ((window && grab_op_is_mouse (display->grab_op) && display->grab_button != (int) event->xbutton.button && diff --git a/src/core/keybindings.c b/src/core/keybindings.c index fe5f0f00..f4eb01b1 100644 --- a/src/core/keybindings.c +++ b/src/core/keybindings.c @@ -1310,6 +1310,14 @@ meta_display_process_key_event (MetaDisplay *display, meta_ui_window_is_widget (screen->ui, event->xany.window)) return; + /* Use focused window when processing synthetic events from another client */ + if (window == NULL && event->xkey.send_event) { + Window focus = None; + int ret_to = RevertToPointerRoot; + XGetInputFocus (display->xdisplay, &focus, &ret_to); + window = meta_display_lookup_x_window (display, focus); + } + /* window may be NULL */ #ifdef HAVE_XKB |