From 72137ab7f63e251f2e1c9557e236fd4e9c4efa38 Mon Sep 17 00:00:00 2001
From: A Frederick Christensen <dwl@ivories.org>
Date: Tue, 24 Feb 2026 23:12:17 -0600
Subject: [PATCH] monitorconfig: update for dwl 0.8

---
 config.def.h | 12 ++++++++----
 dwl.c        | 25 +++++++++++++++++++------
 2 files changed, 27 insertions(+), 10 deletions(-)

diff --git a/config.def.h b/config.def.h
index 8a6eda0..597e3bb 100644
--- a/config.def.h
+++ b/config.def.h
@@ -40,10 +40,14 @@ static const Layout layouts[] = {
  * WARNING: negative values other than (-1, -1) cause problems with Xwayland clients due to
  * https://gitlab.freedesktop.org/xorg/xserver/-/issues/899 */
 static const MonitorRule monrules[] = {
-   /* name        mfact  nmaster scale layout       rotate/reflect                x    y
-    * example of a HiDPI laptop monitor:
-    { "eDP-1",    0.5f,  1,      2,    &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL,   -1,  -1 }, */
-	{ NULL,       0.55f, 1,      1,    &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL,   -1,  -1 },
+   /*    name  mfact nmaster  scale       layout              rotate/reflect   x   y  resx resy      rate mode adaptive */
+   /*{"eDP-1",  0.5f,      1,     2, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL,  0,  0,    0,   0, 120.000f,   1,       1}, 	/* example of a HiDPI laptop monitor at 120Hz: */
+   /*
+	* mode lets the user decide how dwl should implement the modes:
+	* -1 sets a custom mode following the user's choice
+	* All other numbers set the mode at the index n; 0 is the standard mode; see wlr-randr
+	*/
+	{     NULL, 0.55f,     1,     1, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1,    0,   0,     0.0f,   0,       1},
 	/* default monitor rule: can be changed but cannot be eliminated; at least one monitor rule must exist */
 };
 
diff --git a/dwl.c b/dwl.c
index 44f3ad9..987b5a6 100644
--- a/dwl.c
+++ b/dwl.c
@@ -215,6 +215,11 @@ typedef struct {
 	const Layout *lt;
 	enum wl_output_transform rr;
 	int x, y;
+	int resx;
+	int resy;
+	float rate;
+	int mode;
+	int adaptive;
 } MonitorRule;
 
 typedef struct {
@@ -1041,6 +1046,7 @@ createmon(struct wl_listener *listener, void *data)
 	/* This event is raised by the backend when a new output (aka a display or
 	 * monitor) becomes available. */
 	struct wlr_output *wlr_output = data;
+	struct wlr_output_mode *mode = wl_container_of(wlr_output->modes.next, mode, link);
 	const MonitorRule *r;
 	size_t i;
 	struct wlr_output_state state;
@@ -1069,16 +1075,23 @@ createmon(struct wl_listener *listener, void *data)
 			strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, LENGTH(m->ltsymbol));
 			wlr_output_state_set_scale(&state, r->scale);
 			wlr_output_state_set_transform(&state, r->rr);
+
+			wlr_output_state_set_adaptive_sync_enabled(&state, r->adaptive);
+
+			if(r->mode == -1)
+				wlr_output_state_set_custom_mode(&state, r->resx, r->resy,
+				(int) (r->rate > 0 ? r->rate * 1000 : 0));
+			else if (!wl_list_empty(&wlr_output->modes)) {
+				for (int j = 0; j < r->mode; j++) {
+					mode = wl_container_of(mode->link.next, mode, link);
+				}
+				wlr_output_state_set_mode(&state, mode);
+			}
+
 			break;
 		}
 	}
 
-	/* The mode is a tuple of (width, height, refresh rate), and each
-	 * monitor supports only a specific set of modes. We just pick the
-	 * monitor's preferred mode; a more sophisticated compositor would let
-	 * the user configure it. */
-	wlr_output_state_set_mode(&state, wlr_output_preferred_mode(wlr_output));
-
 	/* Set up event listeners */
 	LISTEN(&wlr_output->events.frame, &m->frame, rendermon);
 	LISTEN(&wlr_output->events.destroy, &m->destroy, cleanupmon);
-- 
2.52.0

