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 @@ -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 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