From 860793b4ff7b03c0fe4be03f2086ae5f25876293 Mon Sep 17 00:00:00 2001 From: julmajustus Date: Sun, 20 Sep 2026 02:32:01 +0300 Subject: [PATCH] fullscreenadaptivesync refactor for d16036e --- config.def.h | 1 + dwl.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 57 insertions(+), 3 deletions(-) diff --git a/config.def.h b/config.def.h index 13c5322..262e3f3 100644 --- a/config.def.h +++ b/config.def.h @@ -138,6 +138,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_0, tag, {.ui = ~0} }, { MODKEY, XKB_KEY_comma, focusmon, {.i = WLR_DIRECTION_LEFT} }, diff --git a/dwl.c b/dwl.c index 4cfd0fd..c3ab2ba 100644 --- a/dwl.c +++ b/dwl.c @@ -340,6 +340,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); @@ -357,6 +358,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); @@ -462,6 +464,8 @@ static struct wl_listener start_drag = {.notify = startdrag}; static struct wl_listener new_session_lock = {.notify = locksession}; static struct wl_listener new_foreign_toplevel_capture_request = {.notify = capturerequest}; +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); @@ -2453,6 +2457,43 @@ 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; + + if (enable && m->wlr_output->adaptive_sync_status + == WLR_OUTPUT_ADAPTIVE_SYNC_ENABLED) + return; + + if (!enable && m->wlr_output->adaptive_sync_status + == WLR_OUTPUT_ADAPTIVE_SYNC_DISABLED) + 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); + if (!wlr_output_commit_state(m->wlr_output, &state)) { + wlr_output_state_finish(&state); + wlr_output_configuration_v1_destroy(config); + return; + } + 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) { @@ -2516,10 +2557,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(); @@ -2699,7 +2742,7 @@ setup(void) output_layout = wlr_output_layout_create(dpy); wl_signal_add(&output_layout->events.change, &layout_change); - wlr_xdg_output_manager_v1_create(dpy, output_layout); + wlr_xdg_output_manager_v1_create(dpy, output_layout); /* Configure a listener to be notified when new outputs are available on the * backend. */ @@ -2795,8 +2838,8 @@ setup(void) wl_signal_add(&virtual_keyboard_mgr->events.new_virtual_keyboard, &new_virtual_keyboard); virtual_pointer_mgr = wlr_virtual_pointer_manager_v1_create(dpy); - wl_signal_add(&virtual_pointer_mgr->events.new_virtual_pointer, - &new_virtual_pointer); + wl_signal_add(&virtual_pointer_mgr->events.new_virtual_pointer, + &new_virtual_pointer); seat = wlr_seat_create(dpy, "seat0"); wl_signal_add(&seat->events.request_set_cursor, &request_cursor); @@ -2930,6 +2973,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) { @@ -2985,6 +3034,7 @@ unmapnotify(struct wl_listener *listener, void *data) { /* Called when the surface is unmapped, and should no longer be shown. */ Client *c = wl_container_of(listener, c, unmap); + Monitor *lastmon = c->mon; // fullscreen_adaptive_sync if (c == grabc) { cursor_mode = CurNormal; grabc = NULL; @@ -3002,6 +3052,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(lastmon, 0); if (c->foreign_toplevel_handle) { wlr_ext_foreign_toplevel_handle_v1_destroy(c->foreign_toplevel_handle); -- 2.55.0