summaryrefslogtreecommitdiff
path: root/src/config/ConfigManager.cpp
diff options
context:
space:
mode:
authorVaxry <43317083+vaxerski@users.noreply.github.com>2024-09-26 11:10:53 +0100
committerGitHub <noreply@github.com>2024-09-26 11:10:53 +0100
commitcaaa9b11e4763ed0367f81bf97ceaad5175806fc (patch)
tree2c8c44c5f7aa34b4bffe503a84ec8e53ad16e171 /src/config/ConfigManager.cpp
parentb1ad2d806634edff656cb5ddc9850ae2c73324e8 (diff)
wlr-output-configuration: Improve output configuration (#7571)
Diffstat (limited to 'src/config/ConfigManager.cpp')
-rw-r--r--src/config/ConfigManager.cpp66
1 files changed, 54 insertions, 12 deletions
diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp
index 21a3a21e..ab5905c2 100644
--- a/src/config/ConfigManager.cpp
+++ b/src/config/ConfigManager.cpp
@@ -7,6 +7,7 @@
#include "helpers/varlist/VarList.hpp"
#include "../protocols/LayerShell.hpp"
#include "../xwayland/XWayland.hpp"
+#include "../protocols/OutputManagement.hpp"
#include <cstddef>
#include <cstdint>
@@ -1079,28 +1080,69 @@ std::string CConfigManager::getDeviceString(const std::string& dev, const std::s
return VAL;
}
-SMonitorRule CConfigManager::getMonitorRuleFor(const CMonitor& PMONITOR) {
+SMonitorRule CConfigManager::getMonitorRuleFor(const SP<CMonitor> PMONITOR) {
+ auto applyWlrOutputConfig = [PMONITOR](SMonitorRule rule) -> SMonitorRule {
+ const auto CONFIG = PROTO::outputManagement->getOutputStateFor(PMONITOR);
+
+ if (!CONFIG)
+ return rule;
+
+ Debug::log(LOG, "CConfigManager::getMonitorRuleFor: found a wlr_output_manager override for {}", PMONITOR->szName);
+
+ Debug::log(LOG, " > overriding enabled: {} -> {}", !rule.disabled, !CONFIG->enabled);
+ rule.disabled = !CONFIG->enabled;
+
+ if ((CONFIG->committedProperties & OUTPUT_HEAD_COMMITTED_MODE) || (CONFIG->committedProperties & OUTPUT_HEAD_COMMITTED_CUSTOM_MODE)) {
+ Debug::log(LOG, " > overriding mode: {:.0f}x{:.0f}@{:.2f}Hz -> {:.0f}x{:.0f}@{:.2f}Hz", rule.resolution.x, rule.resolution.y, rule.refreshRate, CONFIG->resolution.x,
+ CONFIG->resolution.y, CONFIG->refresh / 1000.F);
+ rule.resolution = CONFIG->resolution;
+ rule.refreshRate = CONFIG->refresh / 1000.F;
+ }
+
+ if (CONFIG->committedProperties & OUTPUT_HEAD_COMMITTED_POSITION) {
+ Debug::log(LOG, " > overriding offset: {:.0f}, {:.0f} -> {:.0f}, {:.0f}", rule.offset.x, rule.offset.y, CONFIG->position.x, CONFIG->position.y);
+ rule.offset = CONFIG->position;
+ }
+
+ if (CONFIG->committedProperties & OUTPUT_HEAD_COMMITTED_TRANSFORM) {
+ Debug::log(LOG, " > overriding transform: {} -> {}", (uint8_t)rule.transform, (uint8_t)CONFIG->transform);
+ rule.transform = CONFIG->transform;
+ }
+
+ if (CONFIG->committedProperties & OUTPUT_HEAD_COMMITTED_SCALE) {
+ Debug::log(LOG, " > overriding scale: {} -> {}", (uint8_t)rule.scale, (uint8_t)CONFIG->scale);
+ rule.scale = CONFIG->scale;
+ }
+
+ if (CONFIG->committedProperties & OUTPUT_HEAD_COMMITTED_ADAPTIVE_SYNC) {
+ Debug::log(LOG, " > overriding vrr: {} -> {}", rule.vrr.value_or(0), CONFIG->adaptiveSync);
+ rule.vrr = (int)CONFIG->adaptiveSync;
+ }
+
+ return rule;
+ };
+
for (auto const& r : m_dMonitorRules | std::views::reverse) {
- if (PMONITOR.matchesStaticSelector(r.name)) {
- return r;
+ if (PMONITOR->matchesStaticSelector(r.name)) {
+ return applyWlrOutputConfig(r);
}
}
- Debug::log(WARN, "No rule found for {}, trying to use the first.", PMONITOR.szName);
+ Debug::log(WARN, "No rule found for {}, trying to use the first.", PMONITOR->szName);
for (auto const& r : m_dMonitorRules) {
if (r.name.empty()) {
- return r;
+ return applyWlrOutputConfig(r);
}
}
Debug::log(WARN, "No rules configured. Using the default hardcoded one.");
- return SMonitorRule{.autoDir = eAutoDirs::DIR_AUTO_RIGHT,
- .name = "",
- .resolution = Vector2D(0, 0),
- .offset = Vector2D(-INT32_MAX, -INT32_MAX),
- .scale = -1}; // 0, 0 is preferred and -1, -1 is auto
+ return applyWlrOutputConfig(SMonitorRule{.autoDir = eAutoDirs::DIR_AUTO_RIGHT,
+ .name = "",
+ .resolution = Vector2D(0, 0),
+ .offset = Vector2D(-INT32_MAX, -INT32_MAX),
+ .scale = -1}); // 0, 0 is preferred and -1, -1 is auto
}
SWorkspaceRule CConfigManager::getWorkspaceRuleFor(PHLWORKSPACE pWorkspace) {
@@ -1459,7 +1501,7 @@ void CConfigManager::performMonitorReload() {
if (!m->output || m->isUnsafeFallback)
continue;
- auto rule = getMonitorRuleFor(*m);
+ auto rule = getMonitorRuleFor(m);
if (!g_pHyprRenderer->applyMonitorRule(m.get(), &rule)) {
overAgain = true;
@@ -1516,7 +1558,7 @@ void CConfigManager::ensureMonitorStatus() {
if (!rm->output || rm->isUnsafeFallback)
continue;
- auto rule = getMonitorRuleFor(*rm);
+ auto rule = getMonitorRuleFor(rm);
if (rule.disabled == rm->m_bEnabled)
g_pHyprRenderer->applyMonitorRule(rm.get(), &rule);