Keep tile preview effect inert

Nested KWin blacks out when this scene effect becomes visible. Leave the effect disabled and let the tiling script own swap and restore outlines.
This commit is contained in:
Marco Allegretti 2026-05-20 09:38:22 +02:00
parent f2f6f6f890
commit 40beabede9

View file

@ -8,15 +8,12 @@ import org.kde.plasma.private.mobileshell.shellsettingsplugin as ShellSettings
KWinComponents.SceneEffect { KWinComponents.SceneEffect {
id: effect id: effect
visible: ShellSettings.Settings.convergenceModeEnabled visible: false
&& !ShellSettings.Settings.gamingModeEnabled
&& ShellSettings.Settings.dynamicTilingEnabled
readonly property int outerGap: 8 readonly property int outerGap: 8
readonly property int floatEscapeMargin: 32 readonly property int floatEscapeMargin: 32
readonly property int previewAnimationDuration: 180 readonly property int previewAnimationDuration: 180
readonly property int previewFadeDuration: 110 readonly property int previewFadeDuration: 110
readonly property real insertIntentDeadZone: 0.18
property var dragConnectedWindows: ({}) property var dragConnectedWindows: ({})
property var draggingWindow: null property var draggingWindow: null
@ -85,50 +82,6 @@ KWinComponents.SceneEffect {
return !rectContainsPoint(expandedArea, cursor); return !rectContainsPoint(expandedArea, cursor);
} }
function splitRect(geometry, orientation) {
if (orientation === "vertical") {
const firstWidth = Math.round(geometry.width * 0.5);
return [
Qt.rect(geometry.x, geometry.y, firstWidth, geometry.height),
Qt.rect(geometry.x + firstWidth, geometry.y, geometry.width - firstWidth, geometry.height)
];
}
const firstHeight = Math.round(geometry.height * 0.5);
return [
Qt.rect(geometry.x, geometry.y, geometry.width, firstHeight),
Qt.rect(geometry.x, geometry.y + firstHeight, geometry.width, geometry.height - firstHeight)
];
}
function insertDirection(cursor, geometry) {
const relativeX = (cursor.x - geometry.x) / geometry.width;
const relativeY = (cursor.y - geometry.y) / geometry.height;
const fromCenterX = relativeX - 0.5;
const fromCenterY = relativeY - 0.5;
if (Math.abs(fromCenterX) < insertIntentDeadZone && Math.abs(fromCenterY) < insertIntentDeadZone) {
return "";
}
if (Math.abs(fromCenterX) >= Math.abs(fromCenterY)) {
return fromCenterX < 0 ? "left" : "right";
}
return fromCenterY < 0 ? "up" : "down";
}
function previewRectFor(cursor, targetGeometry) {
const direction = insertDirection(cursor, targetGeometry);
if (direction === "") {
return null;
}
const orientation = direction === "left" || direction === "right" ? "vertical" : "horizontal";
const splitGeometries = splitRect(targetGeometry, orientation);
if (direction === "left" || direction === "up") {
return splitGeometries[0];
}
return splitGeometries[1];
}
function findTileAtCursor(cursor, ignoredWindow) { function findTileAtCursor(cursor, ignoredWindow) {
const ignoredKey = windowKey(ignoredWindow); const ignoredKey = windowKey(ignoredWindow);
const windows = KWinComponents.Workspace.windows; const windows = KWinComponents.Workspace.windows;
@ -172,31 +125,14 @@ KWinComponents.SceneEffect {
} }
function showPreview(mode, geometry, screenName) { function showPreview(mode, geometry, screenName) {
if (!validRect(geometry) || screenName === "") { hidePreview();
hidePreview();
return;
}
if (!previewVisible || previewScreenName !== screenName) {
animatePreview = false;
previewGeometry = insetPreviewGeometry(geometry);
previewMode = mode;
previewScreenName = screenName;
previewVisible = true;
enableAnimationTimer.restart();
return;
}
previewMode = mode;
previewScreenName = screenName;
previewGeometry = insetPreviewGeometry(geometry);
previewVisible = true;
} }
function hidePreview() { function hidePreview() {
previewVisible = false; previewVisible = false;
draggingWindow = null; draggingWindow = null;
dragSourceGeometry = Qt.rect(0, 0, 0, 0); dragSourceGeometry = Qt.rect(0, 0, 0, 0);
disableEffectTimer.restart();
} }
function updatePreview(window, dragGeometry) { function updatePreview(window, dragGeometry) {
@ -208,11 +144,8 @@ KWinComponents.SceneEffect {
const cursor = KWinComponents.Workspace.cursorPos; const cursor = KWinComponents.Workspace.cursorPos;
const targetGeometry = findTileAtCursor(cursor, window); const targetGeometry = findTileAtCursor(cursor, window);
if (targetGeometry) { if (targetGeometry) {
const insertGeometry = previewRectFor(cursor, targetGeometry); showPreview("swap", targetGeometry, window.output.name);
if (validRect(insertGeometry)) { return;
showPreview("insert", insertGeometry, window.output.name);
return;
}
} }
if (outsideWorkArea(window, cursor)) { if (outsideWorkArea(window, cursor)) {
@ -282,6 +215,17 @@ KWinComponents.SceneEffect {
onTriggered: effect.animatePreview = true onTriggered: effect.animatePreview = true
} }
Timer {
id: disableEffectTimer
interval: effect.previewFadeDuration
repeat: false
onTriggered: {
if (!effect.previewVisible) {
effect.visible = false;
}
}
}
Connections { Connections {
target: KWinComponents.Workspace target: KWinComponents.Workspace