]> git.mdlowis.com Git - proto/labwc.git/commitdiff
cursor.c: rebase cursor when exiting interactive mode
authorJohan Malm <jgm323@gmail.com>
Sun, 28 Nov 2021 22:14:23 +0000 (22:14 +0000)
committerJohan Malm <jgm323@gmail.com>
Sun, 28 Nov 2021 22:14:23 +0000 (22:14 +0000)
cursor_rebase() sets the cursor icon and sends a motion-event to the
surface below the cursor. It is made public in anticipation of using it
in various view_* functions.

include/labwc.h
src/cursor.c

index 448a5a292d3ebbe13d087d9d13d09bf4a06ac597..3eb8338a8483d1cc3928a72681d4551048a3645e 100644 (file)
@@ -424,6 +424,18 @@ struct view *desktop_surface_and_view_at(struct server *server, double lx,
 
 struct view *desktop_view_at_cursor(struct server *server);
 
+/**
+ * cursor_rebase - set cursor icon for and send motion-event to surface below it
+ * @seat - current seat
+ * @time_msec - time now
+ */
+void cursor_rebase(struct seat *seat, uint32_t time_msec);
+
+/**
+ * cursor_set - set cursor icon
+ * @seat - current seat
+ * @cursor_name - name of cursor, for example "left_ptr" or "grab"
+ */
 void cursor_set(struct seat *seat, const char *cursor_name);
 void cursor_init(struct seat *seat);
 
index e9c55559d2ea90df201842df7f05b6035369ba14..690e045425bad66feaa91b230c73b5911dfbd9d2 100644 (file)
@@ -3,12 +3,32 @@
 #include <linux/input-event-codes.h>
 #include <sys/time.h>
 #include <time.h>
+#include <wlr/types/wlr_primary_selection.h>
 #include "labwc.h"
 #include "menu/menu.h"
 #include "resistance.h"
 #include "ssd.h"
 #include "config/mousebind.h"
-#include <wlr/types/wlr_primary_selection.h>
+
+void
+cursor_rebase(struct seat *seat, uint32_t time_msec)
+{
+       double sx, sy;
+       struct wlr_surface *surface;
+       int view_area = LAB_SSD_NONE;
+
+       desktop_surface_and_view_at(seat->server, seat->cursor->x,
+               seat->cursor->y, &surface, &sx, &sy, &view_area);
+
+       if (surface) {
+               wlr_seat_pointer_notify_clear_focus(seat->seat);
+               wlr_seat_pointer_notify_enter(seat->seat, surface, sx, sy);
+               wlr_seat_pointer_notify_motion(seat->seat, time_msec, sx, sy);
+       } else {
+               cursor_set(seat, "left_ptr");
+               wlr_seat_pointer_notify_clear_focus(seat->seat);
+       }
+}
 
 static void
 request_cursor_notify(struct wl_listener *listener, void *data)
@@ -530,6 +550,7 @@ cursor_button(struct wl_listener *listener, void *data)
                if (server->input_mode != LAB_INPUT_STATE_PASSTHROUGH) {
                        /* Exit interactive move/resize/menu mode. */
                        server->input_mode = LAB_INPUT_STATE_PASSTHROUGH;
+                       cursor_rebase(&server->seat, event->time_msec);
                        return;
                }
                goto mousebindings;
@@ -538,6 +559,7 @@ cursor_button(struct wl_listener *listener, void *data)
        if (server->input_mode == LAB_INPUT_STATE_MENU) {
                menu_action_selected(server, server->rootmenu);
                server->input_mode = LAB_INPUT_STATE_PASSTHROUGH;
+               cursor_rebase(&server->seat, event->time_msec);
                return;
        }