summaryrefslogtreecommitdiff
path: root/src/data-device.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/data-device.c')
-rw-r--r--src/data-device.c48
1 files changed, 22 insertions, 26 deletions
diff --git a/src/data-device.c b/src/data-device.c
index 6a81bc8e..75fc60cb 100644
--- a/src/data-device.c
+++ b/src/data-device.c
@@ -53,13 +53,6 @@ struct weston_touch_drag {
};
static void
-empty_region(pixman_region32_t *region)
-{
- pixman_region32_fini(region);
- pixman_region32_init(region);
-}
-
-static void
data_offer_accept(struct wl_client *client, struct wl_resource *resource,
uint32_t serial, const char *mime_type)
{
@@ -187,7 +180,7 @@ drag_surface_configure(struct weston_drag *drag,
struct weston_surface *es,
int32_t sx, int32_t sy)
{
- struct wl_list *list;
+ struct weston_layer_entry *list;
float fx, fy;
assert((pointer != NULL && touch == NULL) ||
@@ -200,10 +193,10 @@ drag_surface_configure(struct weston_drag *drag,
else
list = &es->compositor->cursor_layer.view_list;
- wl_list_remove(&drag->icon->layer_link);
- wl_list_insert(list, &drag->icon->layer_link);
+ weston_layer_entry_remove(&drag->icon->layer_link);
+ weston_layer_entry_insert(list, &drag->icon->layer_link);
weston_view_update_transform(drag->icon);
- empty_region(&es->pending.input);
+ pixman_region32_clear(&es->pending.input);
}
drag->dx += sx;
@@ -358,7 +351,7 @@ data_device_end_drag_grab(struct weston_drag *drag,
weston_view_unmap(drag->icon);
drag->icon->surface->configure = NULL;
- empty_region(&drag->icon->surface->pending.input);
+ pixman_region32_clear(&drag->icon->surface->pending.input);
wl_list_remove(&drag->icon_destroy_listener.link);
weston_view_destroy(drag->icon);
}
@@ -646,17 +639,25 @@ data_device_start_drag(struct wl_client *client, struct wl_resource *resource,
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. */
@@ -672,14 +673,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)