fix: dedupe docks on display changes

This commit is contained in:
droid
2026-03-24 10:35:52 +08:00
parent 760a746211
commit 700a01cd30
2 changed files with 71 additions and 13 deletions

View File

@@ -1,6 +1,10 @@
#!/usr/bin/env bash
set -euo pipefail
LOCK_FILE="${XDG_RUNTIME_DIR:-/tmp}/plasma-dock-autofit.lock"
exec 9>"$LOCK_FILE"
flock -n 9 || exit 0
CONFIG_FILE="$HOME/.config/plasma-org.kde.plasma.desktop-appletsrc"
CUSTOM_PRESET_DIR="$HOME/.config/panel-colorizer/presets/LogicDock"
USER_BUILTIN_PRESET_DIR="$HOME/.local/share/plasma/plasmoids/luisbocanegra.panel.colorizer/contents/ui/presets/Dock"
@@ -21,17 +25,25 @@ wait_for_plasma() {
get_screen_count() {
python - <<'PY'
import re, subprocess
text = subprocess.check_output(["kscreen-doctor", "-o"], text=True, errors="ignore")
text = re.sub(r'\x1b\[[0-9;]*[A-Za-z]', '', text)
blocks = re.split(r'(?=Output: )', text)
count = 0
for block in blocks:
if not block.startswith('Output: '):
continue
if re.search(r'^\s*enabled\s*$', block, re.M):
count += 1
print(max(count, 1))
import re, subprocess, sys, time
for attempt in range(20):
try:
text = subprocess.check_output(["kscreen-doctor", "-o"], text=True, errors="ignore")
text = re.sub(r'\x1b\[[0-9;]*[A-Za-z]', '', text)
blocks = re.split(r'(?=Output: )', text)
count = 0
for block in blocks:
if not block.startswith('Output: '):
continue
if re.search(r'^\s*enabled\s*$', block, re.M):
count += 1
if count > 0:
print(count)
sys.exit(0)
except subprocess.CalledProcessError:
pass
time.sleep(1)
sys.exit(1)
PY
}
@@ -137,6 +149,51 @@ for (var i = 0; i < targetScreens.length; ++i) {
"
}
dedupe_bottom_panels() {
local screen_count="$1"
local targets
targets=$(python - <<PY
n = int(${screen_count})
print(','.join(str(i) for i in range(n)))
PY
)
qdbus6 org.kde.plasmashell /PlasmaShell org.kde.PlasmaShell.evaluateScript "
function isManagedDock(panel) {
var hasTasks = false;
var hasColorizer = false;
var ids = panel.widgetIds;
for (var i = 0; i < ids.length; ++i) {
var widget = panel.widgetById(ids[i]);
if (!widget) continue;
if (widget.type == 'org.kde.plasma.icontasks') hasTasks = true;
if (widget.type == 'luisbocanegra.panel.colorizer') hasColorizer = true;
}
return hasTasks && hasColorizer;
}
var targetScreens = [${targets}];
var byScreen = {};
for (var i = 0; i < targetScreens.length; ++i) {
byScreen[targetScreens[i]] = [];
}
for (var i = 0; i < panelIds.length; ++i) {
var panel = panelById(panelIds[i]);
if (panel.location != 'bottom') continue;
if (targetScreens.indexOf(panel.screen) < 0) continue;
if (!isManagedDock(panel)) continue;
byScreen[panel.screen].push(panel);
}
for (var i = 0; i < targetScreens.length; ++i) {
var sid = targetScreens[i];
var panels = byScreen[sid];
panels.sort(function(a, b) { return a.id - b.id; });
for (var j = 1; j < panels.length; ++j) {
panels[j].remove();
}
}
"
}
apply_taskmanager_behavior() {
local json
json="$(get_bottom_taskmanagers)"
@@ -190,8 +247,10 @@ PY
main() {
wait_for_plasma || exit 0
local screen_count
screen_count="$(get_screen_count)"
screen_count="$(get_screen_count)" || exit 0
ensure_bottom_panels "$screen_count"
sleep 1
dedupe_bottom_panels "$screen_count"
apply_taskmanager_behavior
apply_colorizer_preset
}

View File

@@ -2,7 +2,6 @@
Description=Watch for KDE display layout changes and recalculate Plasma docks
[Path]
PathChanged=%h/.config/kwinoutputconfig.json
PathModified=%h/.config/kwinoutputconfig.json
Unit=plasma-dock-autofit.service