summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2013-05-24 17:58:55 -0400
committerJasper St. Pierre <jstpierre@mecheye.net>2013-05-28 15:07:13 -0400
commitc7b8f26cad46b719a35f2c241b0cb3dc84ccf1d6 (patch)
tree46f2522bb51e1a36a09ed5272169fa4300519803
parent8747b97ba3024ce28789336f7e0221be1ecacb70 (diff)
downloadmutter-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.c18
-rw-r--r--src/core/display-private.h3
-rw-r--r--src/core/display.c11
-rw-r--r--src/meta/compositor-mutter.h1
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