diff options
author | Jasper St. Pierre <jstpierre@mecheye.net> | 2013-05-23 16:21:24 -0400 |
---|---|---|
committer | Jasper St. Pierre <jstpierre@mecheye.net> | 2013-05-24 17:43:37 -0400 |
commit | bd19de94292b3db7902c09ba16f5ba35c92a09d5 (patch) | |
tree | c2530a6678bfe63f42e4f2965b1def0774600291 | |
parent | 2ca28385487458e4dc46008c65be93173e37bb01 (diff) | |
download | mutter-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.c | 22 | ||||
-rw-r--r-- | src/core/display-private.h | 5 | ||||
-rw-r--r-- | src/core/display.c | 12 | ||||
-rw-r--r-- | src/meta/compositor-mutter.h | 2 |
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 |