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 {
id: effect
visible: ShellSettings.Settings.convergenceModeEnabled
&& !ShellSettings.Settings.gamingModeEnabled
&& ShellSettings.Settings.dynamicTilingEnabled
visible: false
readonly property int outerGap: 8
readonly property int floatEscapeMargin: 32
readonly property int previewAnimationDuration: 180
readonly property int previewFadeDuration: 110
readonly property real insertIntentDeadZone: 0.18
property var dragConnectedWindows: ({})
property var draggingWindow: null
@ -85,50 +82,6 @@ KWinComponents.SceneEffect {
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) {
const ignoredKey = windowKey(ignoredWindow);
const windows = KWinComponents.Workspace.windows;
@ -172,31 +125,14 @@ KWinComponents.SceneEffect {
}
function showPreview(mode, geometry, screenName) {
if (!validRect(geometry) || screenName === "") {
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;
hidePreview();
}
function hidePreview() {
previewVisible = false;
draggingWindow = null;
dragSourceGeometry = Qt.rect(0, 0, 0, 0);
disableEffectTimer.restart();
}
function updatePreview(window, dragGeometry) {
@ -208,11 +144,8 @@ KWinComponents.SceneEffect {
const cursor = KWinComponents.Workspace.cursorPos;
const targetGeometry = findTileAtCursor(cursor, window);
if (targetGeometry) {
const insertGeometry = previewRectFor(cursor, targetGeometry);
if (validRect(insertGeometry)) {
showPreview("insert", insertGeometry, window.output.name);
return;
}
showPreview("swap", targetGeometry, window.output.name);
return;
}
if (outsideWorkArea(window, cursor)) {
@ -282,6 +215,17 @@ KWinComponents.SceneEffect {
onTriggered: effect.animatePreview = true
}
Timer {
id: disableEffectTimer
interval: effect.previewFadeDuration
repeat: false
onTriggered: {
if (!effect.previewVisible) {
effect.visible = false;
}
}
}
Connections {
target: KWinComponents.Workspace