diff options
author | Kristian Høgsberg <krh@bitplanet.net> | 2013-09-04 20:44:26 -0700 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2013-09-04 20:46:56 -0700 |
commit | 85de9c25fe16d8bab928295fd68851738ef23b24 (patch) | |
tree | ea5a902df448c336b739eed130cceaa363da7448 /src/data-device.c | |
parent | 0749e3f470a9d1cb7ec78c199962b84dce72e1f9 (diff) | |
download | weston-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.c | 70 |
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 |