summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorvaxerski <vaxry@vaxry.net>2023-08-11 17:37:52 +0200
committervaxerski <vaxry@vaxry.net>2023-08-11 17:37:57 +0200
commit3f7f4207a6dd8bd217c01514ea40e9e4b9b7874a (patch)
tree346ac60f6dd5b1cb291d0d7e7989c1cb03f6ee2f /src
parent8a7ce59ad405adee5d701b6a5be67dd45b5a24bd (diff)
config: add vrr per-display
Diffstat (limited to 'src')
-rw-r--r--src/config/ConfigManager.cpp11
-rw-r--r--src/config/ConfigManager.hpp14
-rw-r--r--src/helpers/Monitor.hpp19
-rw-r--r--src/render/Renderer.cpp3
4 files changed, 29 insertions, 18 deletions
diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp
index cf2f8ed6..bb582039 100644
--- a/src/config/ConfigManager.cpp
+++ b/src/config/ConfigManager.cpp
@@ -660,6 +660,9 @@ void CConfigManager::handleMonitor(const std::string& command, const std::string
} else if (ARGS[argno] == "transform") {
newrule.transform = (wl_output_transform)std::stoi(ARGS[argno + 1]);
argno++;
+ } else if (ARGS[argno] == "vrr") {
+ newrule.vrr = std::stoi(ARGS[argno + 1]);
+ argno++;
} else if (ARGS[argno] == "workspace") {
std::string name = "";
int wsId = getWorkspaceIDFromString(ARGS[argno + 1], name);
@@ -2070,7 +2073,9 @@ void CConfigManager::ensureVRR(CMonitor* pMonitor) {
if (!m->output)
return;
- if (*PVRR == 0) {
+ const auto USEVRR = m->activeMonitorRule.vrr.has_value() ? m->activeMonitorRule.vrr.value() : *PVRR;
+
+ if (USEVRR == 0) {
if (m->vrrActive) {
wlr_output_enable_adaptive_sync(m->output, 0);
@@ -2080,7 +2085,7 @@ void CConfigManager::ensureVRR(CMonitor* pMonitor) {
}
m->vrrActive = false;
return;
- } else if (*PVRR == 1) {
+ } else if (USEVRR == 1) {
if (!m->vrrActive) {
wlr_output_enable_adaptive_sync(m->output, 1);
@@ -2095,7 +2100,7 @@ void CConfigManager::ensureVRR(CMonitor* pMonitor) {
}
m->vrrActive = true;
return;
- } else if (*PVRR == 2) {
+ } else if (USEVRR == 2) {
/* fullscreen */
m->vrrActive = true;
diff --git a/src/config/ConfigManager.hpp b/src/config/ConfigManager.hpp
index d5cd77db..b2b9c38c 100644
--- a/src/config/ConfigManager.hpp
+++ b/src/config/ConfigManager.hpp
@@ -14,6 +14,7 @@
#include <xf86drmMode.h>
#include "../Window.hpp"
#include "../helpers/WLClasses.hpp"
+#include "../helpers/Monitor.hpp"
#include "defaultConfig.hpp"
#include "ConfigDataValues.hpp"
@@ -35,19 +36,6 @@ struct SConfigValue {
bool set = false; // used for device configs
};
-struct SMonitorRule {
- std::string name = "";
- Vector2D resolution = Vector2D(1280, 720);
- Vector2D offset = Vector2D(0, 0);
- float scale = 1;
- float refreshRate = 60;
- bool disabled = false;
- wl_output_transform transform = WL_OUTPUT_TRANSFORM_NORMAL;
- std::string mirrorOf = "";
- bool enable10bit = false;
- drmModeModeInfo drmMode = {};
-};
-
struct SWorkspaceRule {
std::string monitor = "";
std::string workspaceString = "";
diff --git a/src/helpers/Monitor.hpp b/src/helpers/Monitor.hpp
index b453bc8c..e4bf6251 100644
--- a/src/helpers/Monitor.hpp
+++ b/src/helpers/Monitor.hpp
@@ -9,8 +9,21 @@
#include <xf86drmMode.h>
#include "Timer.hpp"
#include "Region.hpp"
-
-struct SMonitorRule;
+#include <optional>
+
+struct SMonitorRule {
+ std::string name = "";
+ Vector2D resolution = Vector2D(1280, 720);
+ Vector2D offset = Vector2D(0, 0);
+ float scale = 1;
+ float refreshRate = 60;
+ bool disabled = false;
+ wl_output_transform transform = WL_OUTPUT_TRANSFORM_NORMAL;
+ std::string mirrorOf = "";
+ bool enable10bit = false;
+ drmModeModeInfo drmMode = {};
+ std::optional<int> vrr;
+};
class CMonitor {
public:
@@ -58,6 +71,8 @@ class CMonitor {
bool RATScheduled = false;
CTimer lastPresentationTimer;
+ SMonitorRule activeMonitorRule;
+
// mirroring
CMonitor* pMirrorOf = nullptr;
std::vector<CMonitor*> mirrors;
diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp
index 5f929540..1f75fd4f 100644
--- a/src/render/Renderer.cpp
+++ b/src/render/Renderer.cpp
@@ -1568,6 +1568,8 @@ bool CHyprRenderer::applyMonitorRule(CMonitor* pMonitor, SMonitorRule* pMonitorR
Debug::log(LOG, "Applying monitor rule for %s", pMonitor->szName.c_str());
+ pMonitor->activeMonitorRule = *pMonitorRule;
+
// if it's disabled, disable and ignore
if (pMonitorRule->disabled) {
@@ -1587,6 +1589,7 @@ bool CHyprRenderer::applyMonitorRule(CMonitor* pMonitor, SMonitorRule* pMonitorR
}
// Check if the rule isn't already applied
+ // TODO: clean this up lol
if (!force && DELTALESSTHAN(pMonitor->vecPixelSize.x, pMonitorRule->resolution.x, 1) && DELTALESSTHAN(pMonitor->vecPixelSize.y, pMonitorRule->resolution.y, 1) &&
DELTALESSTHAN(pMonitor->refreshRate, pMonitorRule->refreshRate, 1) && pMonitor->scale == pMonitorRule->scale &&
((DELTALESSTHAN(pMonitor->vecPosition.x, pMonitorRule->offset.x, 1) && DELTALESSTHAN(pMonitor->vecPosition.y, pMonitorRule->offset.y, 1)) ||