gdk/wayland: Ensure device-added/removed emission in GdkSeat
authorCarlos Garnacho <carlosg@gnome.org>
Tue, 13 Jun 2023 20:52:48 +0000 (22:52 +0200)
committerSimon McVittie <smcv@debian.org>
Wed, 8 Nov 2023 16:30:21 +0000 (16:30 +0000)
We've used to emit these in the GdkDeviceManager, but missed to do
this signal emission at the GdkSeat object level. In order to avoid
the double emission, trigger one from the other.

Forwarded: https://gitlab.gnome.org/GNOME/gtk/-/merge_requests/6049
Origin: 3.24.39, commit:81029b824b39122704a9bd615dc7b03886516843

Gbp-Pq: Name gdk-wayland-Ensure-device-added-removed-emission-in-GdkSe.patch

gdk/wayland/gdkdevice-wayland.c

index 7e7beac9d1e4c729d08b4cfaf044e1667020f86b..dd7db81cf1b72ce3b4592af658dcaa6031bfca6c 100644 (file)
@@ -5181,6 +5181,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,
@@ -5249,6 +5265,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));
 }
 
@@ -5268,6 +5289,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;
     }