diff options
author | Leonardo Hernández Hernández <leohdz172@protonmail.com> | 2022-10-08 13:00:03 -0500 |
---|---|---|
committer | Leonardo Hernández Hernández <leohdz172@protonmail.com> | 2022-10-08 13:02:43 -0500 |
commit | 952fde68a3cb1871f39c464d56f999d5a966e7a4 (patch) | |
tree | 4ddfb9d721bca7eca02db70c56d0d13e6a9fbc9d | |
parent | 0d1ca4663ca62329e1e171053ceb35bbc71ec30a (diff) |
correctly handle cursor motion when button is held (for layer surfaces)
-rw-r--r-- | client.h | 15 | ||||
-rw-r--r-- | dwl.c | 11 |
2 files changed, 22 insertions, 4 deletions
@@ -307,3 +307,18 @@ toplevel_from_popup(struct wlr_xdg_popup *popup) } } } + +static inline void * +toplevel_from_wlr_layer_surface(struct wlr_surface *s) +{ + Client *c; + struct wlr_layer_surface_v1 *wlr_layer_surface; + + if ((c = client_from_wlr_surface(s))) + return c; + else if (s && wlr_surface_is_layer_surface(s) + && (wlr_layer_surface = wlr_layer_surface_v1_from_wlr_surface(s))) + return wlr_layer_surface->data; + + return NULL; +} @@ -1504,6 +1504,7 @@ motionnotify(uint32_t time) { double sx = 0, sy = 0; Client *c = NULL; + LayerSurface *l; struct wlr_surface *surface = NULL; struct wlr_drag_icon *icon; @@ -1536,10 +1537,12 @@ motionnotify(uint32_t time) xytonode(cursor->x, cursor->y, &surface, &c, NULL, &sx, &sy); if (cursor_mode == CurPressed && !seat->drag) { - surface = seat->pointer_state.focused_surface; - c = client_from_wlr_surface(surface); - sx = c ? cursor->x - c->geom.x : 0; - sy = c ? cursor->y - c->geom.y : 0; + if ((l = toplevel_from_wlr_layer_surface( + seat->pointer_state.focused_surface))) { + surface = seat->pointer_state.focused_surface; + sx = cursor->x - l->geom.x; + sy = cursor->y - l->geom.y; + } } /* If there's no client surface under the cursor, set the cursor image to a |