fix: dedupe docks on display changes
This commit is contained in:
@@ -1,6 +1,10 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
set -euo pipefail
|
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"
|
CONFIG_FILE="$HOME/.config/plasma-org.kde.plasma.desktop-appletsrc"
|
||||||
CUSTOM_PRESET_DIR="$HOME/.config/panel-colorizer/presets/LogicDock"
|
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"
|
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() {
|
get_screen_count() {
|
||||||
python - <<'PY'
|
python - <<'PY'
|
||||||
import re, subprocess
|
import re, subprocess, sys, time
|
||||||
text = subprocess.check_output(["kscreen-doctor", "-o"], text=True, errors="ignore")
|
for attempt in range(20):
|
||||||
text = re.sub(r'\x1b\[[0-9;]*[A-Za-z]', '', text)
|
try:
|
||||||
blocks = re.split(r'(?=Output: )', text)
|
text = subprocess.check_output(["kscreen-doctor", "-o"], text=True, errors="ignore")
|
||||||
count = 0
|
text = re.sub(r'\x1b\[[0-9;]*[A-Za-z]', '', text)
|
||||||
for block in blocks:
|
blocks = re.split(r'(?=Output: )', text)
|
||||||
if not block.startswith('Output: '):
|
count = 0
|
||||||
continue
|
for block in blocks:
|
||||||
if re.search(r'^\s*enabled\s*$', block, re.M):
|
if not block.startswith('Output: '):
|
||||||
count += 1
|
continue
|
||||||
print(max(count, 1))
|
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
|
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() {
|
apply_taskmanager_behavior() {
|
||||||
local json
|
local json
|
||||||
json="$(get_bottom_taskmanagers)"
|
json="$(get_bottom_taskmanagers)"
|
||||||
@@ -190,8 +247,10 @@ PY
|
|||||||
main() {
|
main() {
|
||||||
wait_for_plasma || exit 0
|
wait_for_plasma || exit 0
|
||||||
local screen_count
|
local screen_count
|
||||||
screen_count="$(get_screen_count)"
|
screen_count="$(get_screen_count)" || exit 0
|
||||||
ensure_bottom_panels "$screen_count"
|
ensure_bottom_panels "$screen_count"
|
||||||
|
sleep 1
|
||||||
|
dedupe_bottom_panels "$screen_count"
|
||||||
apply_taskmanager_behavior
|
apply_taskmanager_behavior
|
||||||
apply_colorizer_preset
|
apply_colorizer_preset
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
Description=Watch for KDE display layout changes and recalculate Plasma docks
|
Description=Watch for KDE display layout changes and recalculate Plasma docks
|
||||||
|
|
||||||
[Path]
|
[Path]
|
||||||
PathChanged=%h/.config/kwinoutputconfig.json
|
|
||||||
PathModified=%h/.config/kwinoutputconfig.json
|
PathModified=%h/.config/kwinoutputconfig.json
|
||||||
Unit=plasma-dock-autofit.service
|
Unit=plasma-dock-autofit.service
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user