summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2013-05-23 16:21:24 -0400
committerJasper St. Pierre <jstpierre@mecheye.net>2013-05-24 17:43:37 -0400
commitbd19de94292b3db7902c09ba16f5ba35c92a09d5 (patch)
treec2530a6678bfe63f42e4f2965b1def0774600291
parent2ca28385487458e4dc46008c65be93173e37bb01 (diff)
downloadmutter-bd19de94292b3db7902c09ba16f5ba35c92a09d5.tar.gz
compositor: Add an API to focus the stage X window
gnome-shell has traditionally just called XSetInputFocus when wanting to set the input focus to the stage window, but this might cause strange, hard-to-reproduce bugs because of an interference with mutter's focus prediction. Add API to allow gnome-shell to focus the stage window that also updates mutter's internal focus prediction state. https://bugzilla.gnome.org/show_bug.cgi?id=700735
-rw-r--r--src/compositor/compositor.c22
-rw-r--r--src/core/display-private.h5
-rw-r--r--src/core/display.c12
-rw-r--r--src/meta/compositor-mutter.h2
4 files changed, 41 insertions, 0 deletions
diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c
index 86abfafdc..40b9854b7 100644
--- a/src/compositor/compositor.c
+++ b/src/compositor/compositor.c
@@ -369,6 +369,28 @@ meta_empty_stage_input_region (MetaScreen *screen)
meta_set_stage_input_region (screen, region);
}
+void
+meta_focus_stage_window (MetaScreen *screen,
+ guint32 timestamp)
+{
+ ClutterStage *stage;
+ Window window;
+
+ stage = CLUTTER_STAGE (meta_get_stage_for_screen (screen));
+ if (!stage)
+ return;
+
+ window = clutter_x11_get_stage_window (stage);
+
+ if (window == None)
+ return;
+
+ meta_display_set_input_focus_xwindow (screen->display,
+ screen,
+ window,
+ timestamp);
+}
+
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 3415c8414..c9a7d234e 100644
--- a/src/core/display-private.h
+++ b/src/core/display-private.h
@@ -465,4 +465,9 @@ gboolean meta_display_process_barrier_event (MetaDisplay *display,
XIBarrierEvent *event);
#endif /* HAVE_XI23 */
+void meta_display_set_input_focus_xwindow (MetaDisplay *display,
+ MetaScreen *screen,
+ Window window,
+ guint32 timestamp);
+
#endif
diff --git a/src/core/display.c b/src/core/display.c
index 242d53907..aa3338a5a 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -5807,6 +5807,18 @@ meta_display_request_take_focus (MetaDisplay *display,
}
void
+meta_display_set_input_focus_xwindow (MetaDisplay *display,
+ MetaScreen *screen,
+ Window window,
+ guint32 timestamp)
+{
+ request_xserver_input_focus_change (display,
+ screen,
+ window,
+ timestamp);
+}
+
+void
meta_display_focus_the_no_focus_window (MetaDisplay *display,
MetaScreen *screen,
guint32 timestamp)
diff --git a/src/meta/compositor-mutter.h b/src/meta/compositor-mutter.h
index 357b42e60..698f8ded5 100644
--- a/src/meta/compositor-mutter.h
+++ b/src/meta/compositor-mutter.h
@@ -46,5 +46,7 @@ void meta_enable_unredirect_for_screen (MetaScreen *screen);
void meta_set_stage_input_region (MetaScreen *screen,
XserverRegion region);
void meta_empty_stage_input_region (MetaScreen *screen);
+void meta_focus_stage_window (MetaScreen *screen,
+ guint32 timestamp);
#endif