diff --git a/tinywl/tinywl.c b/tinywl/tinywl.c index 7d1a38069..63de14e8f 100644 --- a/tinywl/tinywl.c +++ b/tinywl/tinywl.c @@ -31,6 +31,7 @@ enum tinywl_cursor_mode { TINYWL_CURSOR_PASSTHROUGH, TINYWL_CURSOR_MOVE, TINYWL_CURSOR_RESIZE, + TINYWL_CURSOR_DOWN, }; struct tinywl_server { @@ -453,7 +454,13 @@ static void process_cursor_motion(struct tinywl_server *server, uint32_t time) { * around the screen, not over any views. */ wlr_cursor_set_xcursor(server->cursor, server->cursor_mgr, "default"); } - if (surface) { + if (server->cursor_mode == TINYWL_CURSOR_DOWN && view != server->grabbed_view) { + /* Send pointer events to the view which the mouse button is down on. */ + view = server->grabbed_view; + sx = server->cursor->x - view->x; + sy = server->cursor->y - view->y; + wlr_seat_pointer_notify_motion(seat, time, sx, sy); + } else if (surface) { /* * Send pointer enter and motion events. * @@ -525,6 +532,10 @@ static void server_cursor_button(struct wl_listener *listener, void *data) { } else { /* Focus that client if the button was _pressed_ */ focus_view(view, surface); + + /* Change the cursor_mode while the button is pressed */ + server->grabbed_view = view; + server->cursor_mode = TINYWL_CURSOR_DOWN; } }