fix: dedupe docks on display changes
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user