diff options
Diffstat (limited to 'dwl-patches/patches/fullscreenadaptivesync')
-rw-r--r-- | dwl-patches/patches/fullscreenadaptivesync/README.md | 29 | ||||
-rw-r--r-- | dwl-patches/patches/fullscreenadaptivesync/fullscreenadaptivesync-v0.7.patch | 122 |
2 files changed, 151 insertions, 0 deletions
diff --git a/dwl-patches/patches/fullscreenadaptivesync/README.md b/dwl-patches/patches/fullscreenadaptivesync/README.md new file mode 100644 index 0000000..6f7118c --- /dev/null +++ b/dwl-patches/patches/fullscreenadaptivesync/README.md @@ -0,0 +1,29 @@ +### Description + +# fullscreenadaptivesync — Enables adaptive sync/VRR when a client is fullscreen. + +Adds a function that automatically enables adaptive sync/VRR when a fullscreen client is detected, and disables it once the client exits fullscreen. + +--- + +1. **Why** + - Some VRR implementations can introduce distracting flickering when the display’s refresh rate is synced with the application’s framerate. While VRR is useful for some applications (especially fullscreen games), this patch automates the toggling of VRR whenever a client enters or exits fullscreen. + +2. **Requirements** + - A FreeSync/G-Sync capable monitor + - GPU/driver support for adaptive sync + +3. **How it works** + - When a client enters fullscreen, adaptive sync is automatically enabled. + - When the client exits fullscreen, adaptive sync is disabled again. + +4. **togglefullscreenadaptivesync** + - Adds a switch to enable or disable the fullscreenadaptivesync behavior. + - Enabled by default. + +### Download +- [git branch](https://codeberg.org/julmajustus/dwl/src/branch/fullscreenadaptivesync) +- [0.7](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/fullscreenadaptivesync/fullscreenadaptivesync-v0.7.patch) + +### Authors +- [julmajustus](https://codeberg.org/julmajustus) diff --git a/dwl-patches/patches/fullscreenadaptivesync/fullscreenadaptivesync-v0.7.patch b/dwl-patches/patches/fullscreenadaptivesync/fullscreenadaptivesync-v0.7.patch new file mode 100644 index 0000000..ccc012b --- /dev/null +++ b/dwl-patches/patches/fullscreenadaptivesync/fullscreenadaptivesync-v0.7.patch @@ -0,0 +1,122 @@ +From c003f450c197a0c960bbb355511f8dca7a35e3c3 Mon Sep 17 00:00:00 2001 +From: julmajustus <julmajustus@tutanota.com> +Date: Sat, 4 Jan 2025 14:24:59 +0200 +Subject: [PATCH] add fullscreenadaptivesync + +--- + config.def.h | 1 + + dwl.c | 40 ++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 41 insertions(+) + +diff --git a/config.def.h b/config.def.h +index 22d2171..886f1ab 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -142,6 +142,7 @@ static const Key keys[] = { + { MODKEY, XKB_KEY_space, setlayout, {0} }, + { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, + { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, ++ { MODKEY, XKB_KEY_F5, togglefullscreenadaptivesync, {0} }, + { MODKEY, XKB_KEY_0, view, {.ui = ~0} }, + { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright, tag, {.ui = ~0} }, + { MODKEY, XKB_KEY_comma, focusmon, {.i = WLR_DIRECTION_LEFT} }, +diff --git a/dwl.c b/dwl.c +index a2711f6..7be05ef 100644 +--- a/dwl.c ++++ b/dwl.c +@@ -322,6 +322,7 @@ static void requeststartdrag(struct wl_listener *listener, void *data); + static void requestmonstate(struct wl_listener *listener, void *data); + static void resize(Client *c, struct wlr_box geo, int interact); + static void run(char *startup_cmd); ++static void set_adaptive_sync(Monitor *m, int enabled); + static void setcursor(struct wl_listener *listener, void *data); + static void setcursorshape(struct wl_listener *listener, void *data); + static void setfloating(Client *c, int floating); +@@ -340,6 +341,7 @@ static void tagmon(const Arg *arg); + static void tile(Monitor *m); + static void togglefloating(const Arg *arg); + static void togglefullscreen(const Arg *arg); ++static void togglefullscreenadaptivesync(const Arg *arg); + static void toggletag(const Arg *arg); + static void toggleview(const Arg *arg); + static void unlocksession(struct wl_listener *listener, void *data); +@@ -413,6 +415,8 @@ static struct wlr_box sgeom; + static struct wl_list mons; + static Monitor *selmon; + ++static int fullscreen_adaptive_sync_enabled = 1; ++ + #ifdef XWAYLAND + static void activatex11(struct wl_listener *listener, void *data); + static void associatex11(struct wl_listener *listener, void *data); +@@ -2269,6 +2273,31 @@ run(char *startup_cmd) + wl_display_run(dpy); + } + ++void ++set_adaptive_sync(Monitor *m, int enable) ++{ ++ struct wlr_output_state state; ++ struct wlr_output_configuration_v1 *config; ++ struct wlr_output_configuration_head_v1 *config_head; ++ ++ if (!m || !m->wlr_output || !m->wlr_output->enabled ++ || !fullscreen_adaptive_sync_enabled) ++ return; ++ ++ config = wlr_output_configuration_v1_create(); ++ config_head = wlr_output_configuration_head_v1_create(config, m->wlr_output); ++ ++ /* Set and commit the adaptive sync state change */ ++ wlr_output_state_init(&state); ++ wlr_output_state_set_adaptive_sync_enabled(&state, enable); ++ wlr_output_commit_state(m->wlr_output, &state); ++ wlr_output_state_finish(&state); ++ ++ /* Broadcast the adaptive sync state change to output_mgr */ ++ config_head->state.adaptive_sync_enabled = enable; ++ wlr_output_manager_v1_set_configuration(output_mgr, config); ++} ++ + void + setcursor(struct wl_listener *listener, void *data) + { +@@ -2332,10 +2361,12 @@ setfullscreen(Client *c, int fullscreen) + if (fullscreen) { + c->prev = c->geom; + resize(c, c->mon->m, 0); ++ set_adaptive_sync(c->mon, 1); + } else { + /* restore previous size instead of arrange for floating windows since + * client positions are set by the user and cannot be recalculated */ + resize(c, c->prev, 0); ++ set_adaptive_sync(c->mon, 0); + } + arrange(c->mon); + printstatus(); +@@ -2739,6 +2770,12 @@ togglefullscreen(const Arg *arg) + setfullscreen(sel, !sel->isfullscreen); + } + ++void ++togglefullscreenadaptivesync(const Arg *arg) ++{ ++ fullscreen_adaptive_sync_enabled = !fullscreen_adaptive_sync_enabled; ++} ++ + void + toggletag(const Arg *arg) + { +@@ -2809,6 +2846,9 @@ unmapnotify(struct wl_listener *listener, void *data) + setmon(c, NULL, 0); + wl_list_remove(&c->flink); + } ++ /* Toggle adaptive sync off when fullscreen client is unmapped */ ++ if (c->isfullscreen) ++ set_adaptive_sync(selmon, 0); + + wlr_scene_node_destroy(&c->scene->node); + printstatus(); +-- +2.45.2 + |