From 58833eb1d79d7f03402cee0730c309b79f2e4501 Mon Sep 17 00:00:00 2001 From: Vaxry <43317083+vaxerski@users.noreply.github.com> Date: Thu, 7 May 2026 15:21:06 +0100 Subject: layout/scrolling: handle fullscreen manually (#14190) Makes scroll handle fullscreen by itself, allowing for fs scrolls. --- src/desktop/Workspace.cpp | 19 ++++++++++++++++++- src/desktop/Workspace.hpp | 1 + src/desktop/state/FocusState.cpp | 3 +++ src/desktop/view/Window.cpp | 17 ++++++++++++----- src/desktop/view/Window.hpp | 17 ++++++++++++----- 5 files changed, 46 insertions(+), 11 deletions(-) (limited to 'src/desktop') diff --git a/src/desktop/Workspace.cpp b/src/desktop/Workspace.cpp index 23ea0dd7..6ff6d0b4 100644 --- a/src/desktop/Workspace.cpp +++ b/src/desktop/Workspace.cpp @@ -1,5 +1,6 @@ #include "Workspace.hpp" #include "view/Group.hpp" +#include "view/LayerSurface.hpp" #include "../Compositor.hpp" #include "../config/shared/animation/AnimationTree.hpp" #include "../config/shared/workspace/WorkspaceRuleManager.hpp" @@ -8,6 +9,7 @@ #include "../managers/EventManager.hpp" #include "../helpers/Monitor.hpp" #include "../layout/space/Space.hpp" +#include "../layout/target/Target.hpp" #include "../layout/supplementary/WorkspaceAlgoMatcher.hpp" #include "../event/EventBus.hpp" @@ -539,7 +541,10 @@ void CWorkspace::rename(const std::string& name) { } void CWorkspace::updateWindows() { - m_hasFullscreenWindow = std::ranges::any_of(m_space->targets(), [](const auto& t) { return t->fullscreenMode() != FSMODE_NONE; }); + m_hasFullscreenWindow = std::ranges::any_of(m_space->targets(), [](const auto& t) { return t && t->fullscreenMode() != FSMODE_NONE && !t->layoutManagedFullscreen(); }); + + if (!m_hasFullscreenWindow) + m_fullscreenMode = FSMODE_NONE; for (auto const& t : m_space->targets()) { if (t->window()) @@ -562,3 +567,15 @@ void CWorkspace::setPersistent(bool persistent) { bool CWorkspace::isPersistent() { return m_persistent; } + +void CWorkspace::setNoMembersAboveFullscreen() { + // make all windows and layers on the same workspace under the fullscreen window + for (auto const& w : g_pCompositor->m_windows) { + if (w->m_workspace == m_self && !w->isFullscreen() && !w->m_fadingOut && !w->m_pinned) + w->m_createdOverFullscreen = false; + } + for (auto const& ls : g_pCompositor->m_layers) { + if (ls->m_monitor == m_monitor) + ls->m_aboveFullscreen = false; + } +} diff --git a/src/desktop/Workspace.hpp b/src/desktop/Workspace.hpp index 1ccf1454..1abc80c0 100644 --- a/src/desktop/Workspace.hpp +++ b/src/desktop/Workspace.hpp @@ -80,6 +80,7 @@ class CWorkspace { void updateWindows(); void setPersistent(bool persistent); bool isPersistent(); + void setNoMembersAboveFullscreen(); struct { CSignalT<> destroy; diff --git a/src/desktop/state/FocusState.cpp b/src/desktop/state/FocusState.cpp index 5dd22f94..48fb6456 100644 --- a/src/desktop/state/FocusState.cpp +++ b/src/desktop/state/FocusState.cpp @@ -95,6 +95,9 @@ void CFocusState::rawWindowFocus(PHLWINDOW pWindow, eFocusReason reason, SP("input:follow_mouse"); static auto PSPECIALFALLTHROUGH = CConfigValue("input:special_fallthrough"); + if (pWindow == m_focusWindow && surface == m_focusSurface) + return; + if (!pWindow || !pWindow->priorityFocus()) { if (g_pSessionLockManager->isSessionLocked()) { Log::logger->log(Log::DEBUG, "Refusing a keyboard focus to a window because of a sessionlock"); diff --git a/src/desktop/view/Window.cpp b/src/desktop/view/Window.cpp index b2f4821b..19f8f88d 100644 --- a/src/desktop/view/Window.cpp +++ b/src/desktop/view/Window.cpp @@ -48,6 +48,7 @@ #include "../../managers/input/InputManager.hpp" #include "../../managers/PointerManager.hpp" #include "../../managers/animation/DesktopAnimationManager.hpp" +#include "../../layout/algorithm/Algorithm.hpp" #include "../../layout/space/Space.hpp" #include "../../layout/LayoutManager.hpp" #include "../../layout/target/WindowTarget.hpp" @@ -267,7 +268,7 @@ CBox CWindow::getWindowIdealBoundingBoxIgnoreReserved() { auto POS = m_position; auto SIZE = m_size; - if (isFullscreen()) { + if (isFullscreen() && (!layoutTarget() || !layoutTarget()->layoutManagedFullscreen())) { POS = PMONITOR->m_position; SIZE = PMONITOR->m_size; @@ -748,12 +749,12 @@ bool CWindow::isInputBlocked() const { return m_inputBlockReasons != INPUT_BLOCK_NONE; } -bool CWindow::isInputBlocked(eWindowInputBlockReason reason) const { - return (m_inputBlockReasons & sc(reason)) != 0; +bool CWindow::isInputBlocked(std::underlying_type_t reasons) const { + return (m_inputBlockReasons & reasons) != 0; } bool CWindow::isInputBlockedOnly(eWindowInputBlockReason reason) const { - return m_inputBlockReasons == sc(reason); + return m_inputBlockReasons == reason; } bool CWindow::acceptsInput() const { @@ -772,7 +773,13 @@ bool CWindow::isAllowedOverFullscreen() const { } bool CWindow::isBlockedByFullscreen() const { - if (!m_workspace || !m_workspace->m_hasFullscreenWindow) + if (!m_workspace) + return false; + + const auto ALGORITHM = m_workspace->m_space ? m_workspace->m_space->algorithm() : nullptr; + const bool HAS_LAYOUT_FULLSCREEN = ALGORITHM && ALGORITHM->layoutFullscreenCoversMonitor(); + + if (!m_workspace->m_hasFullscreenWindow && !HAS_LAYOUT_FULLSCREEN) return false; return !isAllowedOverFullscreen(); diff --git a/src/desktop/view/Window.hpp b/src/desktop/view/Window.hpp index 32a7bcfe..6174e694 100644 --- a/src/desktop/view/Window.hpp +++ b/src/desktop/view/Window.hpp @@ -89,11 +89,13 @@ namespace Desktop::View { WINDOW_ALPHA_LAST, }; - enum eWindowInputBlockReason : uint32_t { + enum eWindowInputBlockReason : uint8_t { INPUT_BLOCK_NONE = 0, - INPUT_BLOCK_GROUP_INACTIVE = 1 << 0, - INPUT_BLOCK_MONOCLE_INACTIVE = 1 << 1, - INPUT_BLOCK_BELOW_FULLSCREEN = 1 << 2, + INPUT_BLOCK_GROUP_INACTIVE = (1 << 0), + INPUT_BLOCK_MONOCLE_INACTIVE = (1 << 1), + INPUT_BLOCK_BELOW_FULLSCREEN = (1 << 2), + + INPUT_BLOCK_ALL = std::numeric_limits>::max(), }; struct SWindowActiveEvent { @@ -285,6 +287,11 @@ namespace Desktop::View { // For the noclosefor windowrule Time::steady_tp m_closeableSince = Time::steadyNow(); + // layout-settable flags. These are reset when layout changes. + struct { + bool cantLockCursor = false; + } m_layoutFlags; + // For the list lookup bool operator==(const CWindow& rhs) const { return m_xdgSurface == rhs.m_xdgSurface && m_xwaylandSurface == rhs.m_xwaylandSurface && m_position == rhs.m_position && m_size == rhs.m_size && @@ -314,7 +321,7 @@ namespace Desktop::View { bool isHidden() const; void setInputBlocked(eWindowInputBlockReason reason, bool blocked); bool isInputBlocked() const; - bool isInputBlocked(eWindowInputBlockReason reason) const; + bool isInputBlocked(std::underlying_type_t reasons) const; bool isInputBlockedOnly(eWindowInputBlockReason reason) const; bool acceptsInput() const; bool isAllowedOverFullscreen() const; -- cgit v1.2.3