diff options
-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 271cf885..09283399 100644 --- a/src/core/keybindings.c +++ b/src/core/keybindings.c @@ -1306,6 +1306,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 |