summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorItsOhen <TNordfeldt@gmail.com>2026-03-17 17:43:53 +0100
committerGitHub <noreply@github.com>2026-03-17 12:43:53 -0400
commit9f599e316504943eec5d2fa854f7c99c575616b7 (patch)
tree58041f7feb19ca8e022ae3639524b7c51ef05427 /src
parent35ef8dc1f7abb3e7139de5f8831ca2b0d81da78c (diff)
window/rules: add scrolling_width (#13754)
Diffstat (limited to 'src')
-rw-r--r--src/desktop/rule/windowRule/WindowRuleApplicator.cpp6
-rw-r--r--src/desktop/rule/windowRule/WindowRuleApplicator.hpp1
-rw-r--r--src/desktop/rule/windowRule/WindowRuleEffectContainer.cpp3
-rw-r--r--src/desktop/rule/windowRule/WindowRuleEffectContainer.hpp3
-rw-r--r--src/desktop/view/Window.cpp4
-rw-r--r--src/layout/algorithm/tiled/scrolling/ScrollingAlgorithm.cpp13
-rw-r--r--src/layout/algorithm/tiled/scrolling/ScrollingAlgorithm.hpp4
7 files changed, 22 insertions, 12 deletions
diff --git a/src/desktop/rule/windowRule/WindowRuleApplicator.cpp b/src/desktop/rule/windowRule/WindowRuleApplicator.cpp
index dd0e7fb8..bb2499e7 100644
--- a/src/desktop/rule/windowRule/WindowRuleApplicator.cpp
+++ b/src/desktop/rule/windowRule/WindowRuleApplicator.cpp
@@ -541,6 +541,12 @@ CWindowRuleApplicator::SRuleResult CWindowRuleApplicator::applyStaticRule(const
} catch (...) { Log::logger->log(Log::ERR, "CWindowRuleApplicator::applyStaticRule: invalid no close for {}", effect); }
break;
}
+ case WINDOW_RULE_EFFECT_SCROLLING_WIDTH: {
+ try {
+ static_.scrollingWidth = std::stof(effect);
+ } catch (...) { Log::logger->log(Log::ERR, "CWindowRuleApplicator::applyStaticRule: invalid scrolling width {}", effect); }
+ break;
+ }
}
}
diff --git a/src/desktop/rule/windowRule/WindowRuleApplicator.hpp b/src/desktop/rule/windowRule/WindowRuleApplicator.hpp
index 8bcf7008..e7cf15f9 100644
--- a/src/desktop/rule/windowRule/WindowRuleApplicator.hpp
+++ b/src/desktop/rule/windowRule/WindowRuleApplicator.hpp
@@ -54,6 +54,7 @@ namespace Desktop::Rule {
std::optional<int> noCloseFor;
std::string size, position;
+ std::optional<float> scrollingWidth;
std::vector<std::string> suppressEvent;
} static_;
diff --git a/src/desktop/rule/windowRule/WindowRuleEffectContainer.cpp b/src/desktop/rule/windowRule/WindowRuleEffectContainer.cpp
index 660bf871..66867247 100644
--- a/src/desktop/rule/windowRule/WindowRuleEffectContainer.cpp
+++ b/src/desktop/rule/windowRule/WindowRuleEffectContainer.cpp
@@ -28,6 +28,7 @@ static const std::vector<std::string> EFFECT_STRINGS = {
"suppress_event", //
"content", //
"no_close_for", //
+ "scrolling_width", //
"rounding", //
"rounding_power", //
"persistent_size", //
@@ -69,7 +70,7 @@ static const std::vector<std::string> EFFECT_STRINGS = {
// This is here so that if we change the rules, we get reminded to update
// the strings.
-static_assert(WINDOW_RULE_EFFECT_LAST_STATIC == 54);
+static_assert(WINDOW_RULE_EFFECT_LAST_STATIC == 55);
CWindowRuleEffectContainer::CWindowRuleEffectContainer() : IEffectContainer<eWindowRuleEffect>(std::vector<std::string>{EFFECT_STRINGS}) {
;
diff --git a/src/desktop/rule/windowRule/WindowRuleEffectContainer.hpp b/src/desktop/rule/windowRule/WindowRuleEffectContainer.hpp
index 0827d462..af861109 100644
--- a/src/desktop/rule/windowRule/WindowRuleEffectContainer.hpp
+++ b/src/desktop/rule/windowRule/WindowRuleEffectContainer.hpp
@@ -27,6 +27,7 @@ namespace Desktop::Rule {
WINDOW_RULE_EFFECT_SUPPRESSEVENT,
WINDOW_RULE_EFFECT_CONTENT,
WINDOW_RULE_EFFECT_NOCLOSEFOR,
+ WINDOW_RULE_EFFECT_SCROLLING_WIDTH,
// dynamic
WINDOW_RULE_EFFECT_ROUNDING,
@@ -76,4 +77,4 @@ namespace Desktop::Rule {
};
SP<CWindowRuleEffectContainer> windowEffects();
-}; \ No newline at end of file
+};
diff --git a/src/desktop/view/Window.cpp b/src/desktop/view/Window.cpp
index 00d32a47..2f87cc0f 100644
--- a/src/desktop/view/Window.cpp
+++ b/src/desktop/view/Window.cpp
@@ -1770,8 +1770,8 @@ void CWindow::mapWindow() {
if (m_ruleApplicator->static_.fullscreenStateClient || m_ruleApplicator->static_.fullscreenStateInternal) {
requestedFSState = Desktop::View::SFullscreenState{
- .internal = sc<eFullscreenMode>(m_ruleApplicator->static_.fullscreenStateInternal.value_or(0)),
- .client = sc<eFullscreenMode>(m_ruleApplicator->static_.fullscreenStateClient.value_or(0)),
+ .internal = sc<eFullscreenMode>(m_ruleApplicator->static_.fullscreenStateInternal.value_or(0)),
+ .client = sc<eFullscreenMode>(m_ruleApplicator->static_.fullscreenStateClient.value_or(0)),
};
}
diff --git a/src/layout/algorithm/tiled/scrolling/ScrollingAlgorithm.cpp b/src/layout/algorithm/tiled/scrolling/ScrollingAlgorithm.cpp
index 5de27b97..8a5b2d59 100644
--- a/src/layout/algorithm/tiled/scrolling/ScrollingAlgorithm.cpp
+++ b/src/layout/algorithm/tiled/scrolling/ScrollingAlgorithm.cpp
@@ -304,22 +304,22 @@ SScrollingData::SScrollingData(CScrollingAlgorithm* algo) : algorithm(algo) {
controller = makeUnique<CScrollTapeController>(SCROLL_DIR_RIGHT);
}
-SP<SColumnData> SScrollingData::add() {
+SP<SColumnData> SScrollingData::add(std::optional<float> width) {
auto col = columns.emplace_back(makeShared<SColumnData>(self.lock()));
col->self = col;
- size_t stripIdx = controller->addStrip(algorithm->defaultColumnWidth());
+ size_t stripIdx = controller->addStrip(width.value_or(algorithm->defaultColumnWidth()));
controller->getStrip(stripIdx).userData = col;
return col;
}
-SP<SColumnData> SScrollingData::add(int after) {
+SP<SColumnData> SScrollingData::add(int after, std::optional<float> width) {
auto col = makeShared<SColumnData>(self.lock());
col->self = col;
columns.insert(columns.begin() + after + 1, col);
- controller->insertStrip(after, algorithm->defaultColumnWidth());
+ controller->insertStrip(after, width.value_or(algorithm->defaultColumnWidth()));
controller->getStrip(after + 1).userData = col;
return col;
@@ -594,9 +594,10 @@ void CScrollingAlgorithm::newTarget(SP<ITarget> target) {
SP<SScrollingTargetData> droppingData = droppingOn ? dataFor(droppingOn->layoutTarget()) : nullptr;
SP<SColumnData> droppingColumn = droppingData ? droppingData->column.lock() : nullptr;
+ const auto width = target->window()->m_ruleApplicator->static_.scrollingWidth;
if (!droppingColumn) {
- auto col = m_scrollingData->add();
+ auto col = m_scrollingData->add(width);
col->add(target);
m_scrollingData->fitCol(col);
} else {
@@ -610,7 +611,7 @@ void CScrollingAlgorithm::newTarget(SP<ITarget> target) {
m_scrollingData->fitCol(droppingColumn);
} else {
auto idx = m_scrollingData->idx(droppingColumn);
- auto col = idx == -1 ? m_scrollingData->add() : m_scrollingData->add(idx);
+ auto col = idx == -1 ? m_scrollingData->add(width) : m_scrollingData->add(idx, width);
col->add(target);
m_scrollingData->fitCol(col);
}
diff --git a/src/layout/algorithm/tiled/scrolling/ScrollingAlgorithm.hpp b/src/layout/algorithm/tiled/scrolling/ScrollingAlgorithm.hpp
index d95b3197..1b2b1d1e 100644
--- a/src/layout/algorithm/tiled/scrolling/ScrollingAlgorithm.hpp
+++ b/src/layout/algorithm/tiled/scrolling/ScrollingAlgorithm.hpp
@@ -68,8 +68,8 @@ namespace Layout::Tiled {
UP<CScrollTapeController> controller;
- SP<SColumnData> add();
- SP<SColumnData> add(int after);
+ SP<SColumnData> add(std::optional<float> width = std::nullopt);
+ SP<SColumnData> add(int after, std::optional<float> width = std::nullopt);
int64_t idx(SP<SColumnData> c);
void remove(SP<SColumnData> c);
double maxWidth();