diff options
-rw-r--r-- | rootston/desktop.c | 2 | ||||
-rw-r--r-- | types/wlr_data_device_manager.c | 83 | ||||
-rw-r--r-- | types/wlr_data_source.c | 20 |
3 files changed, 67 insertions, 38 deletions
diff --git a/rootston/desktop.c b/rootston/desktop.c index 6653a16b..555d592f 100644 --- a/rootston/desktop.c +++ b/rootston/desktop.c @@ -100,7 +100,7 @@ static struct wlr_subsurface *subsurface_at(struct wlr_surface *surface, int sub_width = subsurface->surface->current->buffer_width; int sub_height = subsurface->surface->current->buffer_height; if ((sx > _sub_x && sx < _sub_x + sub_width) && - (sy > _sub_y && sub_y < sub_y + sub_height)) { + (sy > _sub_y && sy < _sub_y + sub_height)) { *sub_x = _sub_x; *sub_y = _sub_y; return subsurface; diff --git a/types/wlr_data_device_manager.c b/types/wlr_data_device_manager.c index fb3bd901..a813754c 100644 --- a/types/wlr_data_device_manager.c +++ b/types/wlr_data_device_manager.c @@ -7,15 +7,16 @@ #include <wlr/types/wlr_data_source.h> #include <wlr/types/wlr_seat.h> -static void resource_destroy(struct wl_client *client, struct wl_resource *resource) { +static void resource_destroy(struct wl_client *client, + struct wl_resource *resource) { wl_resource_destroy(resource); } -static void wl_cb_data_device_start_drag(struct wl_client *client, - struct wl_resource *res, struct wl_resource *src_res, +static void data_device_start_drag(struct wl_client *client, + struct wl_resource *res, struct wl_resource *source_resource, struct wl_resource *origin_res, struct wl_resource *icon_res, uint32_t serial) { - wlr_log(L_DEBUG, "implement data_device:start_drag"); + wlr_log(L_DEBUG, "TODO: implement data_device:start_drag"); // Will probably look like this: // struct wlr_seat_handle *handle = wl_resource_get_user_data(res); @@ -29,68 +30,79 @@ static void wl_cb_data_device_start_drag(struct wl_client *client, // origin, icon); // will set surface roles and emit signal for user } -static void wl_cb_data_device_set_selection(struct wl_client *client, - struct wl_resource *res, struct wl_resource *src_res, +static void data_device_set_selection(struct wl_client *client, + struct wl_resource *resource, struct wl_resource *source_resource, uint32_t serial) { + if (!source_resource) { + return; + } + // TODO: serial validation - struct wlr_seat_handle *handle = wl_resource_get_user_data(res); + struct wlr_seat_handle *handle = wl_resource_get_user_data(resource); struct wlr_data_device *device = handle->wlr_seat->data_device; - struct wlr_data_source *src = wl_resource_get_user_data(src_res); - wlr_data_device_set_selection(device, src); + struct wlr_data_source *source = wl_resource_get_user_data(source_resource); + wlr_data_device_set_selection(device, source); } static struct wl_data_device_interface data_device_impl = { - .start_drag = wl_cb_data_device_start_drag, - .set_selection = wl_cb_data_device_set_selection, + .start_drag = data_device_start_drag, + .set_selection = data_device_set_selection, .release = resource_destroy }; -static void data_device_selection_destroy(struct wl_listener *listener, void *data) { - struct wlr_data_device *device = wl_container_of(listener, device, selection_destroyed); +static void data_device_selection_destroy(struct wl_listener *listener, + void *data) { + struct wlr_data_device *device = + wl_container_of(listener, device, selection_destroyed); assert(data == device->selection); device->selection = NULL; // make sure no cancel is sent wlr_data_device_set_selection(device, NULL); } -static struct wlr_data_device *seat_ensure_data_device(struct wlr_data_device_manager *manager, - struct wlr_seat *seat) { +static struct wlr_data_device *seat_ensure_data_device( + struct wlr_data_device_manager *manager, struct wlr_seat *seat) { if (seat->data_device) { return seat->data_device; } - if (!(seat->data_device = calloc(1, sizeof(*seat->data_device)))) { + seat->data_device = calloc(1, sizeof(*seat->data_device)); + if (!seat->data_device) { wlr_log(L_ERROR, "Failed to allocate wlr_data_device"); return NULL; } seat->data_device->seat = seat; wl_signal_init(&seat->data_device->events.selection_change); - seat->data_device->selection_destroyed.notify = data_device_selection_destroy; + seat->data_device->selection_destroyed.notify = + data_device_selection_destroy; return seat->data_device; } -static void data_device_destroy(struct wl_resource *res) { - struct wlr_seat_handle *handle = wl_resource_get_user_data(res); +static void data_device_destroy(struct wl_resource *resource) { + struct wlr_seat_handle *handle = wl_resource_get_user_data(resource); handle->data_device = NULL; } static void data_device_manager_create_data_source(struct wl_client *client, - struct wl_resource *res, uint32_t id) { - uint32_t version = wl_resource_get_version(res); + struct wl_resource *resource, uint32_t id) { + uint32_t version = wl_resource_get_version(resource); if (!wlr_wl_data_source_create(client, version, id)) { wlr_log(L_ERROR, "Failed to create wlr_wl_data_source"); - wl_resource_post_no_memory(res); + wl_resource_post_no_memory(resource); return; } } static void data_device_manager_get_data_device(struct wl_client *client, - struct wl_resource *res, uint32_t id, struct wl_resource *seat_res) { - struct wlr_data_device_manager *manager = wl_resource_get_user_data(res); - struct wlr_seat_handle *seat_handle = wl_resource_get_user_data(seat_res); + struct wl_resource *resource, uint32_t id, + struct wl_resource *seat_resource) { + struct wlr_data_device_manager *manager = + wl_resource_get_user_data(resource); + struct wlr_seat_handle *seat_handle = + wl_resource_get_user_data(seat_resource); struct wlr_data_device *device; if (!(device = seat_ensure_data_device(manager, seat_handle->wlr_seat))) { - wl_resource_post_no_memory(res); + wl_resource_post_no_memory(resource); return; } @@ -101,10 +113,10 @@ static void data_device_manager_get_data_device(struct wl_client *client, } seat_handle->data_device = wl_resource_create(client, - &wl_data_device_interface, wl_resource_get_version(res), id); + &wl_data_device_interface, wl_resource_get_version(resource), id); if (!seat_handle->data_device) { wlr_log(L_ERROR, "Failed to create wl_data_device resource"); - wl_resource_post_no_memory(res); + wl_resource_post_no_memory(resource); return; } @@ -135,18 +147,21 @@ static void data_device_manager_bind(struct wl_client *client, void *data, return; } wl_resource_set_implementation(resource, &data_device_manager_impl, - manager, NULL); + manager, NULL); } -struct wlr_data_device_manager *wlr_data_device_manager_create(struct wl_display *dpy) { +struct wlr_data_device_manager *wlr_data_device_manager_create( + struct wl_display *display) { struct wlr_data_device_manager *manager = calloc(1, sizeof(*manager)); if (!manager) { wlr_log(L_ERROR, "Failed to allocated wlr_data_device_manager"); return NULL; } - manager->global = wl_global_create(dpy, &wl_data_device_manager_interface, 3, - manager, data_device_manager_bind); + manager->global = + wl_global_create(display, &wl_data_device_manager_interface, 3, manager, + data_device_manager_bind); + if (!manager->global) { wlr_log(L_ERROR, "Failed to create global for wlr_data_device_manager"); free(manager); @@ -165,6 +180,10 @@ void wlr_data_device_manager_destroy(struct wlr_data_device_manager *manager) { void wlr_data_device_set_selection(struct wlr_data_device *device, struct wlr_data_source *source) { + if (device->selection == source) { + return; + } + if (device->selection) { wl_list_remove(&device->selection_destroyed.link); wlr_data_source_cancelled(device->selection); diff --git a/types/wlr_data_source.c b/types/wlr_data_source.c index 542b1135..83064fac 100644 --- a/types/wlr_data_source.c +++ b/types/wlr_data_source.c @@ -27,7 +27,8 @@ void wlr_data_source_finish(struct wlr_data_source *source) { } } -void wlr_data_source_send(struct wlr_data_source *src, const char *type, int fd) { +void wlr_data_source_send(struct wlr_data_source *src, const char *type, + int fd) { assert(src && src->impl && src->impl->send); src->impl->send(src, type, fd); } @@ -53,7 +54,8 @@ static void data_source_send(struct wlr_data_source *src, close(fd); } -static void data_source_accepted(struct wlr_data_source *src, const char *type) { +static void data_source_accepted(struct wlr_data_source *src, + const char *type) { struct wlr_wl_data_source *wl_src = (struct wlr_wl_data_source *) src; wl_data_source_send_target(wl_src->resource, type); } @@ -69,7 +71,8 @@ static struct wlr_data_source_impl data_source_wl_impl = { .cancelled = data_source_cancelled, }; -static void data_source_offer(struct wl_client *client, struct wl_resource *resource, +static void data_source_offer(struct wl_client *client, + struct wl_resource *resource, const char *type) { struct wlr_wl_data_source *src = wl_resource_get_user_data(resource); char *dtype = strdup(type); @@ -81,13 +84,20 @@ static void data_source_offer(struct wl_client *client, struct wl_resource *reso list_add(src->base.types, dtype); } -static void data_source_destroy(struct wl_client *client, struct wl_resource *resource) { +static void data_source_destroy(struct wl_client *client, + struct wl_resource *resource) { wl_resource_destroy(resource); } +static void data_source_set_actions(struct wl_client *client, + struct wl_resource *resource, uint32_t dnd_actions) { + wlr_log(L_DEBUG, "TODO: data source set actions"); +} + static struct wl_data_source_interface wl_data_source_impl = { .offer = data_source_offer, - .destroy = data_source_destroy + .destroy = data_source_destroy, + .set_actions = data_source_set_actions, }; static void destroy_wl_data_source(struct wl_resource *resource) { |