aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/events/Windows.cpp40
1 files changed, 27 insertions, 13 deletions
diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp
index e549907e..d2d5bebf 100644
--- a/src/events/Windows.cpp
+++ b/src/events/Windows.cpp
@@ -330,24 +330,38 @@ void Events::listener_mapWindow(void* owner, void* data) {
for (auto const& r : PWINDOW->m_vMatchedRules) {
if (r.szRule.starts_with("size")) {
try {
- const auto VALUE = r.szRule.substr(r.szRule.find(' ') + 1);
- const auto SIZEXSTR = VALUE.substr(0, VALUE.find(' '));
- const auto SIZEYSTR = VALUE.substr(VALUE.find(' ') + 1);
- const auto MAXSIZE = g_pXWaylandManager->getMaxSizeForWindow(PWINDOW);
+ auto stringToFloatClamp = [](const std::string& VALUE, const float CURR, const float REL) {
+ auto stringToPercentage = [](const std::string& VALUE, const float REL) {
+ if (VALUE.ends_with('%'))
+ return (std::stof(VALUE.substr(0, VALUE.length() - 1)) * REL) / 100;
+ else
+ return std::stof(VALUE);
+ };
- const auto SIZEX = SIZEXSTR == "max" ?
- std::clamp(MAXSIZE.x, 20.0, PMONITOR->vecSize.x) :
- (!SIZEXSTR.contains('%') ? std::stoi(SIZEXSTR) : std::stof(SIZEXSTR.substr(0, SIZEXSTR.length() - 1)) * 0.01 * PMONITOR->vecSize.x);
- const auto SIZEY = SIZEYSTR == "max" ?
- std::clamp(MAXSIZE.y, 20.0, PMONITOR->vecSize.y) :
- (!SIZEYSTR.contains('%') ? std::stoi(SIZEYSTR) : std::stof(SIZEYSTR.substr(0, SIZEYSTR.length() - 1)) * 0.01 * PMONITOR->vecSize.y);
+ if (VALUE.starts_with('<'))
+ return std::min(CURR, stringToPercentage(VALUE.substr(1, VALUE.length() - 1), REL));
+ else if (VALUE.starts_with('>'))
+ return std::max(CURR, stringToPercentage(VALUE.substr(1, VALUE.length() - 1), REL));
+
+ return stringToPercentage(VALUE, REL);
+ };
+
+ const auto VALUE = r.szRule.substr(r.szRule.find(' ') + 1);
+ const auto SIZEXSTR = VALUE.substr(0, VALUE.find(' '));
+ const auto SIZEYSTR = VALUE.substr(VALUE.find(' ') + 1);
+
+ const auto MAXSIZE = g_pXWaylandManager->getMaxSizeForWindow(PWINDOW);
+
+ const float SIZEX =
+ SIZEXSTR == "max" ? std::clamp(MAXSIZE.x, 20.0, PMONITOR->vecSize.x) : stringToFloatClamp(SIZEXSTR, PWINDOW->m_vRealSize.goal().x, PMONITOR->vecSize.x);
+
+ const float SIZEY =
+ SIZEYSTR == "max" ? std::clamp(MAXSIZE.y, 20.0, PMONITOR->vecSize.y) : stringToFloatClamp(SIZEYSTR, PWINDOW->m_vRealSize.goal().y, PMONITOR->vecSize.y);
Debug::log(LOG, "Rule size, applying to {}", PWINDOW);
- PWINDOW->m_vRealSize = Vector2D(SIZEX, SIZEY);
- PWINDOW->m_vPseudoSize = PWINDOW->m_vRealSize.goal();
- g_pXWaylandManager->setWindowSize(PWINDOW, PWINDOW->m_vRealSize.goal());
+ PWINDOW->clampWindowSize(Vector2D{SIZEXSTR.starts_with("<") ? 0 : SIZEX, SIZEYSTR.starts_with("<") ? 0 : SIZEY}, Vector2D{SIZEX, SIZEY});
PWINDOW->setHidden(false);
} catch (...) { Debug::log(LOG, "Rule size failed, rule: {} -> {}", r.szRule, r.szValue); }