summaryrefslogtreecommitdiff
path: root/tinywl.c
diff options
context:
space:
mode:
authorKirill Primak <[email protected]>2022-11-07 19:55:40 +0300
committerKirill Primak <[email protected]>2022-11-07 20:09:25 +0300
commitf8b869bd19c1b128fd3a4d5005abd297b07045c4 (patch)
treee394ad4f1db77f143d58da8d0f01342dcc231395 /tinywl.c
parent43b052721ee72b4231431a353ce7371e3b2083ad (diff)
tinywl: handle view unmap while grabbed
Fixes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3372
Diffstat (limited to 'tinywl.c')
-rw-r--r--tinywl.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/tinywl.c b/tinywl.c
index 4fc8477..7e3c8c1 100644
--- a/tinywl.c
+++ b/tinywl.c
@@ -363,6 +363,12 @@ static struct tinywl_view *desktop_view_at(
return tree->node.data;
}
+static void reset_cursor_mode(struct tinywl_server *server) {
+ /* Reset the cursor mode to passthrough. */
+ server->cursor_mode = TINYWL_CURSOR_PASSTHROUGH;
+ server->grabbed_view = NULL;
+}
+
static void process_cursor_move(struct tinywl_server *server, uint32_t time) {
/* Move the grabbed view to the new position. */
struct tinywl_view *view = server->grabbed_view;
@@ -515,7 +521,7 @@ static void server_cursor_button(struct wl_listener *listener, void *data) {
server->cursor->x, server->cursor->y, &surface, &sx, &sy);
if (event->state == WLR_BUTTON_RELEASED) {
/* If you released any buttons, we exit interactive move/resize mode. */
- server->cursor_mode = TINYWL_CURSOR_PASSTHROUGH;
+ reset_cursor_mode(server);
} else {
/* Focus that client if the button was _pressed_ */
focus_view(view, surface);
@@ -636,6 +642,11 @@ static void xdg_toplevel_unmap(struct wl_listener *listener, void *data) {
/* Called when the surface is unmapped, and should no longer be shown. */
struct tinywl_view *view = wl_container_of(listener, view, unmap);
+ /* Reset the cursor mode if the grabbed view was unmapped. */
+ if (view == view->server->grabbed_view) {
+ reset_cursor_mode(view->server);
+ }
+
wl_list_remove(&view->link);
}