summaryrefslogtreecommitdiff
path: root/src/data-device.c
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2013-09-04 20:44:26 -0700
committerKristian Høgsberg <krh@bitplanet.net>2013-09-04 20:46:56 -0700
commit85de9c25fe16d8bab928295fd68851738ef23b24 (patch)
treeea5a902df448c336b739eed130cceaa363da7448 /src/data-device.c
parent0749e3f470a9d1cb7ec78c199962b84dce72e1f9 (diff)
downloadweston-85de9c25fe16d8bab928295fd68851738ef23b24.tar.gz
compositor: Split dnd setup up into weston_seat_start_drag()
This makes the drag-and-drop code available to in-weston data sources, similar to how we can set a selection data source internally. The wl_data_device.start_drag entry point now calls this function after validating protocol arguments.
Diffstat (limited to 'src/data-device.c')
-rw-r--r--src/data-device.c70
1 files changed, 41 insertions, 29 deletions
diff --git a/src/data-device.c b/src/data-device.c
index 1eb19257..ec3df338 100644
--- a/src/data-device.c
+++ b/src/data-device.c
@@ -358,6 +358,43 @@ handle_drag_icon_destroy(struct wl_listener *listener, void *data)
drag->icon = NULL;
}
+WL_EXPORT int
+weston_seat_start_drag(struct weston_seat *seat,
+ struct weston_data_source *source,
+ struct weston_surface *icon,
+ struct wl_client *client)
+{
+ struct weston_drag *drag;
+
+ drag = zalloc(sizeof *drag);
+ if (drag == NULL)
+ return -1;
+
+ drag->grab.interface = &drag_grab_interface;
+ drag->client = client;
+ drag->data_source = source;
+ drag->icon = icon;
+
+ if (source) {
+ drag->data_source_listener.notify = destroy_data_device_source;
+ wl_signal_add(&source->destroy_signal,
+ &drag->data_source_listener);
+ }
+
+ if (icon) {
+ drag->icon_destroy_listener.notify = handle_drag_icon_destroy;
+ wl_signal_add(&icon->destroy_signal,
+ &drag->icon_destroy_listener);
+
+ icon->configure = drag_surface_configure;
+ icon->configure_private = drag;
+ }
+
+ weston_pointer_set_focus(seat->pointer, NULL,
+ wl_fixed_from_int(0), wl_fixed_from_int(0));
+ weston_pointer_start_grab(seat->pointer, &drag->grab);
+}
+
static void
data_device_start_drag(struct wl_client *client, struct wl_resource *resource,
struct wl_resource *source_resource,
@@ -365,7 +402,7 @@ 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_drag *drag;
+ struct weston_data_source *source;
struct weston_surface *icon = NULL;
if (seat->pointer->button_count == 0 ||
@@ -375,6 +412,8 @@ data_device_start_drag(struct wl_client *client, struct wl_resource *resource,
/* FIXME: Check that the data source type array isn't empty. */
+ if (source_resource)
+ source = wl_resource_get_user_data(source_resource);
if (icon_resource)
icon = wl_resource_get_user_data(icon_resource);
if (icon && icon->configure) {
@@ -384,35 +423,8 @@ data_device_start_drag(struct wl_client *client, struct wl_resource *resource,
return;
}
- drag = zalloc(sizeof *drag);
- if (drag == NULL) {
+ if (weston_seat_start_drag(seat, source, icon, client) < 0)
wl_resource_post_no_memory(resource);
- return;
- }
-
- drag->grab.interface = &drag_grab_interface;
- drag->client = client;
-
- if (source_resource) {
- drag->data_source = wl_resource_get_user_data(source_resource);
- drag->data_source_listener.notify = destroy_data_device_source;
- wl_resource_add_destroy_listener(source_resource,
- &drag->data_source_listener);
- }
-
- if (icon) {
- drag->icon = icon;
- drag->icon_destroy_listener.notify = handle_drag_icon_destroy;
- wl_signal_add(&icon->destroy_signal,
- &drag->icon_destroy_listener);
-
- icon->configure = drag_surface_configure;
- icon->configure_private = drag;
- }
-
- weston_pointer_set_focus(seat->pointer, NULL,
- wl_fixed_from_int(0), wl_fixed_from_int(0));
- weston_pointer_start_grab(seat->pointer, &drag->grab);
}
static void