gdk/wayland: Clean up gestures if pointer capability is withdrawn
authorVlad Zahorodnii <vlad.zahorodnii@kde.org>
Tue, 22 Jun 2021 06:23:42 +0000 (09:23 +0300)
committerVlad Zahorodnii <vlad.zahorodnii@kde.org>
Wed, 21 Jul 2021 17:52:16 +0000 (20:52 +0300)
If the pointer capability is added, pointer swipe and pinch gestures
will be created. However, if the pointer capability is removed, the
gesture objects won't be destroyed.

If the pointer capability is removed and added several times in a row,
for example due to plugging and unplugging physical mouse, this can lead
to leaking the old gesture objects.

In order to prevent that, this change makes the seat destroy swipe and
pinch gestures when the pointer capability is withdrawn.

gdk/wayland/gdkdevice-wayland.c

index ca94a6e7e5e13e702aa90e332e279e639686d342..1ee83984da481e56520356c9df0354d57756bf09 100644 (file)
@@ -3093,6 +3093,11 @@ seat_handle_capabilities (void                    *data,
     }
   else if (!(caps & WL_SEAT_CAPABILITY_POINTER) && seat->wl_pointer)
     {
+      g_clear_pointer (&seat->wp_pointer_gesture_swipe,
+                       zwp_pointer_gesture_swipe_v1_destroy);
+      g_clear_pointer (&seat->wp_pointer_gesture_pinch,
+                       zwp_pointer_gesture_pinch_v1_destroy);
+
       wl_pointer_release (seat->wl_pointer);
       seat->wl_pointer = NULL;
       gdk_seat_device_removed (GDK_SEAT (seat), seat->pointer);