diff options
| author | Vaxry <vaxry@vaxry.net> | 2026-04-29 18:51:19 +0100 |
|---|---|---|
| committer | Vaxry <43317083+vaxerski@users.noreply.github.com> | 2026-04-29 22:05:32 +0100 |
| commit | 31e025dbe04dbe1836ea759f6b6e2ea09591fb23 (patch) | |
| tree | 7b810a935febc522179d332786312c5d26e1ffa7 /src/desktop/view/Window.cpp | |
| parent | 55a1611fd8150d7bb8d1b6e2b8cc95ffccf31ea2 (diff) | |
desktop/window: refactor over fullscreen state
Diffstat (limited to 'src/desktop/view/Window.cpp')
| -rw-r--r-- | src/desktop/view/Window.cpp | 50 |
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; } |
