mirror of
https://codeberg.org/dwl/dwl-patches.git
synced 2025-10-26 17:54:17 +00:00
update unclutter
Don't clear the pointer focus when hiding the cursor. This was annoying because if you e.g. had the cursor over a spoiler tag it becomes black again after the timeout, or if the cursor was opening a popup by hovering over a button the popup disappears after the timeout. Not clearing the pointer focus requires adding a check when changing the cursor image to not make the cursor reappear when it does. Skipping the image change results in having the old cursor image if it changed while the cursor was hidden, until it is changed again. Don't keep track of the last cursor image for simplicity.
This commit is contained in:
parent
d5f6fbd853
commit
9a37e365ad
@ -1,6 +1,6 @@
|
||||
From f11a867df009e3dc786caab519e231967b3fba2a Mon Sep 17 00:00:00 2001
|
||||
From 5f0e544c297820f285c997ff108698bcc34c544b Mon Sep 17 00:00:00 2001
|
||||
From: Guido Cella <guido@guidocella.xyz>
|
||||
Date: Mon, 11 Mar 2024 18:55:02 +0100
|
||||
Date: Wed, 27 Mar 2024 18:36:15 +0100
|
||||
Subject: [PATCH] =?UTF-8?q?hide=20the=20mouse=20cursor=20if=20it=20isn?=
|
||||
=?UTF-8?q?=E2=80=99t=20being=20used?=
|
||||
MIME-Version: 1.0
|
||||
@ -9,8 +9,8 @@ Content-Transfer-Encoding: 8bit
|
||||
|
||||
---
|
||||
config.def.h | 2 ++
|
||||
dwl.c | 45 +++++++++++++++++++++++++++++++++++++++++++--
|
||||
2 files changed, 45 insertions(+), 2 deletions(-)
|
||||
dwl.c | 48 ++++++++++++++++++++++++++++++++++++++++++++----
|
||||
2 files changed, 46 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/config.def.h b/config.def.h
|
||||
index 9009517..a85ca27 100644
|
||||
@ -26,7 +26,7 @@ index 9009517..a85ca27 100644
|
||||
#define MODKEY WLR_MODIFIER_ALT
|
||||
|
||||
diff --git a/dwl.c b/dwl.c
|
||||
index d508d79..5ec83db 100644
|
||||
index 5867b0c..5c7efd9 100644
|
||||
--- a/dwl.c
|
||||
+++ b/dwl.c
|
||||
@@ -283,6 +283,8 @@ static void focusmon(const Arg *arg);
|
||||
@ -63,7 +63,7 @@ index d508d79..5ec83db 100644
|
||||
|
||||
switch (event->state) {
|
||||
case WLR_BUTTON_PRESSED:
|
||||
@@ -1388,6 +1394,32 @@ handlesig(int signo)
|
||||
@@ -1388,6 +1394,31 @@ handlesig(int signo)
|
||||
}
|
||||
}
|
||||
|
||||
@ -88,7 +88,6 @@ index d508d79..5ec83db 100644
|
||||
+ return 1;
|
||||
+
|
||||
+ wlr_cursor_unset_image(cursor);
|
||||
+ wlr_seat_pointer_notify_clear_focus(seat);
|
||||
+ cursor_hidden = true;
|
||||
+ return 1;
|
||||
+}
|
||||
@ -96,7 +95,7 @@ index d508d79..5ec83db 100644
|
||||
void
|
||||
incnmaster(const Arg *arg)
|
||||
{
|
||||
@@ -1718,6 +1750,7 @@ motionnotify(uint32_t time, struct wlr_input_device *device, double dx, double d
|
||||
@@ -1721,6 +1752,7 @@ motionnotify(uint32_t time, struct wlr_input_device *device, double dx, double d
|
||||
|
||||
wlr_cursor_move(cursor, device, dx, dy);
|
||||
wlr_idle_notifier_v1_notify_activity(idle_notifier, seat);
|
||||
@ -104,7 +103,7 @@ index d508d79..5ec83db 100644
|
||||
|
||||
/* Update selmon (even while dragging a window) */
|
||||
if (sloppyfocus)
|
||||
@@ -1753,7 +1786,7 @@ motionnotify(uint32_t time, struct wlr_input_device *device, double dx, double d
|
||||
@@ -1756,7 +1788,7 @@ motionnotify(uint32_t time, struct wlr_input_device *device, double dx, double d
|
||||
/* If there's no client surface under the cursor, set the cursor image to a
|
||||
* default. This is what makes the cursor image appear when you move it
|
||||
* off of a client or over its border. */
|
||||
@ -113,7 +112,7 @@ index d508d79..5ec83db 100644
|
||||
wlr_cursor_set_xcursor(cursor, cursor_mgr, "default");
|
||||
|
||||
pointerfocus(c, surface, sx, sy, time);
|
||||
@@ -1897,7 +1930,10 @@ pointerfocus(Client *c, struct wlr_surface *surface, double sx, double sy,
|
||||
@@ -1900,7 +1932,10 @@ pointerfocus(Client *c, struct wlr_surface *surface, double sx, double sy,
|
||||
/* Let the client know that the mouse cursor has entered one
|
||||
* of its surfaces, and make keyboard focus follow if desired.
|
||||
* wlroots makes this a no-op if surface is already focused */
|
||||
@ -125,7 +124,7 @@ index d508d79..5ec83db 100644
|
||||
wlr_seat_pointer_notify_motion(seat, time, sx, sy);
|
||||
}
|
||||
|
||||
@@ -2099,6 +2135,7 @@ run(char *startup_cmd)
|
||||
@@ -2102,6 +2137,7 @@ run(char *startup_cmd)
|
||||
* monitor when displayed here */
|
||||
wlr_cursor_warp_closest(cursor, NULL, cursor->x, cursor->y);
|
||||
wlr_cursor_set_xcursor(cursor, cursor_mgr, "default");
|
||||
@ -133,7 +132,25 @@ index d508d79..5ec83db 100644
|
||||
|
||||
/* Run the Wayland event loop. This does not return until you exit the
|
||||
* compositor. Starting the backend rigged up all of the necessary event
|
||||
@@ -2431,6 +2468,9 @@ setup(void)
|
||||
@@ -2125,7 +2161,7 @@ setcursor(struct wl_listener *listener, void *data)
|
||||
* use the provided surface as the cursor image. It will set the
|
||||
* hardware cursor on the output that it's currently on and continue to
|
||||
* do so as the cursor moves between outputs. */
|
||||
- if (event->seat_client == seat->pointer_state.focused_client)
|
||||
+ if (event->seat_client == seat->pointer_state.focused_client && !cursor_hidden)
|
||||
wlr_cursor_set_surface(cursor, event->surface,
|
||||
event->hotspot_x, event->hotspot_y);
|
||||
}
|
||||
@@ -2139,7 +2175,7 @@ setcursorshape(struct wl_listener *listener, void *data)
|
||||
/* This can be sent by any client, so we check to make sure this one is
|
||||
* actually has pointer focus first. If so, we can tell the cursor to
|
||||
* use the provided cursor shape. */
|
||||
- if (event->seat_client == seat->pointer_state.focused_client)
|
||||
+ if (event->seat_client == seat->pointer_state.focused_client && !cursor_hidden)
|
||||
wlr_cursor_set_xcursor(cursor, cursor_mgr,
|
||||
wlr_cursor_shape_v1_name(event->shape));
|
||||
}
|
||||
@@ -2434,6 +2470,9 @@ setup(void)
|
||||
cursor_shape_mgr = wlr_cursor_shape_manager_v1_create(dpy, 1);
|
||||
LISTEN_STATIC(&cursor_shape_mgr->events.request_set_shape, setcursorshape);
|
||||
|
||||
@ -143,7 +160,7 @@ index d508d79..5ec83db 100644
|
||||
/*
|
||||
* Configures a seat, which is a single "seat" at which a user sits and
|
||||
* operates the computer. This conceptually includes up to one keyboard,
|
||||
@@ -2853,6 +2893,7 @@ virtualpointer(struct wl_listener *listener, void *data)
|
||||
@@ -2856,6 +2895,7 @@ virtualpointer(struct wl_listener *listener, void *data)
|
||||
wlr_cursor_attach_input_device(cursor, &pointer.base);
|
||||
if (event->suggested_output)
|
||||
wlr_cursor_map_input_to_output(cursor, &pointer.base, event->suggested_output);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user