fix(dock): hide overlay dock over fullscreen (#3224)

* fix(dock): hide overlay dock over fullscreen

* fix(dock): track fullscreen state declaratively

* fix(dock): clear overlay mask during fullscreen

* feat(dock): add fullscreen visibility option

* fix(dock): preserve auto-hide fullscreen behavior

* fix(dock): keep fullscreen mask interactive in overview

* fix(frame): host dock on overview without show dock
This commit is contained in:
Huỳnh Thiện Lộc
2026-08-30 14:36:34 -04:00
committed by GitHub
parent 393a54f7eb
commit 4cdfc53dcd
7 changed files with 63 additions and 1 deletions
+1
View File
@@ -872,6 +872,7 @@ Singleton {
property bool dockAutoHide: false
property bool dockSmartAutoHide: false
property bool dockUseOverlayLayer: false
property bool dockShowOnFullscreen: false
property bool dockGroupByApp: false
property bool dockSeparatePinnedAndRunningApps: false
property bool dockRestoreSpecialWorkspaceOnClick: false
@@ -436,6 +436,7 @@ var SPEC = {
dockAutoHide: { def: false },
dockSmartAutoHide: { def: false },
dockUseOverlayLayer: { def: false },
dockShowOnFullscreen: { def: false },
dockGroupByApp: { def: false },
dockSeparatePinnedAndRunningApps: { def: false },
dockRestoreSpecialWorkspaceOnClick: { def: false },
+9
View File
@@ -153,6 +153,8 @@ Item {
readonly property string _dockScreenName: dock.modelData ? dock.modelData.name : (dock.screen ? dock.screen.name : "")
readonly property bool usesConnectedFrameChrome: CompositorService.usesConnectedFrameChromeForScreen(dock._dockScreenName)
readonly property bool usesOverlayLayer: CompositorService.framePeerSurfacesUseOverlayForScreen(dock._dockScreenName) || SettingsData.dockUseOverlayLayer
readonly property bool fullscreenOnScreen: CompositorService.fullscreenToplevelOnScreen(dock._dockScreenName)
readonly property bool hiddenForFullscreen: usesOverlayLayer && fullscreenOnScreen && !SettingsData.dockShowOnFullscreen
readonly property bool geometryReady: dock.width > 0 && dock.height > 0 && dockBackground.width > 0 && dockBackground.height > 0
function _syncDockChromeState() {
@@ -364,6 +366,9 @@ Item {
return true;
}
if (hiddenForFullscreen)
return false;
// Smart auto-hide: show dock when no windows overlap, hide when they do
if (SettingsData.dockSmartAutoHide) {
if (shouldHideForWindows)
@@ -470,6 +475,8 @@ Item {
return expanded ? Math.min(bodyY - innerReach, dock.height - 1) : dock.height - 1;
}
width: {
if (dock.hiddenForFullscreen && !expanded)
return 0;
if (chrome)
return dockMouseArea.width + (isVertical && expanded ? animationHeadroom : 0) + (expanded ? borderThickness * 2 + dock.horizontalConnectorExtent * 2 : 0);
if (!isVertical)
@@ -479,6 +486,8 @@ Item {
return atEndEdge ? dock.width - x : Math.max(bodyX + dockBackground.width + innerReach, 1);
}
height: {
if (dock.hiddenForFullscreen && !expanded)
return 0;
if (chrome)
return dockMouseArea.height + (!isVertical && expanded ? animationHeadroom : 0) + (expanded ? borderThickness * 2 + dock.verticalConnectorExtent * 2 : 0);
if (isVertical)
+2 -1
View File
@@ -87,7 +87,8 @@ PanelWindow {
readonly property bool _connectedActive: CompositorService.usesConnectedFrameChromeForScreen(win.targetScreen)
readonly property bool _dockHostedHere: {
if (!win._connectedActive || !SettingsData.showDock || SettingsData.dockUseOverlayLayer)
const dockVisible = SettingsData.showDock || (CompositorService.isNiri && NiriService.inOverview && SettingsData.dockOpenOnOverview);
if (!win._connectedActive || !dockVisible || SettingsData.dockUseOverlayLayer)
return false;
const screens = SettingsData.getFilteredScreens("dock");
for (let i = 0; i < screens.length; i++) {
+10
View File
@@ -98,6 +98,16 @@ Item {
visible: SettingsData.showDock
onToggled: checked => SettingsData.set("dockUseOverlayLayer", checked)
}
SettingsToggleRow {
settingKey: "dockShowOnFullscreen"
tags: ["dock", "fullscreen", "overlay", "show", "visibility"]
text: I18n.tr("Show Dock Over Fullscreen", "dock visibility toggle")
description: I18n.tr("Keep the dock visible above fullscreen applications", "dock visibility toggle description")
checked: SettingsData.dockShowOnFullscreen
visible: SettingsData.showDock
onToggled: checked => SettingsData.set("dockShowOnFullscreen", checked)
}
}
SettingsCard {
+14
View File
@@ -526,6 +526,20 @@ Singleton {
return toplevels;
}
function fullscreenToplevelOnScreen(screenOrName) {
const screenName = _screenName(screenOrName);
if (!screenName || !ToplevelManager.toplevels?.values)
return false;
const toplevels = ToplevelManager.toplevels.values;
for (let i = 0; i < toplevels.length; i++) {
const toplevel = toplevels[i];
if (toplevel?.fullscreen && toplevel.activated && _toplevelOnScreen(toplevel, screenName))
return true;
}
return false;
}
function filterCurrentDisplay(toplevels, screenName) {
if (!toplevels || toplevels.length === 0 || !screenName)
return toplevels;
@@ -2252,6 +2252,32 @@
],
"description": "Display a dock with pinned and running applications"
},
{
"section": "dockShowOnFullscreen",
"label": "Show Dock Over Fullscreen",
"tabIndex": 5,
"category": "Dock",
"keywords": [
"above",
"app",
"applications",
"apps",
"dock",
"fullscreen",
"keep",
"launcher bar",
"over",
"overlay",
"panel",
"program",
"programs",
"show",
"taskbar",
"visibility",
"visible"
],
"description": "Keep the dock visible above fullscreen applications"
},
{
"section": "dockLauncherEnabled",
"label": "Show Launcher Button",