summaryrefslogtreecommitdiff
path: root/src/desktop/view/Window.cpp
diff options
context:
space:
mode:
authorVaxry <vaxry@vaxry.net>2026-04-29 18:51:19 +0100
committerVaxry <43317083+vaxerski@users.noreply.github.com>2026-04-29 22:05:32 +0100
commit31e025dbe04dbe1836ea759f6b6e2ea09591fb23 (patch)
tree7b810a935febc522179d332786312c5d26e1ffa7 /src/desktop/view/Window.cpp
parent55a1611fd8150d7bb8d1b6e2b8cc95ffccf31ea2 (diff)
desktop/window: refactor over fullscreen state
Diffstat (limited to 'src/desktop/view/Window.cpp')
-rw-r--r--src/desktop/view/Window.cpp50
1 files changed, 49 insertions, 1 deletions
diff --git a/src/desktop/view/Window.cpp b/src/desktop/view/Window.cpp
index 73c4378d..b2f4821b 100644
--- a/src/desktop/view/Window.cpp
+++ b/src/desktop/view/Window.cpp
@@ -512,6 +512,8 @@ void CWindow::moveToWorkspace(PHLWORKSPACE pWorkspace) {
}
m_workspace = pWorkspace;
+ updateFullscreenInputState();
+ *alpha(WINDOW_ALPHA_FULLSCREEN) = isBlockedByFullscreen() ? 0.F : 1.F;
setAnimationsToMove();
@@ -750,10 +752,44 @@ bool CWindow::isInputBlocked(eWindowInputBlockReason reason) const {
return (m_inputBlockReasons & sc<uint32_t>(reason)) != 0;
}
+bool CWindow::isInputBlockedOnly(eWindowInputBlockReason reason) const {
+ return m_inputBlockReasons == sc<uint32_t>(reason);
+}
+
bool CWindow::acceptsInput() const {
return !isHidden() && !isInputBlocked();
}
+bool CWindow::isAllowedOverFullscreen() const {
+ if (isFullscreen() || m_pinned || m_createdOverFullscreen)
+ return true;
+
+ if (!m_workspace)
+ return false;
+
+ const auto FSWINDOW = m_workspace->getFullscreenWindow();
+ return FSWINDOW && FSWINDOW->m_group && FSWINDOW->m_group->has(m_self.lock());
+}
+
+bool CWindow::isBlockedByFullscreen() const {
+ if (!m_workspace || !m_workspace->m_hasFullscreenWindow)
+ return false;
+
+ return !isAllowedOverFullscreen();
+}
+
+bool CWindow::isFadingOutUnderFullscreen() const {
+ return isBlockedByFullscreen() && alpha(WINDOW_ALPHA_FULLSCREEN)->isBeingAnimated() && alphaValue(WINDOW_ALPHA_FULLSCREEN) > 0.F;
+}
+
+bool CWindow::shouldRenderOverFullscreen() const {
+ return isAllowedOverFullscreen() || isFadingOutUnderFullscreen();
+}
+
+void CWindow::updateFullscreenInputState() {
+ setInputBlocked(INPUT_BLOCK_BELOW_FULLSCREEN, isBlockedByFullscreen());
+}
+
PHLANIMVAR<float>& CWindow::alpha(eWindowAlpha type) {
return m_alpha.get(type);
}
@@ -774,6 +810,10 @@ float CWindow::alphaTotal() const {
return m_alpha.getTotal();
}
+float CWindow::alphaTotalGoal() const {
+ return m_alpha.getTotalGoal();
+}
+
float CWindow::alphaTotalWithout(eWindowAlpha type) const {
return m_alpha.getTotalWithout(type);
}
@@ -786,6 +826,14 @@ bool CWindow::visibleByAlpha() const {
return effectiveAlpha() != 0.F;
}
+bool CWindow::visibleByAlphaGoal() const {
+ return alphaTotalGoal() != 0.F;
+}
+
+bool CWindow::targetVisible() const {
+ return !m_hidden && ((m_isMapped && m_wlSurface && m_wlSurface->resource()) || m_fadingOut) && visibleByAlphaGoal();
+}
+
// check if the point is "hidden" under a rounded corner of the window
// it is assumed that the point is within the real window box (m_vRealPosition, m_vRealSize)
// otherwise behaviour is undefined
@@ -1040,7 +1088,7 @@ bool CWindow::clampWindowSize(const std::optional<Vector2D> minSize, const std::
return changed;
}
-bool CWindow::isFullscreen() {
+bool CWindow::isFullscreen() const {
return m_fullscreenState.internal != FSMODE_NONE;
}