diff options
Diffstat (limited to 'src/data-device.c')
-rw-r--r-- | src/data-device.c | 48 |
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) |