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: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3420>
This commit is contained in:
parent
5768caea81
commit
a37fd34bbb
5 changed files with 41 additions and 141 deletions
|
@ -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
|
||||
|
|
|
@ -42,6 +42,7 @@ struct _MetaWaylandSeat
|
|||
MetaWaylandPointer *pointer;
|
||||
MetaWaylandKeyboard *keyboard;
|
||||
MetaWaylandTouch *touch;
|
||||
MetaWaylandTabletSeat *tablet_seat;
|
||||
|
||||
MetaWaylandDataDevice data_device;
|
||||
MetaWaylandDataDevicePrimary primary_data_device;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue