From 171d859cb570c190f114110cd3ed556067797875 Mon Sep 17 00:00:00 2001 From: DreamMaoMao <2523610504@qq.com> Date: Sat, 27 Jun 2026 16:45:57 +0800 Subject: [PATCH] feat: add disable option to monitor rule --- docs/configuration/monitors.md | 1 + src/config/parse_config.h | 11 ++++++++++- src/mango.c | 9 ++++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/docs/configuration/monitors.md b/docs/configuration/monitors.md index 15ddfbaa..fba8f407 100644 --- a/docs/configuration/monitors.md +++ b/docs/configuration/monitors.md @@ -33,6 +33,7 @@ monitorrule=name:Values,Parameter:Values,Parameter:Values | `hdr` | integer | 0, 1 | Enable hdr support | | `rr` | integer | 0-7 | Monitor transform | | `custom` | integer | 0, 1 | Enable custom mode (not supported on all displays — may cause black screen) | +| `disable` | integer | 0, 1 | Disable the monitor | ### Transform Values diff --git a/src/config/parse_config.h b/src/config/parse_config.h index 3b7384a3..c1166fc7 100644 --- a/src/config/parse_config.h +++ b/src/config/parse_config.h @@ -121,6 +121,7 @@ typedef struct { int32_t vrr; // variable refresh rate int32_t custom; // enable custom mode int32_t hdr; // enable hdr mode + int32_t disable; // prefer disable } ConfigMonitorRule; // 修改后的宏定义 @@ -2128,6 +2129,7 @@ bool parse_option(Config *config, char *key, char *value) { rule->vrr = 0; rule->hdr = 0; rule->custom = 0; + rule->disable = 0; bool parse_error = false; char *token = strtok(value, ","); @@ -2167,6 +2169,8 @@ bool parse_option(Config *config, char *key, char *value) { rule->vrr = CLAMP_INT(atoi(val), 0, 1); } else if (strcmp(key, "hdr") == 0) { rule->hdr = CLAMP_INT(atoi(val), 0, 1); + } else if (strcmp(key, "disable") == 0) { + rule->disable = CLAMP_INT(atoi(val), 0, 1); } else if (strcmp(key, "custom") == 0) { rule->custom = CLAMP_INT(atoi(val), 0, 1); } else { @@ -4068,6 +4072,7 @@ void reapply_monitor_rules(void) { vrr = mr->vrr >= 0 ? mr->vrr : 0; custom = mr->custom >= 0 ? mr->custom : 0; m->hdr_enable = mr->hdr >= 0 ? mr->hdr : 0; + m->prefer_disable = mr->disable >= 0 ? mr->disable : 0; (void)apply_rule_to_state(m, mr, &m->pending, vrr, custom); wlr_output_layout_add(output_layout, m->wlr_output, mx, my); @@ -4075,7 +4080,11 @@ void reapply_monitor_rules(void) { } } - wlr_output_state_set_enabled(&m->pending, true); + if (m->prefer_disable) { + wlr_output_state_set_enabled(&m->pending, false); + } else { + wlr_output_state_set_enabled(&m->pending, true); + } if (m->hdr_enable) { output_state_setup_hdr(m, false, &m->pending); diff --git a/src/mango.c b/src/mango.c index 4bd01ba5..5bdcbc2e 100644 --- a/src/mango.c +++ b/src/mango.c @@ -601,6 +601,7 @@ struct Monitor { bool vrr_global_enable; bool is_vrr_opening; bool hdr_enable; + bool prefer_disable; }; typedef struct { @@ -3469,6 +3470,7 @@ void createmon(struct wl_listener *listener, void *data) { m->is_vrr_opening = false; m->hdr_enable = false; + m->prefer_disable = false; m->wlr_output = wlr_output; m->wlr_output->data = m; @@ -3508,6 +3510,7 @@ void createmon(struct wl_listener *listener, void *data) { scale = r->scale; rr = r->rr; m->hdr_enable = r->hdr; + m->prefer_disable = r->disable >= 0 ? r->disable : 0; if (apply_rule_to_state(m, r, &m->pending, vrr, custom)) { custom_monitor_mode = true; @@ -3526,7 +3529,11 @@ void createmon(struct wl_listener *listener, void *data) { LISTEN(&wlr_output->events.request_state, &m->request_state, requestmonstate); - wlr_output_state_set_enabled(&m->pending, 1); + if (m->prefer_disable) { + wlr_output_state_set_enabled(&m->pending, false); + } else { + wlr_output_state_set_enabled(&m->pending, true); + } if (m->hdr_enable) { output_state_setup_hdr(m, false, &m->pending);