]> git.mdlowis.com Git - proto/labwc.git/commitdiff
chase (dnd): refactor to use wlroot's scene_drag_icon
authornullableVoidPtr <30564701+nullableVoidPtr@users.noreply.github.com>
Sun, 3 Dec 2023 08:38:52 +0000 (16:38 +0800)
committerJohan Malm <johanmalm@users.noreply.github.com>
Sun, 3 Dec 2023 18:24:26 +0000 (18:24 +0000)
include/dnd.h
src/dnd.c

index 431fbd6a08bae1180f3ddfb613a7e902ad45d503..35ecc927cea9bc4f12bc427d2de7647dd9bb67cd 100644 (file)
@@ -5,19 +5,6 @@
 #include <wayland-server-core.h>
 
 struct seat;
-struct wlr_drag_icon;
-struct wlr_scene_tree;
-
-struct drag_icon {
-       struct wlr_scene_tree *icon_tree;
-       struct wlr_drag_icon *icon;
-       struct {
-               struct wl_listener map;
-               struct wl_listener commit;
-               struct wl_listener unmap;
-               struct wl_listener destroy;
-       } events;
-};
 
 void dnd_init(struct seat *seat);
 void dnd_icons_show(struct seat *seat, bool show);
index 695096f45d7a1c0f2a11fd2b2aeb69e529a53623..71685675be1243d62b2f099e75b3e6b897f47258 100644 (file)
--- a/src/dnd.c
+++ b/src/dnd.c
@@ -9,92 +9,6 @@
 #include "labwc.h"  /* for struct seat */
 #include "view.h"
 
-/* Internal DnD icon handlers */
-static void
-handle_icon_map(struct wl_listener *listener, void *data)
-{
-       struct drag_icon *self = wl_container_of(listener, self, events.map);
-       struct wlr_drag_icon *icon = self->icon;
-       if (icon->data) {
-               struct wlr_scene_tree *surface_tree = icon->data;
-               wlr_scene_node_set_enabled(&surface_tree->node, true);
-       } else {
-               icon->data = wlr_scene_subsurface_tree_create(
-                       self->icon_tree, icon->surface);
-       }
-}
-
-static void
-handle_surface_commit(struct wl_listener *listener, void *data)
-{
-       struct drag_icon *self = wl_container_of(listener, self, events.commit);
-       struct wlr_surface *surface = data;
-       struct wlr_scene_tree *surface_tree = self->icon->data;
-       if (surface_tree) {
-               wlr_scene_node_set_position(&surface_tree->node,
-                       surface_tree->node.x + surface->current.dx,
-                       surface_tree->node.y + surface->current.dy);
-       }
-}
-
-static void
-handle_icon_unmap(struct wl_listener *listener, void *data)
-{
-       struct drag_icon *self = wl_container_of(listener, self, events.unmap);
-       struct wlr_drag_icon *icon = self->icon;
-       struct wlr_scene_tree *surface_tree = icon->data;
-       if (surface_tree) {
-               wlr_scene_node_set_enabled(&surface_tree->node, false);
-       }
-}
-
-static void
-handle_icon_destroy(struct wl_listener *listener, void *data)
-{
-       struct drag_icon *self = wl_container_of(listener, self, events.destroy);
-
-       wl_list_remove(&self->events.map.link);
-       wl_list_remove(&self->events.commit.link);
-       wl_list_remove(&self->events.unmap.link);
-       wl_list_remove(&self->events.destroy.link);
-
-       if (self->icon->data) {
-               struct wlr_scene_tree *tree = self->icon->data;
-               wlr_scene_node_destroy(&tree->node);
-       }
-
-       self->icon = NULL;
-       self->icon_tree = NULL;
-       free(self);
-}
-
-static void
-drag_icon_create(struct seat *seat, struct wlr_drag_icon *wlr_icon)
-{
-       assert(seat);
-       assert(wlr_icon);
-       struct drag_icon *self = znew(*self);
-
-       self->icon = wlr_icon;
-       self->icon_tree = seat->drag.icons;
-
-       /* Position will be updated by cursor movement */
-       wlr_scene_node_set_position(&self->icon_tree->node,
-               seat->cursor->x, seat->cursor->y);
-       wlr_scene_node_raise_to_top(&self->icon_tree->node);
-
-       /* Set up events */
-       self->events.map.notify = handle_icon_map;
-       self->events.commit.notify = handle_surface_commit;
-       self->events.unmap.notify = handle_icon_unmap;
-       self->events.destroy.notify = handle_icon_destroy;
-
-       wl_signal_add(&wlr_icon->surface->events.map, &self->events.map);
-       wl_signal_add(&wlr_icon->surface->events.commit, &self->events.commit);
-       wl_signal_add(&wlr_icon->surface->events.unmap, &self->events.unmap);
-       wl_signal_add(&wlr_icon->events.destroy, &self->events.destroy);
-}
-
 /* Internal DnD handlers */
 static void
 handle_drag_request(struct wl_listener *listener, void *data)
@@ -122,8 +36,8 @@ handle_drag_start(struct wl_listener *listener, void *data)
        seat->drag.active = true;
        seat_reset_pressed(seat);
        if (drag->icon) {
-               /* Cleans up automatically on drag->icon->events.detroy */
-               drag_icon_create(seat, drag->icon);
+               /* Cleans up automatically on drag->icon->events.destroy */
+               wlr_scene_drag_icon_create(seat->drag.icons, drag->icon);
                wlr_scene_node_set_enabled(&seat->drag.icons->node, true);
        }
        wl_signal_add(&drag->events.destroy, &seat->drag.events.destroy);