diff options
author | Jasper St. Pierre <jstpierre@mecheye.net> | 2013-05-24 17:58:55 -0400 |
---|---|---|
committer | Jasper St. Pierre <jstpierre@mecheye.net> | 2013-05-28 15:07:13 -0400 |
commit | c7b8f26cad46b719a35f2c241b0cb3dc84ccf1d6 (patch) | |
tree | 46f2522bb51e1a36a09ed5272169fa4300519803 | |
parent | 8747b97ba3024ce28789336f7e0221be1ecacb70 (diff) | |
download | mutter-focus-new.tar.gz |
compositor: Add an API to query if the stage is focusedfocus-new
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.
-rw-r--r-- | src/compositor/compositor.c | 18 | ||||
-rw-r--r-- | src/core/display-private.h | 3 | ||||
-rw-r--r-- | src/core/display.c | 11 | ||||
-rw-r--r-- | src/meta/compositor-mutter.h | 1 |
4 files changed, 31 insertions, 2 deletions
diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c index 40b9854b7..3673d2439 100644 --- a/src/compositor/compositor.c +++ b/src/compositor/compositor.c @@ -392,6 +392,24 @@ meta_focus_stage_window (MetaScreen *screen, } 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, Window grab_window, 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 263c70fd1..d8c44fe44 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -1876,11 +1876,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) @@ -1897,11 +1898,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) { @@ -1991,6 +1994,7 @@ request_xserver_input_focus_change (MetaDisplay *display, update_focus_window (display, meta_window, + xwindow, serial); meta_error_trap_pop (display); @@ -2107,7 +2111,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); } } @@ -2163,6 +2169,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 |