[PATCH] data-device: Clean up the logic in start_drag

Jason Ekstrand jason at jlekstrand.net
Tue Jun 24 21:23:53 PDT 2014


Previoiusly, we had a mess of logic that was repeated with one of the
repeats negated.  Not only was this unnecisaraly confusing, but it
segfaulted and one of the negations was wrong.  This cleans the whole mess
up and should fix bug #79725.
---
 src/data-device.c | 30 ++++++++++++++++--------------
 1 file changed, 16 insertions(+), 14 deletions(-)

diff --git a/src/data-device.c b/src/data-device.c
index 6a81bc8..092eb0c 100644
--- a/src/data-device.c
+++ b/src/data-device.c
@@ -648,15 +648,22 @@ data_device_start_drag(struct wl_client *client, struct wl_resource *resource,
 	struct weston_seat *seat = wl_resource_get_user_data(resource);
 	struct weston_data_source *source = NULL;
 	struct weston_surface *icon = NULL;
+	int is_pointer_grab, is_touch_grab;
 	int32_t ret = 0;
 
-	if ((seat->pointer->button_count == 0 ||
-	    seat->pointer->grab_serial != serial ||
-	    !seat->pointer->focus ||
-	    seat->pointer->focus->surface != wl_resource_get_user_data(origin_resource)) &&
-		(seat->touch->grab_serial != serial ||
-		!seat->touch->focus ||
-		seat->touch->focus->surface != wl_resource_get_user_data(origin_resource)))
+	is_pointer_grab = seat->pointer &&
+			  seat->pointer->button_count == 1 &&
+			  seat->pointer->grab_serial == serial &&
+			  seat->pointer->focus &&
+			  seat->pointer->focus->surface == wl_resource_get_user_data(origin_resource);
+
+	is_touch_grab = seat->touch &&
+			seat->touch->num_tp == 1 &&
+			seat->touch->grab_serial == serial &&
+			seat->touch->focus &&
+			seat->touch->focus->surface == wl_resource_get_user_data(origin_resource);
+
+	if (!is_pointer_grab && !is_touch_grab)
 		return;
 
 	/* FIXME: Check that the data source type array isn't empty. */
@@ -672,14 +679,9 @@ data_device_start_drag(struct wl_client *client, struct wl_resource *resource,
 		return;
 	}
 
-	if (seat->pointer->button_count == 1 &&
-		seat->pointer->grab_serial == serial &&
-		seat->pointer->focus &&
-		seat->pointer->focus->surface == wl_resource_get_user_data(origin_resource))
+	if (is_pointer_grab)
 		ret = weston_pointer_start_drag(seat->pointer, source, icon, client);
-	else if (seat->touch->grab_serial != serial ||
-		seat->touch->focus ||
-		seat->touch->focus->surface != wl_resource_get_user_data(origin_resource))
+	else if (is_touch_grab)
 		ret = weston_touch_start_drag(seat->touch, source, icon, client);
 
 	if (ret < 0)
-- 
2.0.0



More information about the wayland-devel mailing list