From a37fd34bbb02b91ab057db78465ba17268022c91 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Thu, 2 Nov 2023 14:35:23 +0100 Subject: [PATCH] wayland: Make MetaWaylandSeat in charge of its own tablet seat The relation between seats and tablet seats is always 1:1, Make the MetaWaylandSeat hold its own MetaWaylandTabletSeat, and manipulate it directly. Part-of: --- src/wayland/meta-wayland-seat.c | 57 ++++++++---- src/wayland/meta-wayland-seat.h | 1 + src/wayland/meta-wayland-tablet-manager.c | 106 ---------------------- src/wayland/meta-wayland-tablet-manager.h | 7 -- src/wayland/meta-wayland.c | 11 +-- 5 files changed, 41 insertions(+), 141 deletions(-) diff --git a/src/wayland/meta-wayland-seat.c b/src/wayland/meta-wayland-seat.c index ee91ef1c3..24e3fa840 100644 --- a/src/wayland/meta-wayland-seat.c +++ b/src/wayland/meta-wayland-seat.c @@ -226,7 +226,8 @@ meta_wayland_seat_new (MetaWaylandCompositor *compositor, wl_global_create (display, &wl_seat_interface, META_WL_SEAT_VERSION, seat, bind_seat); - meta_wayland_tablet_manager_ensure_seat (compositor->tablet_manager, seat); + seat->tablet_seat = + meta_wayland_tablet_manager_ensure_seat (compositor->tablet_manager, seat); return seat; } @@ -305,10 +306,40 @@ out: return hardware_device && supported_device; } +static gboolean +is_tablet_event (MetaWaylandSeat *seat, + const ClutterEvent *event) +{ + ClutterInputDevice *device; + ClutterInputCapabilities capabilities; + + device = clutter_event_get_source_device (event); + capabilities = clutter_input_device_get_capabilities (device); + + if (capabilities & CLUTTER_INPUT_CAPABILITY_TABLET_TOOL) + { + return meta_wayland_tablet_seat_lookup_tablet (seat->tablet_seat, + device) != NULL; + } + if (capabilities & CLUTTER_INPUT_CAPABILITY_TABLET_PAD) + { + return meta_wayland_tablet_seat_lookup_pad (seat->tablet_seat, + device) != NULL; + } + + return FALSE; +} + void meta_wayland_seat_update (MetaWaylandSeat *seat, const ClutterEvent *event) { + if (is_tablet_event (seat, event)) + { + meta_wayland_tablet_seat_update (seat->tablet_seat, event); + return; + } + if (!(clutter_event_get_flags (event) & CLUTTER_EVENT_FLAG_INPUT_METHOD) && !event_from_supported_hardware_device (seat, event) && !event_is_synthesized_crossing (event)) @@ -350,6 +381,9 @@ meta_wayland_seat_handle_event (MetaWaylandSeat *seat, { ClutterEventType event_type; + if (is_tablet_event (seat, event)) + return meta_wayland_tablet_seat_handle_event (seat->tablet_seat, event); + if (!(clutter_event_get_flags (event) & CLUTTER_EVENT_FLAG_INPUT_METHOD) && !event_from_supported_hardware_device (seat, event)) return FALSE; @@ -413,9 +447,6 @@ void meta_wayland_seat_set_input_focus (MetaWaylandSeat *seat, MetaWaylandSurface *surface) { - MetaWaylandCompositor *compositor = meta_wayland_seat_get_compositor (seat); - MetaWaylandTabletSeat *tablet_seat; - if (seat->input_focus == surface) return; @@ -443,8 +474,7 @@ meta_wayland_seat_set_input_focus (MetaWaylandSeat *seat, meta_wayland_data_device_primary_set_keyboard_focus (&seat->primary_data_device); } - tablet_seat = meta_wayland_tablet_manager_ensure_seat (compositor->tablet_manager, seat); - meta_wayland_tablet_seat_set_pad_focus (tablet_seat, surface); + meta_wayland_tablet_seat_set_pad_focus (seat->tablet_seat, surface); meta_wayland_text_input_set_focus (seat->text_input, surface); } @@ -459,13 +489,9 @@ meta_wayland_seat_get_grab_info (MetaWaylandSeat *seat, float *x, float *y) { - MetaWaylandCompositor *compositor; - MetaWaylandTabletSeat *tablet_seat; GList *tools, *l; - compositor = meta_wayland_seat_get_compositor (seat); - tablet_seat = meta_wayland_tablet_manager_ensure_seat (compositor->tablet_manager, seat); - tools = g_hash_table_get_values (tablet_seat->tools); + tools = g_hash_table_get_values (seat->tablet_seat->tools); if (meta_wayland_seat_has_touch (seat)) { @@ -536,17 +562,10 @@ gboolean meta_wayland_seat_can_popup (MetaWaylandSeat *seat, uint32_t serial) { - MetaWaylandCompositor *compositor; - MetaWaylandTabletSeat *tablet_seat; - - compositor = meta_wayland_seat_get_compositor (seat); - tablet_seat = - meta_wayland_tablet_manager_ensure_seat (compositor->tablet_manager, seat); - return (meta_wayland_pointer_can_popup (seat->pointer, serial) || meta_wayland_keyboard_can_popup (seat->keyboard, serial) || meta_wayland_touch_can_popup (seat->touch, serial) || - meta_wayland_tablet_seat_can_popup (tablet_seat, serial)); + meta_wayland_tablet_seat_can_popup (seat->tablet_seat, serial)); } gboolean diff --git a/src/wayland/meta-wayland-seat.h b/src/wayland/meta-wayland-seat.h index df2e92dda..c4a012b60 100644 --- a/src/wayland/meta-wayland-seat.h +++ b/src/wayland/meta-wayland-seat.h @@ -42,6 +42,7 @@ struct _MetaWaylandSeat MetaWaylandPointer *pointer; MetaWaylandKeyboard *keyboard; MetaWaylandTouch *touch; + MetaWaylandTabletSeat *tablet_seat; MetaWaylandDataDevice data_device; MetaWaylandDataDevicePrimary primary_data_device; diff --git a/src/wayland/meta-wayland-tablet-manager.c b/src/wayland/meta-wayland-tablet-manager.c index 4d8ecddb9..b71532233 100644 --- a/src/wayland/meta-wayland-tablet-manager.c +++ b/src/wayland/meta-wayland-tablet-manager.c @@ -38,21 +38,6 @@ unbind_resource (struct wl_resource *resource) wl_list_remove (wl_resource_get_link (resource)); } -static gboolean -is_tablet_device (ClutterInputDevice *device) -{ - ClutterInputCapabilities capabilities; - - if (clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_LOGICAL) - return FALSE; - - capabilities = clutter_input_device_get_capabilities (device); - - return (capabilities & - (CLUTTER_INPUT_CAPABILITY_TABLET_TOOL | - CLUTTER_INPUT_CAPABILITY_TABLET_PAD)) != 0; -} - static void tablet_manager_get_tablet_seat (struct wl_client *client, struct wl_resource *resource, @@ -131,97 +116,6 @@ meta_wayland_tablet_manager_finalize (MetaWaylandCompositor *compositor) g_clear_pointer (&compositor->tablet_manager, g_free); } -static MetaWaylandTabletSeat * -meta_wayland_tablet_manager_lookup_seat (MetaWaylandTabletManager *manager, - ClutterInputDevice *device) -{ - MetaWaylandTabletSeat *tablet_seat; - MetaWaylandSeat *seat; - GHashTableIter iter; - - if (!device || !is_tablet_device (device)) - return NULL; - - g_hash_table_iter_init (&iter, manager->seats); - - while (g_hash_table_iter_next (&iter, (gpointer*) &seat, (gpointer*) &tablet_seat)) - { - if (meta_wayland_tablet_seat_lookup_tablet (tablet_seat, device) || - meta_wayland_tablet_seat_lookup_pad (tablet_seat, device)) - return tablet_seat; - } - - return NULL; -} - -gboolean -meta_wayland_tablet_manager_consumes_event (MetaWaylandTabletManager *manager, - const ClutterEvent *event) -{ - ClutterInputDevice *device = clutter_event_get_source_device (event); - - return meta_wayland_tablet_manager_lookup_seat (manager, device) != NULL; -} - -void -meta_wayland_tablet_manager_update (MetaWaylandTabletManager *manager, - const ClutterEvent *event) -{ - ClutterInputDevice *device = clutter_event_get_source_device (event); - MetaWaylandTabletSeat *tablet_seat; - - tablet_seat = meta_wayland_tablet_manager_lookup_seat (manager, device); - - if (!tablet_seat) - return; - - switch (clutter_event_type (event)) - { - case CLUTTER_PROXIMITY_IN: - case CLUTTER_PROXIMITY_OUT: - case CLUTTER_BUTTON_PRESS: - case CLUTTER_BUTTON_RELEASE: - case CLUTTER_MOTION: - case CLUTTER_PAD_BUTTON_PRESS: - case CLUTTER_PAD_BUTTON_RELEASE: - case CLUTTER_PAD_RING: - case CLUTTER_PAD_STRIP: - meta_wayland_tablet_seat_update (tablet_seat, event); - break; - default: - break; - } -} - -gboolean -meta_wayland_tablet_manager_handle_event (MetaWaylandTabletManager *manager, - const ClutterEvent *event) -{ - ClutterInputDevice *device = clutter_event_get_source_device (event); - MetaWaylandTabletSeat *tablet_seat; - - tablet_seat = meta_wayland_tablet_manager_lookup_seat (manager, device); - - if (!tablet_seat) - return CLUTTER_EVENT_PROPAGATE; - - switch (clutter_event_type (event)) - { - case CLUTTER_PROXIMITY_IN: - case CLUTTER_PROXIMITY_OUT: - case CLUTTER_BUTTON_PRESS: - case CLUTTER_BUTTON_RELEASE: - case CLUTTER_MOTION: - case CLUTTER_PAD_BUTTON_PRESS: - case CLUTTER_PAD_BUTTON_RELEASE: - case CLUTTER_PAD_RING: - case CLUTTER_PAD_STRIP: - return meta_wayland_tablet_seat_handle_event (tablet_seat, event); - default: - return CLUTTER_EVENT_PROPAGATE; - } -} - MetaWaylandTabletSeat * meta_wayland_tablet_manager_ensure_seat (MetaWaylandTabletManager *manager, MetaWaylandSeat *seat) diff --git a/src/wayland/meta-wayland-tablet-manager.h b/src/wayland/meta-wayland-tablet-manager.h index 68f5e6938..2798a0be6 100644 --- a/src/wayland/meta-wayland-tablet-manager.h +++ b/src/wayland/meta-wayland-tablet-manager.h @@ -38,13 +38,6 @@ struct _MetaWaylandTabletManager void meta_wayland_tablet_manager_init (MetaWaylandCompositor *compositor); void meta_wayland_tablet_manager_finalize (MetaWaylandCompositor *compositor); -gboolean meta_wayland_tablet_manager_consumes_event (MetaWaylandTabletManager *manager, - const ClutterEvent *event); -void meta_wayland_tablet_manager_update (MetaWaylandTabletManager *manager, - const ClutterEvent *event); -gboolean meta_wayland_tablet_manager_handle_event (MetaWaylandTabletManager *manager, - const ClutterEvent *event); - MetaWaylandTabletSeat * meta_wayland_tablet_manager_ensure_seat (MetaWaylandTabletManager *manager, MetaWaylandSeat *seat); diff --git a/src/wayland/meta-wayland.c b/src/wayland/meta-wayland.c index 24840263b..69e8a60cb 100644 --- a/src/wayland/meta-wayland.c +++ b/src/wayland/meta-wayland.c @@ -396,10 +396,7 @@ void meta_wayland_compositor_update (MetaWaylandCompositor *compositor, const ClutterEvent *event) { - if (meta_wayland_tablet_manager_consumes_event (compositor->tablet_manager, event)) - meta_wayland_tablet_manager_update (compositor->tablet_manager, event); - else - meta_wayland_seat_update (compositor->seat, event); + meta_wayland_seat_update (compositor->seat, event); } static MetaWaylandOutput * @@ -472,10 +469,6 @@ gboolean meta_wayland_compositor_handle_event (MetaWaylandCompositor *compositor, const ClutterEvent *event) { - if (meta_wayland_tablet_manager_handle_event (compositor->tablet_manager, - event)) - return TRUE; - return meta_wayland_seat_handle_event (compositor->seat, event); } @@ -618,7 +611,6 @@ meta_wayland_compositor_finalize (GObject *object) meta_wayland_activation_finalize (compositor); meta_wayland_outputs_finalize (compositor); meta_wayland_presentation_time_finalize (compositor); - meta_wayland_tablet_manager_finalize (compositor); g_hash_table_destroy (compositor->scheduled_surface_associations); @@ -630,6 +622,7 @@ meta_wayland_compositor_finalize (GObject *object) g_clear_object (&compositor->dma_buf_manager); g_clear_pointer (&compositor->seat, meta_wayland_seat_free); + meta_wayland_tablet_manager_finalize (compositor); g_clear_pointer (&priv->filter_manager, meta_wayland_filter_manager_free); g_clear_pointer (&priv->frame_callback_sources, g_hash_table_destroy);