#!/usr/bin/env bash # SPDX-FileCopyrightText: 2026 Marco Allegretti # SPDX-License-Identifier: GPL-2.0-or-later set -euo pipefail repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" effect_qml="$repo_root/kwin/effects/shift-tile-preview/contents/ui/main.qml" effect_metadata="$repo_root/kwin/effects/shift-tile-preview/metadata.json" effects_cmake="$repo_root/kwin/effects/CMakeLists.txt" tiling_script="$repo_root/kwin/scripts/shift-tiling/contents/ui/main.qml" env_config="$repo_root/envmanager/config.h" require_line() { local file="$1" local needle="$2" if ! grep -Fq -- "$needle" "$file"; then echo "Missing dynamic tile motion invariant in ${file#$repo_root/}: $needle" >&2 exit 1 fi } reject_line() { local file="$1" local needle="$2" if grep -Fq -- "$needle" "$file"; then echo "Rejected dynamic tile motion pattern in ${file#$repo_root/}: $needle" >&2 exit 1 fi } require_line "$effects_cmake" "add_kwin_effect(shift-tile-preview shift-tile-preview)" require_line "$effect_metadata" '"Id": "shift-tile-preview"' require_line "$effect_metadata" '"X-Plasma-API": "declarativescript"' require_line "$env_config" '{"shift-tilingEnabled", convergenceModeEnabled}' require_line "$env_config" '{"shift-tile-previewEnabled", convergenceModeEnabled}' require_line "$env_config" '"shift-tile-preview"' require_line "$env_config" '"shift-tiling"' require_line "$effect_qml" "KWinComponents.SceneEffect" require_line "$effect_qml" "ShellSettings.Settings.dynamicTilingEnabled" require_line "$effect_qml" "interactiveMoveResizeStarted.connect" require_line "$effect_qml" "interactiveMoveResizeStepped.connect" require_line "$effect_qml" "interactiveMoveResizeFinished.connect" require_line "$effect_qml" "Behavior on x" require_line "$effect_qml" "Behavior on y" require_line "$effect_qml" "Behavior on width" require_line "$effect_qml" "Behavior on height" require_line "$effect_qml" "showPreview(\"insert\"" require_line "$effect_qml" "showPreview(\"float\"" require_line "$effect_qml" "showPreview(\"restore\"" require_line "$effect_qml" "readonly property real insertIntentDeadZone: 0.18" require_line "$effect_qml" "if (Math.abs(fromCenterX) < insertIntentDeadZone && Math.abs(fromCenterY) < insertIntentDeadZone)" require_line "$tiling_script" "readonly property real stablePrimaryRatio: 0.58" require_line "$tiling_script" "readonly property real insertIntentDeadZone: 0.18" require_line "$tiling_script" "function orderedWindowsForScreen(outputName)" require_line "$tiling_script" "function buildStableStack(windows, startIndex)" require_line "$tiling_script" "function buildStableLayout(windows)" require_line "$tiling_script" "function setStableLayout(outputName, windows)" require_line "$tiling_script" "setStableLayout(outputName, windows)" require_line "$tiling_script" "setStableLayout(outputName, remaining)" require_line "$tiling_script" "retileScreen(name)" require_line "$tiling_script" "retileScreen(targetName)" require_line "$tiling_script" "if (Math.abs(fromCenterX) < insertIntentDeadZone && Math.abs(fromCenterY) < insertIntentDeadZone)" reject_line "$tiling_script" "targetKey = lastLeafKey(rootNode)" reject_line "$tiling_script" "setScreenLayout(outputName, splitLeaf(rootNode, targetKey" reject_line "$tiling_script" "KWinComponents.Workspace.showOutline(dragOutlineRect)" reject_line "$tiling_script" "KWinComponents.Workspace.hideOutline()" printf '%s\n' 'dynamic-tiles-motion-ok'