aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/rootston/input.h3
-rw-r--r--rootston/cursor.c3
-rw-r--r--rootston/output.c6
3 files changed, 8 insertions, 4 deletions
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);
}