wayland/pointer: Add support for the new ClutterSeat inhibit-unfocus API

The last commit added a new API to ClutterSeat to inhibit setting the
focus-surface of the MetaWaylandPointer to NULL, let's do that.

https://gitlab.gnome.org/GNOME/mutter/merge_requests/1077
This commit is contained in:
Jonas Dreßler 2020-02-19 21:19:19 +01:00 committed by Jonas Ådahl
parent a9b1134dfb
commit bf24b816c2

View File

@ -227,8 +227,11 @@ sync_focus_surface (MetaWaylandPointer *pointer)
MetaDisplay *display = meta_get_display ();
MetaBackend *backend = meta_get_backend ();
MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
ClutterBackend *clutter_backend = clutter_get_default_backend ();
ClutterSeat *clutter_seat = clutter_backend_get_default_seat (clutter_backend);
if (!meta_cursor_tracker_get_pointer_visible (cursor_tracker))
if (!meta_cursor_tracker_get_pointer_visible (cursor_tracker) &&
!clutter_seat_is_unfocus_inhibited (clutter_seat))
{
meta_wayland_pointer_set_focus (pointer, NULL);
return;
@ -430,11 +433,14 @@ default_grab_focus (MetaWaylandPointerGrab *grab,
MetaDisplay *display = meta_get_display ();
MetaBackend *backend = meta_get_backend ();
MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
ClutterBackend *clutter_backend = clutter_get_default_backend ();
ClutterSeat *clutter_seat = clutter_backend_get_default_seat (clutter_backend);
if (!meta_wayland_seat_has_pointer (seat))
return;
if (!meta_cursor_tracker_get_pointer_visible (cursor_tracker))
if (!meta_cursor_tracker_get_pointer_visible (cursor_tracker) &&
!clutter_seat_is_unfocus_inhibited (clutter_seat))
return;
if (pointer->button_count > 0)
@ -520,6 +526,11 @@ meta_wayland_pointer_enable (MetaWaylandPointer *pointer)
"visibility-changed",
G_CALLBACK (meta_wayland_pointer_on_cursor_visibility_changed),
pointer);
g_signal_connect_swapped (clutter_seat,
"is-unfocus-inhibited-changed",
G_CALLBACK (sync_focus_surface),
pointer);
}
void
@ -527,6 +538,8 @@ meta_wayland_pointer_disable (MetaWaylandPointer *pointer)
{
MetaBackend *backend = meta_get_backend ();
MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
ClutterBackend *clutter_backend = clutter_get_default_backend ();
ClutterSeat *clutter_seat = clutter_backend_get_default_seat (clutter_backend);
g_signal_handlers_disconnect_by_func (cursor_tracker,
(gpointer) meta_wayland_pointer_on_cursor_changed,
@ -536,6 +549,10 @@ meta_wayland_pointer_disable (MetaWaylandPointer *pointer)
meta_wayland_pointer_on_cursor_visibility_changed,
pointer);
g_signal_handlers_disconnect_by_func (clutter_seat,
sync_focus_surface,
pointer);
if (pointer->cursor_surface)
{
g_clear_signal_handler (&pointer->cursor_surface_destroy_id,
@ -897,8 +914,11 @@ meta_wayland_pointer_set_focus (MetaWaylandPointer *pointer,
MetaWaylandInputDevice *input_device = META_WAYLAND_INPUT_DEVICE (pointer);
MetaBackend *backend = meta_get_backend ();
MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
ClutterBackend *clutter_backend = clutter_get_default_backend ();
ClutterSeat *clutter_seat = clutter_backend_get_default_seat (clutter_backend);
g_return_if_fail (meta_cursor_tracker_get_pointer_visible (cursor_tracker) ||
clutter_seat_is_unfocus_inhibited (clutter_seat) ||
surface == NULL);
if (pointer->focus_surface == surface)