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:
commit
7141305972
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user