1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-06-08 04:09:15 -04:00

refactor(frame): improve connected mode surface recovery

- share modal and launcher ownership handling
- recover missing background and blur layers
This commit is contained in:
purian23
2026-06-07 17:47:24 -04:00
parent 69f3dee25a
commit d08c7c5e55
9 changed files with 439 additions and 124 deletions
+83 -4
View File
@@ -45,6 +45,7 @@ PanelWindow {
readonly property int _windowRegionWidth: win._regionInt(win.width)
readonly property int _windowRegionHeight: win._regionInt(win.height)
readonly property string _screenName: win.targetScreen ? win.targetScreen.name : ""
readonly property int _surfaceRevision: Number(ConnectedModeState.surfaceRevisions[win._screenName] || 0)
readonly property var _dockState: ConnectedModeState.dockStates[win._screenName] || ConnectedModeState.emptyDockState
readonly property var _dockSlide: ConnectedModeState.dockSlides[win._screenName] || ({
"x": 0,
@@ -150,6 +151,8 @@ PanelWindow {
readonly property real _surfaceRadius: Theme.connectedSurfaceRadius
readonly property real _seamOverlap: Theme.hairline(win._dpr)
readonly property bool _disableLayer: Quickshell.env("DMS_DISABLE_LAYER") === "true" || Quickshell.env("DMS_DISABLE_LAYER") === "1"
property bool _surfaceRefreshNeedsLayerRecreate: false
property bool _surfaceLayerRecoveryActive: false
function _regionInt(value) {
return Math.max(0, Math.round(Theme.px(value, win._dpr)));
@@ -1187,12 +1190,14 @@ PanelWindow {
return (arcCorner === "topLeft" || arcCorner === "topRight") ? connectorY - r : connectorY + connectorHeight - r;
}
function _buildBlur() {
function _buildBlur(forceRepublish) {
try {
if (!BlurService.enabled || !SettingsData.frameBlurEnabled || !win._frameActive || !win.visible) {
win.BackgroundEffect.blurRegion = null;
return;
}
if (forceRepublish)
win.BackgroundEffect.blurRegion = null;
win.BackgroundEffect.blurRegion = _staticBlurRegion;
} catch (e) {
win.log.warn("Failed to set blur region:", e);
@@ -1216,7 +1221,54 @@ PanelWindow {
blurRebuildAction.schedule();
}
function _runBlurRebuild() {
_buildBlur();
_buildBlur(false);
}
function _republishFrameBlur() {
_buildBlur(true);
}
function _requestContentUpdate() {
try {
if (win.contentItem && typeof win.contentItem.update === "function")
win.contentItem.update();
} catch (e) {}
}
function _scheduleSurfaceRefresh(recreateLayer) {
if (recreateLayer)
_surfaceRefreshNeedsLayerRecreate = true;
surfaceRefreshAction.restart();
}
function _runSurfaceRefresh() {
if (!win.visible)
return;
if (_surfaceRefreshNeedsLayerRecreate) {
_surfaceRefreshNeedsLayerRecreate = false;
if (win._connectedActive && !win._disableLayer && (Theme.elevationEnabled || win._surfaceOpacity < 1)) {
_surfaceLayerRecoveryActive = true;
surfaceLayerRestoreAction.restart();
}
}
_requestContentUpdate();
_republishFrameBlur();
}
function _finishSurfaceLayerRecovery() {
_surfaceLayerRecoveryActive = false;
_requestContentUpdate();
_republishFrameBlur();
}
DeferredAction {
id: surfaceRefreshAction
onTriggered: win._runSurfaceRefresh()
}
DeferredAction {
id: surfaceLayerRestoreAction
onTriggered: win._finishSurfaceLayerRecovery()
}
Connections {
@@ -1263,14 +1315,41 @@ PanelWindow {
onVisibleChanged: {
if (visible) {
win._scheduleBlurRebuild();
win._scheduleSurfaceRefresh(false);
} else {
surfaceRefreshAction.cancel();
surfaceLayerRestoreAction.cancel();
_surfaceLayerRecoveryActive = false;
_surfaceRefreshNeedsLayerRecreate = false;
_teardownBlur();
}
}
Component.onCompleted: win._scheduleBlurRebuild()
on_SurfaceRevisionChanged: win._scheduleSurfaceRefresh(false)
onResourcesLost: {
blurRebuildAction.cancel();
surfaceRefreshAction.cancel();
surfaceLayerRestoreAction.cancel();
_surfaceRefreshNeedsLayerRecreate = true;
if (win._connectedActive && !win._disableLayer && (Theme.elevationEnabled || win._surfaceOpacity < 1))
_surfaceLayerRecoveryActive = true;
win._teardownBlur();
}
onWindowConnected: {
win._scheduleSurfaceRefresh(true);
win._scheduleBlurRebuild();
}
Component.onCompleted: {
win._scheduleBlurRebuild();
win._scheduleSurfaceRefresh(false);
}
Component.onDestruction: {
blurRebuildAction.cancel();
surfaceRefreshAction.cancel();
surfaceLayerRestoreAction.cancel();
win._teardownBlur();
}
@@ -1290,7 +1369,7 @@ PanelWindow {
visible: win._connectedActive
opacity: win._surfaceOpacity
// Skip FBO when disabled, invisible, or when neither elevation nor alpha blend is active
layer.enabled: win._connectedActive && !win._disableLayer && (Theme.elevationEnabled || win._surfaceOpacity < 1)
layer.enabled: win._connectedActive && !win._surfaceLayerRecoveryActive && !win._disableLayer && (Theme.elevationEnabled || win._surfaceOpacity < 1)
layer.smooth: false
layer.effect: MultiEffect {