From df0a8d3abe6a7a8cd010e07f078c0e92ea2fb516 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Sun, 15 Oct 2017 11:06:03 -0400 Subject: wlr-data-device: drag icons --- rootston/cursor.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'rootston/cursor.c') diff --git a/rootston/cursor.c b/rootston/cursor.c index 8790934c..19f015aa 100644 --- a/rootston/cursor.c +++ b/rootston/cursor.c @@ -1,8 +1,10 @@ #define _XOPEN_SOURCE 700 +#include #include #include #include #include +#include #ifdef __linux__ #include #elif __FreeBSD__ @@ -11,6 +13,7 @@ #include #include #include +#include #include "rootston/config.h" #include "rootston/input.h" #include "rootston/desktop.h" @@ -289,6 +292,49 @@ static void handle_tool_tip(struct wl_listener *listener, void *data) { (uint32_t)(event->time_usec / 1000), BTN_LEFT, event->state); } +static void handle_drag_icon_destroy(struct wl_listener *listener, void *data) { + struct roots_drag_icon *drag_icon = + wl_container_of(listener, drag_icon, surface_destroy); + wl_list_remove(&drag_icon->link); + wl_list_remove(&drag_icon->surface_destroy.link); + wl_list_remove(&drag_icon->surface_commit.link); + free(drag_icon); +} + +static void handle_drag_icon_commit(struct wl_listener *listener, void *data) { + struct roots_drag_icon *drag_icon = + wl_container_of(listener, drag_icon, surface_commit); + // TODO the spec hints at rules that can determine whether the drag icon is + // mapped here, but it is not completely clear so we need to test more + // toolkits to see how we should interpret the surface state here. + drag_icon->mapped = drag_icon->surface->texture->valid; +} + +static void handle_pointer_grab_begin(struct wl_listener *listener, + void *data) { + struct roots_input *input = + wl_container_of(listener, input, pointer_grab_begin); + struct wlr_seat_pointer_grab *grab = data; + + if (grab->interface == &wlr_data_device_pointer_drag_interface) { + struct wlr_drag *drag = grab->data; + if (drag->icon) { + struct roots_drag_icon *drag_icon = + calloc(1, sizeof(struct roots_drag_icon)); + drag_icon->surface = drag->icon; + wl_list_insert(&input->drag_icons, &drag_icon->link); + + wl_signal_add(&drag->icon->events.destroy, + &drag_icon->surface_destroy); + drag_icon->surface_destroy.notify = handle_drag_icon_destroy; + + wl_signal_add(&drag->icon->events.commit, + &drag_icon->surface_commit); + drag_icon->surface_commit.notify = handle_drag_icon_commit; + } + } +} + static void handle_pointer_grab_end(struct wl_listener *listener, void *data) { struct roots_input *input = wl_container_of(listener, input, pointer_grab_end); @@ -358,6 +404,9 @@ void cursor_initialize(struct roots_input *input) { wl_signal_add(&input->wl_seat->events.pointer_grab_end, &input->pointer_grab_end); input->pointer_grab_end.notify = handle_pointer_grab_end; + wl_signal_add(&input->wl_seat->events.pointer_grab_begin, &input->pointer_grab_begin); + input->pointer_grab_begin.notify = handle_pointer_grab_begin; + wl_list_init(&input->request_set_cursor.link); wl_signal_add(&input->wl_seat->events.request_set_cursor, &input->request_set_cursor); -- cgit v1.2.3 From b8de0a29b4f53700eef40edc76653ff318bbcf89 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Mon, 16 Oct 2017 08:00:01 -0400 Subject: rootston: handle icon already being in the list --- rootston/cursor.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'rootston/cursor.c') diff --git a/rootston/cursor.c b/rootston/cursor.c index 19f015aa..5867528e 100644 --- a/rootston/cursor.c +++ b/rootston/cursor.c @@ -319,6 +319,14 @@ static void handle_pointer_grab_begin(struct wl_listener *listener, if (grab->interface == &wlr_data_device_pointer_drag_interface) { struct wlr_drag *drag = grab->data; if (drag->icon) { + struct roots_drag_icon *iter_icon; + wl_list_for_each(iter_icon, &input->drag_icons, link) { + if (iter_icon->surface == drag->icon) { + // already in the list + return; + } + } + struct roots_drag_icon *drag_icon = calloc(1, sizeof(struct roots_drag_icon)); drag_icon->surface = drag->icon; -- cgit v1.2.3 From c00a94ca76cfc81353b78174e88539f17e9db7e0 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Tue, 17 Oct 2017 17:21:11 -0400 Subject: data-device: fix drag icon position --- include/rootston/input.h | 3 +++ rootston/cursor.c | 3 +++ rootston/output.c | 6 ++---- 3 files changed, 8 insertions(+), 4 deletions(-) (limited to 'rootston/cursor.c') diff --git a/include/rootston/input.h b/include/rootston/input.h index 40aea80a..357991ee 100644 --- a/include/rootston/input.h +++ b/include/rootston/input.h @@ -75,6 +75,9 @@ struct roots_drag_icon { struct wl_list link; // roots_input::drag_icons bool mapped; + int32_t sx; + int32_t sy; + struct wl_listener surface_destroy; struct wl_listener surface_commit; }; diff --git a/rootston/cursor.c b/rootston/cursor.c index bd988a41..6b509640 100644 --- a/rootston/cursor.c +++ b/rootston/cursor.c @@ -313,6 +313,9 @@ static void handle_drag_icon_commit(struct wl_listener *listener, void *data) { // TODO the spec hints at rules that can determine whether the drag icon is // mapped here, but it is not completely clear so we need to test more // toolkits to see how we should interpret the surface state here. + drag_icon->sx += drag_icon->surface->current->sx; + drag_icon->sy += drag_icon->surface->current->sy; + drag_icon->mapped = drag_icon->surface->texture->valid; } diff --git a/rootston/output.c b/rootston/output.c index b431cbc3..f50306a3 100644 --- a/rootston/output.c +++ b/rootston/output.c @@ -158,10 +158,8 @@ static void output_frame_notify(struct wl_listener *listener, void *data) { struct wlr_surface *icon = drag_icon->surface; struct wlr_cursor *cursor = server->input->cursor; - // TODO should also use the hotspot to determine the location, but - // hotspot is broken right now. - double icon_x = cursor->x - icon->current->sx; - double icon_y = cursor->y - icon->current->sy; + double icon_x = cursor->x + drag_icon->sx; + double icon_y = cursor->y + drag_icon->sy; render_surface(icon, desktop, wlr_output, &now, icon_x, icon_y, 0); } -- cgit v1.2.3 From 6fcac087fe1d7b7fa3cd0628a6b7818d26222678 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Sat, 21 Oct 2017 09:59:35 -0400 Subject: rootston: remove mostly unused mapped icon param --- include/rootston/input.h | 1 - rootston/cursor.c | 2 -- rootston/output.c | 4 ---- 3 files changed, 7 deletions(-) (limited to 'rootston/cursor.c') diff --git a/include/rootston/input.h b/include/rootston/input.h index aacb3016..33750d7b 100644 --- a/include/rootston/input.h +++ b/include/rootston/input.h @@ -67,7 +67,6 @@ struct roots_input_event { struct roots_drag_icon { struct wlr_surface *surface; struct wl_list link; // roots_input::drag_icons - bool mapped; int32_t sx; int32_t sy; diff --git a/rootston/cursor.c b/rootston/cursor.c index 83581101..200a6d37 100644 --- a/rootston/cursor.c +++ b/rootston/cursor.c @@ -374,8 +374,6 @@ static void handle_drag_icon_commit(struct wl_listener *listener, void *data) { // toolkits to see how we should interpret the surface state here. drag_icon->sx += drag_icon->surface->current->sx; drag_icon->sy += drag_icon->surface->current->sy; - - drag_icon->mapped = drag_icon->surface->texture->valid; } static void handle_pointer_grab_begin(struct wl_listener *listener, diff --git a/rootston/output.c b/rootston/output.c index fce14fea..f560061d 100644 --- a/rootston/output.c +++ b/rootston/output.c @@ -152,10 +152,6 @@ static void output_frame_notify(struct wl_listener *listener, void *data) { struct roots_drag_icon *drag_icon = NULL; wl_list_for_each(drag_icon, &server->input->drag_icons, link) { - if (!drag_icon->mapped) { - continue; - } - struct wlr_surface *icon = drag_icon->surface; struct wlr_cursor *cursor = server->input->cursor; double icon_x = cursor->x + drag_icon->sx; -- cgit v1.2.3