summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/display.c14
-rw-r--r--src/core/keybindings.c8
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