[mutter] compositor: Add an API to query if the stage is focused
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] compositor: Add an API to query if the stage is focused
- Date: Thu, 20 Jun 2013 21:23:29 +0000 (UTC)
commit 96221e6c0400c97ce4de39148d7ea040e0af16bf
Author: Jasper St. Pierre <jstpierre mecheye net>
Date: Fri May 24 17:58:55 2013 -0400
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 4195a29..21fbcc6 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 a311317..0e8142c 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 e127ef0..8886089 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 698f8de..a0f5140 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
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]