summaryrefslogtreecommitdiff
path: root/src/layout/algorithm/tiled
diff options
context:
space:
mode:
Diffstat (limited to 'src/layout/algorithm/tiled')
-rw-r--r--src/layout/algorithm/tiled/dwindle/DwindleAlgorithm.cpp2
-rw-r--r--src/layout/algorithm/tiled/dwindle/DwindleAlgorithm.hpp2
-rw-r--r--src/layout/algorithm/tiled/master/MasterAlgorithm.cpp2
-rw-r--r--src/layout/algorithm/tiled/master/MasterAlgorithm.hpp2
-rw-r--r--src/layout/algorithm/tiled/monocle/MonocleAlgorithm.cpp2
-rw-r--r--src/layout/algorithm/tiled/monocle/MonocleAlgorithm.hpp2
-rw-r--r--src/layout/algorithm/tiled/scrolling/ScrollingAlgorithm.cpp25
-rw-r--r--src/layout/algorithm/tiled/scrolling/ScrollingAlgorithm.hpp4
8 files changed, 28 insertions, 13 deletions
diff --git a/src/layout/algorithm/tiled/dwindle/DwindleAlgorithm.cpp b/src/layout/algorithm/tiled/dwindle/DwindleAlgorithm.cpp
index 100856be..ff1b1b4f 100644
--- a/src/layout/algorithm/tiled/dwindle/DwindleAlgorithm.cpp
+++ b/src/layout/algorithm/tiled/dwindle/DwindleAlgorithm.cpp
@@ -488,7 +488,7 @@ void CDwindleAlgorithm::swapTargets(SP<ITarget> a, SP<ITarget> b) {
nodeB->pTarget = a;
}
-void CDwindleAlgorithm::recalculate() {
+void CDwindleAlgorithm::recalculate(eRecalculateReason reason) {
calculateWorkspace();
}
diff --git a/src/layout/algorithm/tiled/dwindle/DwindleAlgorithm.hpp b/src/layout/algorithm/tiled/dwindle/DwindleAlgorithm.hpp
index 300daa63..cf544089 100644
--- a/src/layout/algorithm/tiled/dwindle/DwindleAlgorithm.hpp
+++ b/src/layout/algorithm/tiled/dwindle/DwindleAlgorithm.hpp
@@ -35,7 +35,7 @@ namespace Layout::Tiled {
virtual void removeTarget(SP<ITarget> target);
virtual void resizeTarget(const Vector2D& Δ, SP<ITarget> target, eRectCorner corner = CORNER_NONE);
- virtual void recalculate();
+ virtual void recalculate(eRecalculateReason reason = RECALCULATE_REASON_UNKNOWN);
virtual SP<ITarget> getNextCandidate(SP<ITarget> old);
diff --git a/src/layout/algorithm/tiled/master/MasterAlgorithm.cpp b/src/layout/algorithm/tiled/master/MasterAlgorithm.cpp
index c57a3639..b4d4eea1 100644
--- a/src/layout/algorithm/tiled/master/MasterAlgorithm.cpp
+++ b/src/layout/algorithm/tiled/master/MasterAlgorithm.cpp
@@ -424,7 +424,7 @@ void CMasterAlgorithm::moveTargetInDirection(SP<ITarget> t, Math::eDirection dir
}
}
-void CMasterAlgorithm::recalculate() {
+void CMasterAlgorithm::recalculate(eRecalculateReason reason) {
calculateWorkspace();
}
diff --git a/src/layout/algorithm/tiled/master/MasterAlgorithm.hpp b/src/layout/algorithm/tiled/master/MasterAlgorithm.hpp
index 00e82784..b29542c6 100644
--- a/src/layout/algorithm/tiled/master/MasterAlgorithm.hpp
+++ b/src/layout/algorithm/tiled/master/MasterAlgorithm.hpp
@@ -53,7 +53,7 @@ namespace Layout::Tiled {
virtual void removeTarget(SP<ITarget> target);
virtual void resizeTarget(const Vector2D& Δ, SP<ITarget> target, eRectCorner corner = CORNER_NONE);
- virtual void recalculate();
+ virtual void recalculate(eRecalculateReason reason = RECALCULATE_REASON_UNKNOWN);
virtual SP<ITarget> getNextCandidate(SP<ITarget> old);
diff --git a/src/layout/algorithm/tiled/monocle/MonocleAlgorithm.cpp b/src/layout/algorithm/tiled/monocle/MonocleAlgorithm.cpp
index 84b4f9e2..e619bf57 100644
--- a/src/layout/algorithm/tiled/monocle/MonocleAlgorithm.cpp
+++ b/src/layout/algorithm/tiled/monocle/MonocleAlgorithm.cpp
@@ -125,7 +125,7 @@ void CMonocleAlgorithm::resizeTarget(const Vector2D& Δ, SP<ITarget> target, eRe
// monocle layout doesn't support manual resizing, all windows are fullscreen
}
-void CMonocleAlgorithm::recalculate() {
+void CMonocleAlgorithm::recalculate(eRecalculateReason reason) {
if (m_targetDatas.empty())
return;
diff --git a/src/layout/algorithm/tiled/monocle/MonocleAlgorithm.hpp b/src/layout/algorithm/tiled/monocle/MonocleAlgorithm.hpp
index 3f07748b..072f9cf0 100644
--- a/src/layout/algorithm/tiled/monocle/MonocleAlgorithm.hpp
+++ b/src/layout/algorithm/tiled/monocle/MonocleAlgorithm.hpp
@@ -26,7 +26,7 @@ namespace Layout::Tiled {
virtual void removeTarget(SP<ITarget> target);
virtual void resizeTarget(const Vector2D& Δ, SP<ITarget> target, eRectCorner corner = CORNER_NONE);
- virtual void recalculate();
+ virtual void recalculate(eRecalculateReason reason = RECALCULATE_REASON_UNKNOWN);
virtual SP<ITarget> getNextCandidate(SP<ITarget> old);
diff --git a/src/layout/algorithm/tiled/scrolling/ScrollingAlgorithm.cpp b/src/layout/algorithm/tiled/scrolling/ScrollingAlgorithm.cpp
index 613ebe19..842e5b85 100644
--- a/src/layout/algorithm/tiled/scrolling/ScrollingAlgorithm.cpp
+++ b/src/layout/algorithm/tiled/scrolling/ScrollingAlgorithm.cpp
@@ -601,7 +601,16 @@ CScrollingAlgorithm::CScrollingAlgorithm() {
if (!TARGET || TARGET->floating())
return;
- focusOnInput(TARGET, reason == Desktop::FOCUS_REASON_CLICK ? INPUT_MODE_CLICK : (Desktop::isHardInputFocusReason(reason) ? INPUT_MODE_KB : INPUT_MODE_SOFT));
+ // if follow_focus != 0, focuswindow always moves scrolling view
+ // if follow_focus != 0, change in a group's current window state always moves scrolling view
+ // if follow_focus != 0, moving a window into group via the corresponding dispatches `moveintogroup`, `movewindoworgroup` always moves scrolling view
+ // if follow_focus != 0, moving focus via dispatches that cause switching to a specific window via calling switchToWindow(), such as movefocus, cyclenext, focuscurrentor(last/urgent); always moves scrolling view
+ if (*PFOLLOW_FOCUS &&
+ (reason == Desktop::FOCUS_REASON_DISPATCH_FOCUSWINDOW || reason == Desktop::FOCUS_REASON_GROUP_CURRENT_WINDOW_CHANGE ||
+ reason == Desktop::FOCUS_REASON_DISPATCH_MOVEWINDOWINTOGROUP || reason == Desktop::FOCUS_REASON_SWITCH_TO_WINDOW_SOFT))
+ focusOnInput(TARGET, INPUT_MODE_HARD);
+ else
+ focusOnInput(TARGET, reason == Desktop::FOCUS_REASON_CLICK ? INPUT_MODE_CLICK : (Desktop::isHardInputFocusReason(reason) ? INPUT_MODE_HARD : INPUT_MODE_SOFT));
});
// Initialize default widths and direction
@@ -645,7 +654,7 @@ void CScrollingAlgorithm::focusOnInput(SP<ITarget> target, eInputMode input) {
}
// if we moved via non-kb, and it's fully visible, ignore
- if (m_scrollingData->visible(TARGETDATA->column.lock(), true) && input != INPUT_MODE_KB)
+ if (m_scrollingData->visible(TARGETDATA->column.lock(), true) && input != INPUT_MODE_HARD)
return;
static const auto PFITMETHOD = CConfigValue<Config::INTEGER>("scrolling:focus_fit_method");
@@ -867,7 +876,7 @@ void CScrollingAlgorithm::resizeTarget(const Vector2D& delta, SP<ITarget> target
m_scrollingData->recalculate(true);
}
-void CScrollingAlgorithm::recalculate() {
+void CScrollingAlgorithm::recalculate(eRecalculateReason reason) {
// guard against recalculation during transitional monitor states
// (e.g. monitor reconnecting after suspend where workspace/monitor may not be ready)
if (!m_parent || !m_parent->space() || !m_parent->space()->workspace() || !m_parent->space()->workspace()->m_monitor)
@@ -878,8 +887,14 @@ void CScrollingAlgorithm::recalculate() {
const auto TARGETDATA = dataFor(TARGET);
- if (TARGETDATA && !m_scrollingData->visible(TARGETDATA->column.lock(), true))
- focusOnInput(Desktop::focusState()->window()->layoutTarget(), INPUT_MODE_KB);
+ if (TARGETDATA && !m_scrollingData->visible(TARGETDATA->column.lock(), true)) {
+
+ /* guard against unwanted scrolling viewport moves - If recalculate() was called, it is assumed that either the INPUT_MODE will be HARD (i.e. it is meant to move the scrolling viewport) or
+ it is not meant to move the scrolling viewport.
+ (e.g. changing workspace to a scrolling layout workspace fits the focused window in that workspace into view) */
+ if (Layout::isHardRecalculateReason(reason))
+ focusOnInput(Desktop::focusState()->window()->layoutTarget(), INPUT_MODE_HARD);
+ }
}
m_scrollingData->recalculate();
diff --git a/src/layout/algorithm/tiled/scrolling/ScrollingAlgorithm.hpp b/src/layout/algorithm/tiled/scrolling/ScrollingAlgorithm.hpp
index a7c64aa8..867b86e8 100644
--- a/src/layout/algorithm/tiled/scrolling/ScrollingAlgorithm.hpp
+++ b/src/layout/algorithm/tiled/scrolling/ScrollingAlgorithm.hpp
@@ -100,7 +100,7 @@ namespace Layout::Tiled {
virtual void removeTarget(SP<ITarget> target);
virtual void resizeTarget(const Vector2D& Δ, SP<ITarget> target, eRectCorner corner = CORNER_NONE);
- virtual void recalculate();
+ virtual void recalculate(eRecalculateReason reason = RECALCULATE_REASON_UNKNOWN);
virtual SP<ITarget> getNextCandidate(SP<ITarget> old);
@@ -131,7 +131,7 @@ namespace Layout::Tiled {
enum eInputMode : uint8_t {
INPUT_MODE_SOFT = 0,
INPUT_MODE_CLICK,
- INPUT_MODE_KB
+ INPUT_MODE_HARD
};
private: