summaryrefslogtreecommitdiff
path: root/src/helpers/Monitor.cpp
diff options
context:
space:
mode:
authorIkalco <73481042+ikalco@users.noreply.github.com>2025-01-31 06:23:32 -0600
committerGitHub <noreply@github.com>2025-01-31 13:23:32 +0100
commite6a9cfab9199788ee0dcefd8b1bda46f93e6a001 (patch)
tree97e712c2e8c2dd9dc0e1c08e42044f94541eaaa8 /src/helpers/Monitor.cpp
parentef03f6911694413b1b06aba727ad9ab089a511f7 (diff)
monitor: preferred mode now tries first 3 modes if preferred fails before erroring (#9246)
Diffstat (limited to 'src/helpers/Monitor.cpp')
-rw-r--r--src/helpers/Monitor.cpp17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/helpers/Monitor.cpp b/src/helpers/Monitor.cpp
index fc3de3aa..9aa6efce 100644
--- a/src/helpers/Monitor.cpp
+++ b/src/helpers/Monitor.cpp
@@ -435,7 +435,7 @@ bool CMonitor::applyMonitorRule(SMonitorRule* pMonitorRule, bool force) {
// accumulate requested modes in reverse order (cause inesrting at front is inefficient)
std::vector<SP<Aquamarine::SOutputMode>> requestedModes;
- std::string requestedStr = "preferred";
+ std::string requestedStr = "unknown";
// use sortFunc, add best 3 to requestedModes in reverse, since we test in reverse
auto addBest3Modes = [&](auto const& sortFunc) {
@@ -446,13 +446,24 @@ bool CMonitor::applyMonitorRule(SMonitorRule* pMonitorRule, bool force) {
requestedModes.insert(requestedModes.end(), sortedModes.rbegin(), sortedModes.rend());
};
- // last fallback is preferred mode, btw this covers resolution == Vector2D()
+ // last fallback is always preferred mode
if (!output->preferredMode())
Debug::log(ERR, "Monitor {} has NO PREFERRED MODE", output->name);
else
requestedModes.push_back(output->preferredMode());
- if (RULE->resolution == Vector2D(-1, -1)) {
+ if (RULE->resolution == Vector2D()) {
+ requestedStr = "preferred";
+
+ // fallback to first 3 modes if preferred fails/doesn't exist
+ requestedModes = output->modes;
+ if (requestedModes.size() > 3)
+ requestedModes.erase(requestedModes.begin() + 3, requestedModes.end());
+ std::ranges::reverse(requestedModes.begin(), requestedModes.end());
+
+ if (output->preferredMode())
+ requestedModes.push_back(output->preferredMode());
+ } else if (RULE->resolution == Vector2D(-1, -1)) {
requestedStr = "highrr";
// sort prioritizing refresh rate 1st and resolution 2nd, then add best 3