~ruther/dwl

952fde68a3cb1871f39c464d56f999d5a966e7a4 — Leonardo Hernández Hernández 2 years ago 0d1ca46
correctly handle cursor motion when button is held (for layer surfaces)
2 files changed, 22 insertions(+), 4 deletions(-)

M client.h
M dwl.c
M client.h => client.h +15 -0
@@ 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;
}

M dwl.c => dwl.c +7 -4
@@ 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