diff --git a/_STALE_PATCHES/unclutter.md b/_STALE_PATCHES/unclutter.md deleted file mode 100644 index f3af905..0000000 --- a/_STALE_PATCHES/unclutter.md +++ /dev/null @@ -1,9 +0,0 @@ -### Description -Hide the mouse cursor if it isn’t being used for a certain period of time. - -### Download -- [v0.4](https://github.com/djpohly/dwl/compare/main...dm1tz:04-unclutter.patch) -- [2022-02-12](https://github.com/djpohly/dwl/compare/main...guidocella:unclutter.patch) - -### Authors -- [Guido Cella](https://github.com/guidocella) \ No newline at end of file diff --git a/unclutter/unclutter.patch b/unclutter/unclutter.patch new file mode 100644 index 0000000..c490ea1 --- /dev/null +++ b/unclutter/unclutter.patch @@ -0,0 +1,135 @@ +From e087e6a3fcbdddcc323985a06015519b9f179665 Mon Sep 17 00:00:00 2001 +From: Ben Collerson +Date: Mon, 4 Dec 2023 13:06:19 +1000 +Subject: [PATCH] unclutter + +--- + config.def.h | 2 ++ + dwl.c | 42 +++++++++++++++++++++++++++++++++++++++++- + 2 files changed, 43 insertions(+), 1 deletion(-) + +diff --git a/config.def.h b/config.def.h +index a8ed61d9..2e049f78 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -95,6 +95,8 @@ LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE + */ + static const enum libinput_config_accel_profile accel_profile = LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE; + static const double accel_speed = 0.0; ++static const int cursor_timeout = 5; ++ + /* You can choose between: + LIBINPUT_CONFIG_TAP_MAP_LRM -- 1/2/3 finger tap maps to left/right/middle + LIBINPUT_CONFIG_TAP_MAP_LMR -- 1/2/3 finger tap maps to left/middle/right +diff --git a/dwl.c b/dwl.c +index 4d19357f..23cb42e8 100644 +--- a/dwl.c ++++ b/dwl.c +@@ -269,6 +269,8 @@ static void focusmon(const Arg *arg); + static void focusstack(const Arg *arg); + static Client *focustop(Monitor *m); + static void fullscreennotify(struct wl_listener *listener, void *data); ++static void handlecursoractivity(bool restore_focus); ++static int hidecursor(void *data); + static void handlesig(int signo); + static void incnmaster(const Arg *arg); + static void inputdevice(struct wl_listener *listener, void *data); +@@ -364,6 +366,8 @@ static struct wlr_cursor_shape_manager_v1 *cursor_shape_mgr; + + 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 wlr_scene_rect *root_bg; + static struct wlr_session_lock_manager_v1 *session_lock_mgr; +@@ -540,6 +544,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(true); + /* TODO: allow usage of scroll whell for mousebindings, it can be implemented + * checking the event's orientation and the delta of the event */ + /* Notify the client with pointer focus of the axis event. */ +@@ -558,6 +563,7 @@ buttonpress(struct wl_listener *listener, void *data) + const Button *b; + + wlr_idle_notifier_v1_notify_activity(idle_notifier, seat); ++ handlecursoractivity(true); + + switch (event->state) { + case WLR_BUTTON_PRESSED: +@@ -1311,6 +1317,29 @@ handlesig(int signo) + } + } + ++void ++handlecursoractivity(bool restore_focus) ++{ ++ wl_event_source_timer_update(hide_source, cursor_timeout * 1000); ++ if (cursor_hidden) { ++ wlr_cursor_set_xcursor(cursor, cursor_mgr, "default"); ++ ++ cursor_hidden = false; ++ if (restore_focus) ++ motionnotify(0); ++ } ++} ++ ++int ++hidecursor(void *data) ++{ ++ wlr_cursor_unset_image(cursor); ++ ++ wlr_seat_pointer_notify_clear_focus(seat); ++ cursor_hidden = true; ++ return 1; ++} ++ + void + incnmaster(const Arg *arg) + { +@@ -1613,6 +1642,7 @@ motionnotify(uint32_t time) + /* time is 0 in internal calls meant to restore pointer focus. */ + if (time) { + wlr_idle_notifier_v1_notify_activity(idle_notifier, seat); ++ handlecursoractivity(false); + + /* Update selmon (even while dragging a window) */ + if (sloppyfocus) +@@ -1791,7 +1821,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 */ +- wlr_seat_pointer_notify_enter(seat, surface, sx, sy); ++ /* Don't show the cursor when calling motionnotify(0) to restore pointer ++ * focus. */ ++ if (!cursor_hidden) ++ wlr_seat_pointer_notify_enter(seat, surface, sx, sy); + wlr_seat_pointer_notify_motion(seat, time, sx, sy); + + } +@@ -1994,6 +2027,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"); ++ handlecursoractivity(false); + + /* Run the Wayland event loop. This does not return until you exit the + * compositor. Starting the backend rigged up all of the necessary event +@@ -2284,6 +2318,12 @@ setup(void) + xdg_decoration_mgr = wlr_xdg_decoration_manager_v1_create(dpy); + LISTEN_STATIC(&xdg_decoration_mgr->events.new_toplevel_decoration, createdecoration); + ++ hide_source = wl_event_loop_add_timer( ++ wl_display_get_event_loop(dpy), ++ hidecursor, ++ cursor ++ ); ++ + /* + * Creates a cursor, which is a wlroots utility for tracking the cursor + * image shown on screen. +-- +2.43.0 +