window: Add "is_focus_async" API

X11 clients can use different models of input handling, of which some
may not result focus being set synchronously.

For such clients, meta_focus_window() will not change the focus itself
but rely on the client itself to set the input focus on the desired
window.

Add a new MetaWindow API to check when dealing with such a window.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1716>
This commit is contained in:
Olivier Fourdan 2021-02-11 17:53:59 +01:00 committed by Marge Bot
parent 9de36fed4d
commit 6438919a89
4 changed files with 26 additions and 0 deletions

View File

@ -613,6 +613,7 @@ struct _MetaWindowClass
gboolean (*is_stackable) (MetaWindow *window);
gboolean (*can_ping) (MetaWindow *window);
gboolean (*are_updates_frozen) (MetaWindow *window);
gboolean (*is_focus_async) (MetaWindow *window);
MetaStackLayer (*calculate_layer) (MetaWindow *window);
@ -883,4 +884,5 @@ void meta_window_force_restore_shortcuts (MetaWindow *window,
gboolean meta_window_shortcuts_inhibited (MetaWindow *window,
ClutterInputDevice *source);
gboolean meta_window_is_stackable (MetaWindow *window);
gboolean meta_window_is_focus_async (MetaWindow *window);
#endif

View File

@ -8631,6 +8631,12 @@ meta_window_is_stackable (MetaWindow *window)
return META_WINDOW_GET_CLASS (window)->is_stackable (window);
}
gboolean
meta_window_is_focus_async (MetaWindow *window)
{
return META_WINDOW_GET_CLASS (window)->is_focus_async (window);
}
MetaStackLayer
meta_window_calculate_layer (MetaWindow *window)
{

View File

@ -708,6 +708,12 @@ meta_window_wayland_are_updates_frozen (MetaWindow *window)
return !wl_window->has_been_shown;
}
static gboolean
meta_window_wayland_is_focus_async (MetaWindow *window)
{
return FALSE;
}
static MetaStackLayer
meta_window_wayland_calculate_layer (MetaWindow *window)
{
@ -764,6 +770,7 @@ meta_window_wayland_class_init (MetaWindowWaylandClass *klass)
window_class->calculate_layer = meta_window_wayland_calculate_layer;
window_class->map = meta_window_wayland_map;
window_class->unmap = meta_window_wayland_unmap;
window_class->is_focus_async = meta_window_wayland_is_focus_async;
}
MetaWindow *

View File

@ -2059,6 +2059,16 @@ meta_window_x11_impl_always_update_shape (MetaWindow *window)
return FALSE;
}
static gboolean
meta_window_x11_is_focus_async (MetaWindow *window)
{
MetaWindowX11 *window_x11 = META_WINDOW_X11 (window);
MetaWindowX11Private *priv =
meta_window_x11_get_instance_private (window_x11);
return !window->input && priv->wm_take_focus;
}
static void
meta_window_x11_class_init (MetaWindowX11Class *klass)
{
@ -2089,6 +2099,7 @@ meta_window_x11_class_init (MetaWindowX11Class *klass)
window_class->calculate_layer = meta_window_x11_calculate_layer;
window_class->map = meta_window_x11_map;
window_class->unmap = meta_window_x11_unmap;
window_class->is_focus_async = meta_window_x11_is_focus_async;
klass->freeze_commits = meta_window_x11_impl_freeze_commits;
klass->thaw_commits = meta_window_x11_impl_thaw_commits;