[PATCH wayland 1/2] client: add wl_data_offer_finish() and wl_data_source_dropped()
Giulio Camuffo
giuliocamuffo at gmail.com
Sat Mar 9 11:58:50 PST 2013
wl_data_offer_finish() must be called by the receiver client when the drop
operation is done. It wants a uint argument which must be a
wl_data_offer_dnd_action value, which are: ignore, copy, move, link.
This action value is passed to the wl_data_source_dropped() event
so that the source client can free the wl_data_source and do other
things that are necessary depending on the action value.
---
protocol/wayland.xml | 33 +++++++++++++++++++++++++++++++--
src/data-device.c | 20 ++++++++++++++++++++
src/wayland-server.h | 2 ++
3 files changed, 53 insertions(+), 2 deletions(-)
diff --git a/protocol/wayland.xml b/protocol/wayland.xml
index 0ce68ef..58931fb 100644
--- a/protocol/wayland.xml
+++ b/protocol/wayland.xml
@@ -296,7 +296,7 @@
</interface>
- <interface name="wl_data_offer" version="1">
+ <interface name="wl_data_offer" version="2">
<description summary="offer to transfer data">
A wl_data_offer represents a piece of data offered for transfer
by another client (the source client). It is used by the
@@ -341,9 +341,26 @@
<arg name="type" type="string"/>
</event>
+
+ <!-- Version 2 additions -->
+
+ <enum name="dnd_action">
+ <entry name="ignore" value="0"/>
+ <entry name="copy" value="1"/>
+ <entry name="move" value="2"/>
+ <entry name="link" value="4"/>
+ </enum>
+
+ <request name="finish">
+ <description summary="notify that the transfer operation is finished">
+ The client must issue this request when the data transfer operation
+ has finished. The source wl_data_source will be notified.
+ </description>
+ <arg name="action" type="uint"/>
+ </request>
</interface>
- <interface name="wl_data_source" version="1">
+ <interface name="wl_data_source" version="2">
<description summary="offer to transfer data">
The wl_data_source object is the source side of a wl_data_offer.
It is created by the source client in a data transfer and
@@ -392,6 +409,18 @@
</description>
</event>
+ <!-- Version 2 additions -->
+
+ <event name="dropped">
+ <description summary="the data has been dropped">
+ This event notifies the source client that the receiver client
+ has received the data and thaat the transfer operation has finished
+ succesfully. It passes the dnd action that the receiver has
+ requested.
+ </description>
+ <arg name="action" type="uint"/>
+ </event>
+
</interface>
<interface name="wl_data_device" version="1">
diff --git a/src/data-device.c b/src/data-device.c
index 4255c13..da3fe95 100644
--- a/src/data-device.c
+++ b/src/data-device.c
@@ -55,6 +55,17 @@ data_offer_receive(struct wl_client *client, struct wl_resource *resource,
}
static void
+data_offer_finish(struct wl_client *client, struct wl_resource *resource,
+ uint32_t action)
+{
+ printf("DONE\n");
+ struct wl_data_offer *offer = resource->data;
+
+ if (offer->source)
+ offer->source->dropped(offer->source, action);
+}
+
+static void
data_offer_destroy(struct wl_client *client, struct wl_resource *resource)
{
wl_resource_destroy(resource);
@@ -64,6 +75,7 @@ static const struct wl_data_offer_interface data_offer_interface = {
data_offer_accept,
data_offer_receive,
data_offer_destroy,
+ data_offer_finish,
};
static void
@@ -427,6 +439,13 @@ destroy_data_source(struct wl_resource *resource)
}
static void
+client_source_dropped(struct wl_data_source *source,
+ uint32_t action)
+{
+ wl_data_source_send_dropped(&source->resource, action);
+}
+
+static void
client_source_accept(struct wl_data_source *source,
uint32_t time, const char *mime_type)
{
@@ -467,6 +486,7 @@ create_data_source(struct wl_client *client,
source->resource.data = source;
wl_signal_init(&source->resource.destroy_signal);
+ source->dropped = client_source_dropped;
source->accept = client_source_accept;
source->send = client_source_send;
source->cancel = client_source_cancel;
diff --git a/src/wayland-server.h b/src/wayland-server.h
index c7369eb..5c834e2 100644
--- a/src/wayland-server.h
+++ b/src/wayland-server.h
@@ -275,6 +275,8 @@ struct wl_data_source {
void (*send)(struct wl_data_source *source,
const char *mime_type, int32_t fd);
void (*cancel)(struct wl_data_source *source);
+ void (*dropped)(struct wl_data_source *source,
+ uint32_t action);
};
struct wl_pointer {
--
1.8.1.5
More information about the wayland-devel
mailing list