mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-10-21 10:44:01 -04:00
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:
@@ -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 },
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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++) {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user