Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 18 additions & 6 deletions src/config/ConfigManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1056,7 +1056,7 @@ std::optional<std::string> CConfigManager::resetHLConfig() {
g_pAnimationManager->addBezierWithName("linear", Vector2D(0.0, 0.0), Vector2D(1.0, 1.0));
g_pTrackpadGestures->clearGestures();

m_mAdditionalReservedAreas.clear();
m_mAdditionalReservedArea = {};
m_blurLSNamespaces.clear();
m_workspaceRules.clear();
setDefaultAnimationVars(); // reset anims
Expand Down Expand Up @@ -1098,7 +1098,9 @@ std::optional<std::string> CConfigManager::handleMonitorv2(const std::string& ou
VAL = m_config->getSpecialConfigValuePtr("monitorv2", "addreserved", output.c_str());
if (VAL && VAL->m_bSetByUser) {
const auto ARGS = CVarList(std::any_cast<Hyprlang::STRING>(VAL->getValue()));
parser.setReserved({.top = std::stoi(ARGS[0]), .bottom = std::stoi(ARGS[1]), .left = std::stoi(ARGS[2]), .right = std::stoi(ARGS[3])});
parser.setReserved({std::stoi(ARGS[0]), std::stoi(ARGS[1]), std::stoi(ARGS[2]), std::stoi(ARGS[3])});
if (parser.name().empty())
m_mAdditionalReservedArea = parser.rule().addReservedArea;
}
VAL = m_config->getSpecialConfigValuePtr("monitorv2", "mirror", output.c_str());
if (VAL && VAL->m_bSetByUser)
Expand Down Expand Up @@ -2310,7 +2312,7 @@ void CMonitorRuleParser::setMirror(const std::string& value) {
}

bool CMonitorRuleParser::setReserved(const SMonitorAdditionalReservedArea& value) {
g_pConfigManager->m_mAdditionalReservedAreas[name()] = value;
m_rule.addReservedArea = value;
return true;
}

Expand All @@ -2320,7 +2322,6 @@ std::optional<std::string> CConfigManager::handleMonitor(const std::string& comm
const auto ARGS = CVarList(args);

auto parser = CMonitorRuleParser(ARGS[0]);

if (ARGS[1] == "disable" || ARGS[1] == "disabled" || ARGS[1] == "addreserved" || ARGS[1] == "transform") {
if (ARGS[1] == "disable" || ARGS[1] == "disabled")
parser.setDisabled();
Expand All @@ -2340,8 +2341,19 @@ std::optional<std::string> CConfigManager::handleMonitor(const std::string& comm

return {};
} else if (ARGS[1] == "addreserved") {
parser.setReserved({.top = std::stoi(ARGS[2]), .bottom = std::stoi(ARGS[3]), .left = std::stoi(ARGS[4]), .right = std::stoi(ARGS[5])});
return {};
parser.setReserved({std::stoi(ARGS[2]), std::stoi(ARGS[3]), std::stoi(ARGS[4]), std::stoi(ARGS[5])});
if (ARGS[0].empty()) {
m_mAdditionalReservedArea = parser.rule().addReservedArea;
return {};
} else {
for (auto& r : m_monitorRules)
// If we already have a monitor rule, overwrite it instead of discard it.
// V2 will always set and discard previous rules.
if (r.name == parser.name()) {
r.addReservedArea = parser.rule().addReservedArea;
return {};
}
}
} else {
Debug::log(ERR, "ConfigManager parseMonitor, curitem bogus???");
return "parse error: curitem bogus";
Expand Down
60 changes: 26 additions & 34 deletions src/config/ConfigManager.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

#include <map>
#include <unordered_map>
#include "../defines.hpp"
#include <variant>
#include <vector>
#include <optional>
Expand Down Expand Up @@ -49,13 +48,6 @@ struct SWorkspaceRule {
std::map<std::string, std::string> layoutopts;
};

struct SMonitorAdditionalReservedArea {
int top = 0;
int bottom = 0;
int left = 0;
int right = 0;
};

struct SPluginKeyword {
HANDLE handle = nullptr;
std::string name = "";
Expand Down Expand Up @@ -202,39 +194,39 @@ class CConfigManager {
public:
CConfigManager();

void init();
void reload();
std::string verify();
void init();
void reload();
std::string verify();

int getDeviceInt(const std::string&, const std::string&, const std::string& fallback = "");
float getDeviceFloat(const std::string&, const std::string&, const std::string& fallback = "");
Vector2D getDeviceVec(const std::string&, const std::string&, const std::string& fallback = "");
std::string getDeviceString(const std::string&, const std::string&, const std::string& fallback = "");
bool deviceConfigExplicitlySet(const std::string&, const std::string&);
bool deviceConfigExists(const std::string&);
Hyprlang::CConfigValue* getConfigValueSafeDevice(const std::string& dev, const std::string& val, const std::string& fallback);
bool shouldBlurLS(const std::string&);
int getDeviceInt(const std::string&, const std::string&, const std::string& fallback = "");
float getDeviceFloat(const std::string&, const std::string&, const std::string& fallback = "");
Vector2D getDeviceVec(const std::string&, const std::string&, const std::string& fallback = "");
std::string getDeviceString(const std::string&, const std::string&, const std::string& fallback = "");
bool deviceConfigExplicitlySet(const std::string&, const std::string&);
bool deviceConfigExists(const std::string&);
Hyprlang::CConfigValue* getConfigValueSafeDevice(const std::string& dev, const std::string& val, const std::string& fallback);
bool shouldBlurLS(const std::string&);

void* const* getConfigValuePtr(const std::string&);
Hyprlang::CConfigValue* getHyprlangConfigValuePtr(const std::string& name, const std::string& specialCat = "");
std::string getMainConfigPath();
std::string getConfigString();
void* const* getConfigValuePtr(const std::string&);
Hyprlang::CConfigValue* getHyprlangConfigValuePtr(const std::string& name, const std::string& specialCat = "");
std::string getMainConfigPath();
std::string getConfigString();

SMonitorRule getMonitorRuleFor(const PHLMONITOR);
SWorkspaceRule getWorkspaceRuleFor(PHLWORKSPACE workspace);
std::string getDefaultWorkspaceFor(const std::string&);
SMonitorRule getMonitorRuleFor(const PHLMONITOR);
SWorkspaceRule getWorkspaceRuleFor(PHLWORKSPACE workspace);
std::string getDefaultWorkspaceFor(const std::string&);

PHLMONITOR getBoundMonitorForWS(const std::string&);
std::string getBoundMonitorStringForWS(const std::string&);
const std::vector<SWorkspaceRule>& getAllWorkspaceRules();
PHLMONITOR getBoundMonitorForWS(const std::string&);
std::string getBoundMonitorStringForWS(const std::string&);
const std::vector<SWorkspaceRule>& getAllWorkspaceRules();

std::vector<SP<CWindowRule>> getMatchingRules(PHLWINDOW, bool dynamic = true, bool shadowExec = false);
std::vector<SP<CLayerRule>> getMatchingRules(PHLLS);
void ensurePersistentWorkspacesPresent();
std::vector<SP<CWindowRule>> getMatchingRules(PHLWINDOW, bool dynamic = true, bool shadowExec = false);
std::vector<SP<CLayerRule>> getMatchingRules(PHLLS);
void ensurePersistentWorkspacesPresent();

const std::vector<SConfigOptionDescription>& getAllDescriptions();
const std::vector<SConfigOptionDescription>& getAllDescriptions();

std::unordered_map<std::string, SMonitorAdditionalReservedArea> m_mAdditionalReservedAreas;
SMonitorAdditionalReservedArea m_mAdditionalReservedArea = {};

const std::unordered_map<std::string, SP<Hyprutils::Animation::SAnimationPropertyConfig>>& getAnimationConfig();

Expand Down
32 changes: 24 additions & 8 deletions src/helpers/Monitor.hpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
#pragma once

#include "../defines.hpp"
#include <stack>
#include <vector>
#include "../SharedDefs.hpp"
Expand All @@ -11,10 +10,8 @@

#include <xf86drmMode.h>
#include "time/Timer.hpp"
#include "math/Math.hpp"
#include <optional>
#include "../protocols/types/ColorManagement.hpp"
#include "signal/Signal.hpp"
#include "DamageRing.hpp"
#include <aquamarine/output/Output.hpp>
#include <aquamarine/allocator/Swapchain.hpp>
Expand Down Expand Up @@ -44,6 +41,23 @@ enum eCMType : uint8_t {
CM_HDR_EDID, // same as CM_HDR with edid primaries
};

struct SMonitorAdditionalReservedArea {
int top = 0;
int bottom = 0;
int left = 0;
int right = 0;

SMonitorAdditionalReservedArea() = default;
SMonitorAdditionalReservedArea(int t, int b, int l, int r) : top(t), bottom(b), left(l), right(r), _set(true) {}

explicit operator bool() const {
return _set;
}

private:
bool _set = false;
};

struct SMonitorRule {
eAutoDirs autoDir = DIR_AUTO_NONE;
std::string name = "";
Expand All @@ -65,12 +79,14 @@ struct SMonitorRule {
int sdrMaxLuminance = 80; // SDR -> HDR

// Incorrect values will result in reduced luminance range or incorrect tonemapping. Shouldn't damage the HW. Use with care in case of a faulty monitor firmware.
float minLuminance = -1.0f; // >= 0 overrides EDID
int maxLuminance = -1; // >= 0 overrides EDID
int maxAvgLuminance = -1; // >= 0 overrides EDID
float minLuminance = -1.0f; // >= 0 overrides EDID
int maxLuminance = -1; // >= 0 overrides EDID
int maxAvgLuminance = -1; // >= 0 overrides EDID

drmModeModeInfo drmMode = {};
std::optional<int> vrr;

drmModeModeInfo drmMode = {};
std::optional<int> vrr;
SMonitorAdditionalReservedArea addReservedArea = {};
};

class CMonitor;
Expand Down
12 changes: 3 additions & 9 deletions src/render/Renderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1849,15 +1849,9 @@ void CHyprRenderer::arrangeLayersForMonitor(const MONITORID& monitor) {
PMONITOR->m_reservedTopLeft = Vector2D(usableArea.x, usableArea.y) - PMONITOR->m_position;
PMONITOR->m_reservedBottomRight = PMONITOR->m_size - Vector2D(usableArea.width, usableArea.height) - PMONITOR->m_reservedTopLeft;

auto ADDITIONALRESERVED = g_pConfigManager->m_mAdditionalReservedAreas.find(PMONITOR->m_name);
if (ADDITIONALRESERVED == g_pConfigManager->m_mAdditionalReservedAreas.end()) {
ADDITIONALRESERVED = g_pConfigManager->m_mAdditionalReservedAreas.find(""); // glob wildcard
}

if (ADDITIONALRESERVED != g_pConfigManager->m_mAdditionalReservedAreas.end()) {
PMONITOR->m_reservedTopLeft = PMONITOR->m_reservedTopLeft + Vector2D(ADDITIONALRESERVED->second.left, ADDITIONALRESERVED->second.top);
PMONITOR->m_reservedBottomRight = PMONITOR->m_reservedBottomRight + Vector2D(ADDITIONALRESERVED->second.right, ADDITIONALRESERVED->second.bottom);
}
const auto RESERVED = (PMONITOR->m_activeMonitorRule.addReservedArea) ? PMONITOR->m_activeMonitorRule.addReservedArea : g_pConfigManager->m_mAdditionalReservedArea;
PMONITOR->m_reservedTopLeft = PMONITOR->m_reservedTopLeft + Vector2D(RESERVED.left, RESERVED.top);
PMONITOR->m_reservedBottomRight = PMONITOR->m_reservedBottomRight + Vector2D(RESERVED.right, RESERVED.bottom);

// damage the monitor if can
damageMonitor(PMONITOR);
Expand Down
Loading