summaryrefslogtreecommitdiff
path: root/src/desktop
diff options
context:
space:
mode:
authorVaxry <43317083+vaxerski@users.noreply.github.com>2026-05-07 15:21:06 +0100
committerGitHub <noreply@github.com>2026-05-07 15:21:06 +0100
commit58833eb1d79d7f03402cee0730c309b79f2e4501 (patch)
tree180cadc5d2e6fcb9e2f090eeccc6fb4ccace9b51 /src/desktop
parent6b8b20100253c083227e611be20360f4d8e7794e (diff)
layout/scrolling: handle fullscreen manually (#14190)
Makes scroll handle fullscreen by itself, allowing for fs scrolls.
Diffstat (limited to 'src/desktop')
-rw-r--r--src/desktop/Workspace.cpp19
-rw-r--r--src/desktop/Workspace.hpp1
-rw-r--r--src/desktop/state/FocusState.cpp3
-rw-r--r--src/desktop/view/Window.cpp17
-rw-r--r--src/desktop/view/Window.hpp17
5 files changed, 46 insertions, 11 deletions
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<CWLS
static auto PFOLLOWMOUSE = CConfigValue<Config::INTEGER>("input:follow_mouse");
static auto PSPECIALFALLTHROUGH = CConfigValue<Config::INTEGER>("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<uint32_t>(reason)) != 0;
+bool CWindow::isInputBlocked(std::underlying_type_t<eWindowInputBlockReason> reasons) const {
+ return (m_inputBlockReasons & reasons) != 0;
}
bool CWindow::isInputBlockedOnly(eWindowInputBlockReason reason) const {
- return m_inputBlockReasons == sc<uint32_t>(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<std::underlying_type_t<eWindowInputBlockReason>>::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<eWindowInputBlockReason> reasons) const;
bool isInputBlockedOnly(eWindowInputBlockReason reason) const;
bool acceptsInput() const;
bool isAllowedOverFullscreen() const;