diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2016-01-15 21:14:23 +0100 |
---|---|---|
committer | Jonas Ådahl <jadahl@gmail.com> | 2016-01-19 12:34:35 +0800 |
commit | 78d4bf9a3ec990dceee23fd53962a69891352a0e (patch) | |
tree | 7c9ea18385de33240ea4a25801ed5fc488e6175a /clients/window.c | |
parent | 87743e93036c661b7d46a3ebb2a1a16233064004 (diff) | |
download | weston-78d4bf9a3ec990dceee23fd53962a69891352a0e.tar.gz |
data-device: Implement DnD progress notification
Weston now sends wl_data_source.dnd_drop_performed and .dnd_finished in
order to notify about the different phases of DnD.
wl_data_source.cancelled is also used as mentioned in the docs, being
emitted also on DnD when the operation is meant to fail (eg. source
and dest didn't agree on a mimetype).
The dnd demo is also fixed so the struct dnd_drag isn't leaked.
https://bugs.freedesktop.org/show_bug.cgi?id=91943
https://bugs.freedesktop.org/show_bug.cgi?id=91944
Changes since v6:
- Add client-side version checks. Minor code shuffling.
Changes since v5:
- Dissociate source and offer after cancel. Updated to
apply on top of c9f8f8a7f.
Changes since v4:
- Make wl_data_offer.finish with the wrong state an error.
Changes since v3:
- Fixed wl_data_source.dnd_finished vs cancelled emission on
when interoperating with version < 3 drag destinations.
Changes since v2:
- Handle wl_data_offer.finish. Fixed commit log inconsistencies.
Added version checks. Spaces vs tabs fixes. Fixed resource
versioning.
Changes since v1:
- Updated to protocol v2.
Signed-off-by: Carlos Garnacho <carlosg@gnome.org>
Reviewed-by: Michael Catanzaro <mcatanzaro@igalia.com>
Reviewed-by: Jonas Ådahl <jadahl@gmail.com>
Reviewed-by: Bryce Harrington <bryce@osg.samsung.com>
Diffstat (limited to 'clients/window.c')
-rw-r--r-- | clients/window.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/clients/window.c b/clients/window.c index 7d45acd4..1b3cbb1e 100644 --- a/clients/window.c +++ b/clients/window.c @@ -3812,6 +3812,7 @@ offer_io_func(struct task *task, uint32_t events) { struct data_offer *offer = container_of(task, struct data_offer, io_task); + struct display *display = offer->input->display; unsigned int len; char buffer[4096]; @@ -3820,6 +3821,9 @@ offer_io_func(struct task *task, uint32_t events) offer->x, offer->y, offer->user_data); if (len == 0) { + if (display->data_device_manager_version >= + WL_DATA_OFFER_FINISH_SINCE_VERSION) + wl_data_offer_finish(offer->offer); close(offer->fd); data_offer_destroy(offer); } @@ -5413,7 +5417,7 @@ registry_handle_global(void *data, struct wl_registry *registry, uint32_t id, d->shm = wl_registry_bind(registry, id, &wl_shm_interface, 1); wl_shm_add_listener(d->shm, &shm_listener, d); } else if (strcmp(interface, "wl_data_device_manager") == 0) { - d->data_device_manager_version = MIN(version, 2); + d->data_device_manager_version = MIN(version, 3); d->data_device_manager = wl_registry_bind(registry, id, &wl_data_device_manager_interface, |