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
This commit is contained in:
parent
2ca2838548
commit
bd19de9429
@ -369,6 +369,28 @@ meta_empty_stage_input_region (MetaScreen *screen)
|
|||||||
meta_set_stage_input_region (screen, region);
|
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
|
gboolean
|
||||||
meta_begin_modal_for_plugin (MetaScreen *screen,
|
meta_begin_modal_for_plugin (MetaScreen *screen,
|
||||||
MetaPlugin *plugin,
|
MetaPlugin *plugin,
|
||||||
|
@ -465,4 +465,9 @@ gboolean meta_display_process_barrier_event (MetaDisplay *display,
|
|||||||
XIBarrierEvent *event);
|
XIBarrierEvent *event);
|
||||||
#endif /* HAVE_XI23 */
|
#endif /* HAVE_XI23 */
|
||||||
|
|
||||||
|
void meta_display_set_input_focus_xwindow (MetaDisplay *display,
|
||||||
|
MetaScreen *screen,
|
||||||
|
Window window,
|
||||||
|
guint32 timestamp);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -5806,6 +5806,18 @@ meta_display_request_take_focus (MetaDisplay *display,
|
|||||||
timestamp);
|
timestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
void
|
||||||
meta_display_focus_the_no_focus_window (MetaDisplay *display,
|
meta_display_focus_the_no_focus_window (MetaDisplay *display,
|
||||||
MetaScreen *screen,
|
MetaScreen *screen,
|
||||||
|
@ -46,5 +46,7 @@ void meta_enable_unredirect_for_screen (MetaScreen *screen);
|
|||||||
void meta_set_stage_input_region (MetaScreen *screen,
|
void meta_set_stage_input_region (MetaScreen *screen,
|
||||||
XserverRegion region);
|
XserverRegion region);
|
||||||
void meta_empty_stage_input_region (MetaScreen *screen);
|
void meta_empty_stage_input_region (MetaScreen *screen);
|
||||||
|
void meta_focus_stage_window (MetaScreen *screen,
|
||||||
|
guint32 timestamp);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user