From 96221e6c0400c97ce4de39148d7ea040e0af16bf Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Fri, 24 May 2013 17:58:55 -0400 Subject: [PATCH] compositor: Add an API to query if the stage is focused gnome-shell needs to know whether the stage window is focused so it can synchronize between stage window focus and Clutter key actor focus. Track all X windows, even those without MetaWindows, when tracking the focus window, and add a compositor-level API to determine when the stage is focused. https://bugzilla.gnome.org/show_bug.cgi?id=700735 --- src/compositor/compositor.c | 18 ++++++++++++++++++ src/core/display-private.h | 3 +++ src/core/display.c | 17 ++++++++++++----- src/meta/compositor-mutter.h | 1 + 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c index 4195a2978..21fbcc64f 100644 --- a/src/compositor/compositor.c +++ b/src/compositor/compositor.c @@ -391,6 +391,24 @@ meta_focus_stage_window (MetaScreen *screen, timestamp); } +gboolean +meta_stage_is_focused (MetaScreen *screen) +{ + ClutterStage *stage; + Window window; + + stage = CLUTTER_STAGE (meta_get_stage_for_screen (screen)); + if (!stage) + return FALSE; + + window = clutter_x11_get_stage_window (stage); + + if (window == None) + return FALSE; + + return (screen->display->focus_xwindow == window); +} + gboolean meta_begin_modal_for_plugin (MetaScreen *screen, MetaPlugin *plugin, diff --git a/src/core/display-private.h b/src/core/display-private.h index a311317a8..0e8142cf5 100644 --- a/src/core/display-private.h +++ b/src/core/display-private.h @@ -113,6 +113,9 @@ struct _MetaDisplay * or event that caused this. */ MetaWindow *focus_window; + /* For windows we've focused that don't necessarily have an X window, + * like the no_focus_window or the stage X window. */ + Window focus_xwindow; gulong focus_serial; /* last timestamp passed to XSetInputFocus */ diff --git a/src/core/display.c b/src/core/display.c index e127ef0cf..888608928 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -1468,11 +1468,11 @@ meta_display_get_current_time (MetaDisplay *display) } static Bool -find_timestamp_predicate (Display *display, +find_timestamp_predicate (Display *xdisplay, XEvent *ev, XPointer arg) { - MetaDisplay *display = arg; + MetaDisplay *display = (MetaDisplay *) arg; return (ev->type == PropertyNotify && ev->xproperty.atom == display->atom__MUTTER_TIMESTAMP_PING); @@ -1495,7 +1495,7 @@ meta_display_get_current_time_roundtrip (MetaDisplay *display) XIfEvent (display->xdisplay, &property_event, find_timestamp_predicate, - display); + (XPointer) display); timestamp = property_event.xproperty.time; } @@ -1883,11 +1883,12 @@ get_input_event (MetaDisplay *display, static void update_focus_window (MetaDisplay *display, MetaWindow *window, + Window xwindow, gulong serial) { display->focus_serial = serial; - if (window == display->focus_window) + if (display->focus_xwindow == xwindow) return; if (display->focus_window) @@ -1904,11 +1905,13 @@ update_focus_window (MetaDisplay *display, */ previous = display->focus_window; display->focus_window = NULL; + display->focus_xwindow = None; meta_window_set_focused_internal (previous, FALSE); } display->focus_window = window; + display->focus_xwindow = xwindow; if (display->focus_window) { @@ -1993,6 +1996,7 @@ request_xserver_input_focus_change (MetaDisplay *display, update_focus_window (display, meta_window, + xwindow, serial); meta_error_trap_pop (display); @@ -2109,7 +2113,9 @@ handle_window_focus_event (MetaDisplay *display, if (display->server_focus_serial > display->focus_serial) { - update_focus_window (display, focus_window, + update_focus_window (display, + focus_window, + focus_window ? focus_window->xwindow : None, display->server_focus_serial); } } @@ -2165,6 +2171,7 @@ event_callback (XEvent *event, display->focus_window->desc); update_focus_window (display, meta_display_lookup_x_window (display, display->server_focus_window), + display->server_focus_window, display->server_focus_serial); } diff --git a/src/meta/compositor-mutter.h b/src/meta/compositor-mutter.h index 698f8ded5..a0f5140fd 100644 --- a/src/meta/compositor-mutter.h +++ b/src/meta/compositor-mutter.h @@ -48,5 +48,6 @@ void meta_set_stage_input_region (MetaScreen *screen, void meta_empty_stage_input_region (MetaScreen *screen); void meta_focus_stage_window (MetaScreen *screen, guint32 timestamp); +gboolean meta_stage_is_focused (MetaScreen *screen); #endif