struct wl_resource *icon_resource, uint32_t serial)
{
struct weston_seat *seat = wl_resource_get_user_data(resource);
+ struct weston_surface *origin = wl_resource_get_user_data(origin_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 == origin;
+
+ is_touch_grab = seat->touch &&
+ seat->touch->num_tp == 1 &&
+ seat->touch->grab_serial == serial &&
+ seat->touch->focus &&
+ seat->touch->focus->surface == origin;
+
+ if (!is_pointer_grab && !is_touch_grab)
return;
/* FIXME: Check that the data source type array isn't empty. */
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)