diff --git a/src/wayland/meta-wayland-pointer-gesture-hold.c b/src/wayland/meta-wayland-pointer-gesture-hold.c
index 904b0654b..4d24f7316 100644
--- a/src/wayland/meta-wayland-pointer-gesture-hold.c
+++ b/src/wayland/meta-wayland-pointer-gesture-hold.c
@@ -52,29 +52,41 @@ handle_hold_begin (MetaWaylandPointer *pointer,
     }
 }
 
+static void
+broadcast_end (MetaWaylandPointer *pointer,
+               uint32_t            serial,
+               uint32_t            time,
+               gboolean            cancelled)
+{
+  MetaWaylandPointerClient *pointer_client;
+  struct wl_resource *resource;
+
+  pointer_client = pointer->focus_client;
+
+  wl_resource_for_each (resource, &pointer_client->hold_gesture_resources)
+    {
+      zwp_pointer_gesture_hold_v1_send_end (resource, serial,
+                                            time, cancelled);
+    }
+}
+
 static void
 handle_hold_end (MetaWaylandPointer *pointer,
                  const ClutterEvent *event)
 {
-  MetaWaylandPointerClient *pointer_client;
   MetaWaylandSeat *seat;
-  struct wl_resource *resource;
   gboolean cancelled = FALSE;
   uint32_t serial;
 
-  pointer_client = pointer->focus_client;
   seat = meta_wayland_pointer_get_seat (pointer);
   serial = wl_display_next_serial (seat->wl_display);
 
   if (event->touchpad_hold.phase == CLUTTER_TOUCHPAD_GESTURE_PHASE_CANCEL)
     cancelled = TRUE;
 
-  wl_resource_for_each (resource, &pointer_client->hold_gesture_resources)
-    {
-      zwp_pointer_gesture_hold_v1_send_end (resource, serial,
-                                            clutter_event_get_time (event),
-                                            cancelled);
-    }
+  broadcast_end (pointer, serial,
+                 clutter_event_get_time (event),
+                 cancelled);
 }
 
 gboolean
diff --git a/src/wayland/meta-wayland-pointer-gesture-pinch.c b/src/wayland/meta-wayland-pointer-gesture-pinch.c
index f7b37ff27..89d1ba634 100644
--- a/src/wayland/meta-wayland-pointer-gesture-pinch.c
+++ b/src/wayland/meta-wayland-pointer-gesture-pinch.c
@@ -80,29 +80,41 @@ handle_pinch_update (MetaWaylandPointer *pointer,
     }
 }
 
+static void
+broadcast_end (MetaWaylandPointer *pointer,
+               uint32_t            serial,
+               uint32_t            time,
+               gboolean            cancelled)
+{
+  MetaWaylandPointerClient *pointer_client;
+  struct wl_resource *resource;
+
+  pointer_client = pointer->focus_client;
+
+  wl_resource_for_each (resource, &pointer_client->pinch_gesture_resources)
+    {
+      zwp_pointer_gesture_pinch_v1_send_end (resource, serial,
+                                             time, cancelled);
+    }
+}
+
 static void
 handle_pinch_end (MetaWaylandPointer *pointer,
                   const ClutterEvent *event)
 {
-  MetaWaylandPointerClient *pointer_client;
   MetaWaylandSeat *seat;
-  struct wl_resource *resource;
   gboolean cancelled = FALSE;
   uint32_t serial;
 
-  pointer_client = pointer->focus_client;
   seat = meta_wayland_pointer_get_seat (pointer);
   serial = wl_display_next_serial (seat->wl_display);
 
   if (event->touchpad_pinch.phase == CLUTTER_TOUCHPAD_GESTURE_PHASE_CANCEL)
     cancelled = TRUE;
 
-  wl_resource_for_each (resource, &pointer_client->pinch_gesture_resources)
-    {
-      zwp_pointer_gesture_pinch_v1_send_end (resource, serial,
-                                             clutter_event_get_time (event),
-                                             cancelled);
-    }
+  broadcast_end (pointer, serial,
+                 clutter_event_get_time (event),
+                 cancelled);
 }
 
 gboolean
diff --git a/src/wayland/meta-wayland-pointer-gesture-swipe.c b/src/wayland/meta-wayland-pointer-gesture-swipe.c
index d95e84941..1e34c4908 100644
--- a/src/wayland/meta-wayland-pointer-gesture-swipe.c
+++ b/src/wayland/meta-wayland-pointer-gesture-swipe.c
@@ -76,29 +76,41 @@ handle_swipe_update (MetaWaylandPointer *pointer,
     }
 }
 
+static void
+broadcast_end (MetaWaylandPointer *pointer,
+               uint32_t            serial,
+               uint32_t            time,
+               gboolean            cancelled)
+{
+  MetaWaylandPointerClient *pointer_client;
+  struct wl_resource *resource;
+
+  pointer_client = pointer->focus_client;
+
+  wl_resource_for_each (resource, &pointer_client->swipe_gesture_resources)
+    {
+      zwp_pointer_gesture_swipe_v1_send_end (resource, serial,
+                                             time, cancelled);
+    }
+}
+
 static void
 handle_swipe_end (MetaWaylandPointer *pointer,
                   const ClutterEvent *event)
 {
-  MetaWaylandPointerClient *pointer_client;
   MetaWaylandSeat *seat;
-  struct wl_resource *resource;
   gboolean cancelled = FALSE;
   uint32_t serial;
 
-  pointer_client = pointer->focus_client;
   seat = meta_wayland_pointer_get_seat (pointer);
   serial = wl_display_next_serial (seat->wl_display);
 
   if (event->touchpad_swipe.phase == CLUTTER_TOUCHPAD_GESTURE_PHASE_CANCEL)
     cancelled = TRUE;
 
-  wl_resource_for_each (resource, &pointer_client->swipe_gesture_resources)
-    {
-      zwp_pointer_gesture_swipe_v1_send_end (resource, serial,
-                                             clutter_event_get_time (event),
-                                             cancelled);
-    }
+  broadcast_end (pointer, serial,
+                 clutter_event_get_time (event),
+                 cancelled);
 }
 
 gboolean