mirror of
https://codeberg.org/dwl/dwl-patches.git
synced 2026-03-22 17:01:31 +00:00
Hide the cursor when start typing, and restore it when start moving cursor again, just like xbanish.
171 lines
6.0 KiB
Diff
171 lines
6.0 KiB
Diff
From c72de058e6635c5bb3d973995ccbdb6e028f354d Mon Sep 17 00:00:00 2001
|
|
From: nate zhou <gnuunixchad@outlook.com>
|
|
Date: Tue, 3 Mar 2026 16:48:46 +0800
|
|
Subject: [PATCH] Patch: hide-cursor-when-typing-0.8.patch
|
|
|
|
Hide the cursor when start typing, and restore it when start moving
|
|
cursor again, just like xbanish.
|
|
---
|
|
config.def.h | 2 ++
|
|
dwl.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++------
|
|
2 files changed, 63 insertions(+), 7 deletions(-)
|
|
|
|
diff --git a/config.def.h b/config.def.h
|
|
index 8a6eda0..6205c0a 100644
|
|
--- a/config.def.h
|
|
+++ b/config.def.h
|
|
@@ -102,6 +102,8 @@ LIBINPUT_CONFIG_TAP_MAP_LMR -- 1/2/3 finger tap maps to left/middle/right
|
|
*/
|
|
static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TAP_MAP_LRM;
|
|
|
|
+static const int hide_cursor_when_typing = 1;
|
|
+
|
|
/* If you want to use the windows key for MODKEY, use WLR_MODIFIER_LOGO */
|
|
#define MODKEY WLR_MODIFIER_ALT
|
|
|
|
diff --git a/dwl.c b/dwl.c
|
|
index 44f3ad9..9a076b6 100644
|
|
--- a/dwl.c
|
|
+++ b/dwl.c
|
|
@@ -289,6 +289,8 @@ static Client *focustop(Monitor *m);
|
|
static void fullscreennotify(struct wl_listener *listener, void *data);
|
|
static void gpureset(struct wl_listener *listener, void *data);
|
|
static void handlesig(int signo);
|
|
+static void handlecursoractivity(void);
|
|
+static int hidecursor(void *data);
|
|
static void incnmaster(const Arg *arg);
|
|
static void inputdevice(struct wl_listener *listener, void *data);
|
|
static int keybinding(uint32_t mods, xkb_keysym_t sym);
|
|
@@ -389,6 +391,14 @@ static struct wlr_pointer_constraint_v1 *active_constraint;
|
|
|
|
static struct wlr_cursor *cursor;
|
|
static struct wlr_xcursor_manager *cursor_mgr;
|
|
+static struct wl_event_source *hide_source;
|
|
+static bool cursor_hidden = false;
|
|
+static struct {
|
|
+ enum wp_cursor_shape_device_v1_shape shape;
|
|
+ struct wlr_surface *surface;
|
|
+ int hotspot_x;
|
|
+ int hotspot_y;
|
|
+} last_cursor;
|
|
|
|
static struct wlr_scene_rect *root_bg;
|
|
static struct wlr_session_lock_manager_v1 *session_lock_mgr;
|
|
@@ -610,6 +620,7 @@ axisnotify(struct wl_listener *listener, void *data)
|
|
* for example when you move the scroll wheel. */
|
|
struct wlr_pointer_axis_event *event = data;
|
|
wlr_idle_notifier_v1_notify_activity(idle_notifier, seat);
|
|
+ handlecursoractivity();
|
|
/* TODO: allow usage of scroll wheel for mousebindings, it can be implemented
|
|
* by checking the event's orientation and the delta of the event */
|
|
/* Notify the client with pointer focus of the axis event. */
|
|
@@ -628,6 +639,7 @@ buttonpress(struct wl_listener *listener, void *data)
|
|
const Button *b;
|
|
|
|
wlr_idle_notifier_v1_notify_activity(idle_notifier, seat);
|
|
+ handlecursoractivity();
|
|
|
|
switch (event->state) {
|
|
case WL_POINTER_BUTTON_STATE_PRESSED:
|
|
@@ -1566,6 +1578,30 @@ handlesig(int signo)
|
|
quit(NULL);
|
|
}
|
|
|
|
+void
|
|
+handlecursoractivity(void)
|
|
+{
|
|
+ if (!cursor_hidden)
|
|
+ return;
|
|
+
|
|
+ cursor_hidden = false;
|
|
+
|
|
+ if (last_cursor.shape)
|
|
+ wlr_cursor_set_xcursor(cursor, cursor_mgr,
|
|
+ wlr_cursor_shape_v1_name(last_cursor.shape));
|
|
+ else
|
|
+ wlr_cursor_set_surface(cursor, last_cursor.surface,
|
|
+ last_cursor.hotspot_x, last_cursor.hotspot_y);
|
|
+}
|
|
+
|
|
+int
|
|
+hidecursor(void *data)
|
|
+{
|
|
+ wlr_cursor_unset_image(cursor);
|
|
+ cursor_hidden = true;
|
|
+ return 1;
|
|
+}
|
|
+
|
|
void
|
|
incnmaster(const Arg *arg)
|
|
{
|
|
@@ -1645,6 +1681,11 @@ keypress(struct wl_listener *listener, void *data)
|
|
|
|
wlr_idle_notifier_v1_notify_activity(idle_notifier, seat);
|
|
|
|
+ /* hide cursor when typing starts */
|
|
+ if (hide_cursor_when_typing && !cursor_hidden && event->state == WL_KEYBOARD_KEY_STATE_PRESSED) {
|
|
+ hidecursor(NULL);
|
|
+ }
|
|
+
|
|
/* On _press_ if there is no active screen locker,
|
|
* attempt to process a compositor keybinding. */
|
|
if (!locked && event->state == WL_KEYBOARD_KEY_STATE_PRESSED) {
|
|
@@ -1907,6 +1948,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);
|
|
+ handlecursoractivity();
|
|
|
|
/* Update selmon (even while dragging a window) */
|
|
if (sloppyfocus)
|
|
@@ -1931,7 +1973,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. */
|
|
- if (!surface && !seat->drag)
|
|
+ if (!surface && !seat->drag && !cursor_hidden)
|
|
wlr_cursor_set_xcursor(cursor, cursor_mgr, "default");
|
|
|
|
pointerfocus(c, surface, sx, sy, time);
|
|
@@ -2311,9 +2353,16 @@ 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)
|
|
- wlr_cursor_set_surface(cursor, event->surface,
|
|
- event->hotspot_x, event->hotspot_y);
|
|
+ if (event->seat_client == seat->pointer_state.focused_client) {
|
|
+ last_cursor.shape = 0;
|
|
+ last_cursor.surface = event->surface;
|
|
+ last_cursor.hotspot_x = event->hotspot_x;
|
|
+ last_cursor.hotspot_y = event->hotspot_y;
|
|
+
|
|
+ if (!cursor_hidden)
|
|
+ wlr_cursor_set_surface(cursor, event->surface,
|
|
+ event->hotspot_x, event->hotspot_y);
|
|
+ }
|
|
}
|
|
|
|
void
|
|
@@ -2325,9 +2374,14 @@ setcursorshape(struct wl_listener *listener, void *data)
|
|
/* This can be sent by any client, so we check to make sure this one
|
|
* 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)
|
|
- wlr_cursor_set_xcursor(cursor, cursor_mgr,
|
|
- wlr_cursor_shape_v1_name(event->shape));
|
|
+ if (event->seat_client == seat->pointer_state.focused_client) {
|
|
+ last_cursor.shape = event->shape;
|
|
+ last_cursor.surface = NULL;
|
|
+
|
|
+ if (!cursor_hidden)
|
|
+ wlr_cursor_set_xcursor(cursor, cursor_mgr,
|
|
+ wlr_cursor_shape_v1_name(event->shape));
|
|
+ }
|
|
}
|
|
|
|
void
|
|
--
|
|
2.53.0
|
|
|