Merge branch 'wip/carlosg/pad-detection-3-24' into 'gtk-3-24'

Pad detection fixes (3.24)

See merge request GNOME/gtk!6095
This commit is contained in:
Matthias Clasen 2023-06-14 00:10:23 +00:00
commit 7141305972

View File

@ -2921,13 +2921,17 @@ _gdk_wayland_seat_remove_tablet_pad (GdkWaylandSeat *seat,
seat->tablet_pads = g_list_remove (seat->tablet_pads, pad);
device_manager->devices =
g_list_remove (device_manager->devices, pad->device);
g_signal_emit_by_name (device_manager, "device-removed", pad->device);
if (pad->device)
{
device_manager->devices =
g_list_remove (device_manager->devices, pad->device);
g_signal_emit_by_name (device_manager, "device-removed", pad->device);
_gdk_device_set_associated_device (pad->device, NULL);
_gdk_device_set_associated_device (pad->device, NULL);
g_object_unref (pad->device);
}
g_object_unref (pad->device);
g_free (pad);
}
@ -4439,27 +4443,8 @@ static void
tablet_pad_handle_done (void *data,
struct zwp_tablet_pad_v2 *wp_tablet_pad)
{
GdkWaylandTabletPadData *pad = data;
GdkWaylandSeat *seat = GDK_WAYLAND_SEAT (pad->seat);
GdkWaylandDeviceManager *device_manager =
GDK_WAYLAND_DEVICE_MANAGER (seat->device_manager);
GDK_NOTE (EVENTS,
g_message ("tablet pad handle done, pad = %p", wp_tablet_pad));
pad->device =
g_object_new (GDK_TYPE_WAYLAND_DEVICE_PAD,
"name", "Pad device",
"type", GDK_DEVICE_TYPE_SLAVE,
"input-source", GDK_SOURCE_TABLET_PAD,
"input-mode", GDK_MODE_SCREEN,
"display", gdk_seat_get_display (pad->seat),
"device-manager", device_manager,
"seat", seat,
NULL);
_gdk_device_set_associated_device (pad->device, seat->master_keyboard);
g_signal_emit_by_name (device_manager, "device-added", pad->device);
}
static void
@ -4506,14 +4491,60 @@ tablet_pad_handle_enter (void *data,
{
GdkWaylandTabletPadData *pad = data;
GdkWaylandTabletData *tablet = zwp_tablet_v2_get_user_data (wp_tablet);
GdkWaylandSeat *seat = GDK_WAYLAND_SEAT (pad->seat);
GdkWaylandDeviceManager *device_manager =
GDK_WAYLAND_DEVICE_MANAGER (seat->device_manager);
GDK_NOTE (EVENTS,
g_message ("tablet pad handle enter, pad = %p, tablet = %p surface = %p",
wp_tablet_pad, wp_tablet, surface));
if (pad->device && pad->current_tablet != tablet)
{
device_manager->devices =
g_list_remove (device_manager->devices, pad->device);
g_signal_emit_by_name (device_manager, "device-removed", pad->device);
_gdk_device_set_associated_device (pad->device, NULL);
g_clear_object (&pad->device);
}
/* Relate pad and tablet */
tablet->pads = g_list_prepend (tablet->pads, pad);
tablet->pads = g_list_append (tablet->pads, pad);
pad->current_tablet = tablet;
if (!pad->device)
{
GdkWaylandTabletPadData *pad = data;
gchar *name, *vid, *pid;
name = g_strdup_printf ("%s Pad %d",
tablet->name,
g_list_index (tablet->pads, pad) + 1);
vid = g_strdup_printf ("%.4x", tablet->vid);
pid = g_strdup_printf ("%.4x", tablet->pid);
pad->device =
g_object_new (GDK_TYPE_WAYLAND_DEVICE_PAD,
"name", name,
"vendor-id", vid,
"product-id", pid,
"type", GDK_DEVICE_TYPE_SLAVE,
"input-source", GDK_SOURCE_TABLET_PAD,
"input-mode", GDK_MODE_SCREEN,
"display", gdk_seat_get_display (pad->seat),
"device-manager", device_manager,
"seat", seat,
NULL);
_gdk_device_set_associated_device (pad->device, seat->master_keyboard);
device_manager->devices =
g_list_prepend (device_manager->devices, pad->device);
g_signal_emit_by_name (device_manager, "device-added", pad->device);
g_free (name);
g_free (vid);
g_free (pid);
}
}
static void
@ -4529,10 +4560,7 @@ tablet_pad_handle_leave (void *data,
wp_tablet_pad, surface));
if (pad->current_tablet)
{
pad->current_tablet->pads = g_list_remove (pad->current_tablet->pads, pad);
pad->current_tablet = NULL;
}
pad->current_tablet->pads = g_list_remove (pad->current_tablet->pads, pad);
}
static void
@ -5113,6 +5141,21 @@ gdk_wayland_seat_get_slaves (GdkSeat *seat,
}
}
/* There is no specific capability for pads, return
* them anyways if all devices are requested
*/
if (capabilities == GDK_SEAT_CAPABILITY_ALL)
{
GList *l;
for (l = wayland_seat->tablet_pads; l; l = l->next)
{
GdkWaylandTabletPadData *pad = l->data;
slaves = g_list_prepend (slaves, pad->device);
}
}
return slaves;
}
@ -5153,6 +5196,22 @@ init_pointer_data (GdkWaylandPointerData *pointer_data,
master);
}
static void
device_manager_device_added (GdkDeviceManager *device_manager,
GdkDevice *device,
GdkSeat *seat)
{
g_signal_emit_by_name (seat, "device-added", device);
}
static void
device_manager_device_removed (GdkDeviceManager *device_manager,
GdkDevice *device,
GdkSeat *seat)
{
g_signal_emit_by_name (seat, "device-removed", device);
}
void
_gdk_wayland_device_manager_add_seat (GdkDeviceManager *device_manager,
guint32 id,
@ -5221,6 +5280,11 @@ _gdk_wayland_device_manager_add_seat (GdkDeviceManager *device_manager,
seat);
}
g_signal_connect (seat->device_manager, "device-added",
G_CALLBACK (device_manager_device_added), seat);
g_signal_connect (seat->device_manager, "device-removed",
G_CALLBACK (device_manager_device_removed), seat);
gdk_display_add_seat (display, GDK_SEAT (seat));
}
@ -5240,6 +5304,12 @@ _gdk_wayland_device_manager_remove_seat (GdkDeviceManager *manager,
if (seat->id != id)
continue;
g_signal_handlers_disconnect_by_func (manager,
device_manager_device_added,
seat);
g_signal_handlers_disconnect_by_func (manager,
device_manager_device_removed,
seat);
gdk_display_remove_seat (display, GDK_SEAT (seat));
break;
}