34 lines
1.6 KiB
Bash
Executable File
34 lines
1.6 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Скрипт для Niri, который динамически находит IPC-сокет
|
|
|
|
# Находим сокет в $XDG_RUNTIME_DIR, имя которого соответствует шаблону niri*.sock
|
|
# head -n 1 используется на случай, если по ошибке найдется несколько сокетов
|
|
NIRI_SOCKET=$(find "$XDG_RUNTIME_DIR" -maxdepth 1 -name "niri*.sock" | head -n 1)
|
|
|
|
# Проверяем, был ли сокет найден и является ли он действительно файлом сокета
|
|
if [ -z "$NIRI_SOCKET" ] || [ ! -S "$NIRI_SOCKET" ]; then
|
|
echo '{"text": "Niri socket not found"}'
|
|
# Выходим, чтобы Waybar не перезапускал скрипт каждую секунду
|
|
sleep 5
|
|
exit 1
|
|
fi
|
|
|
|
# Используем socat для подписки на события и вывода состояния
|
|
# -u отключает буферизацию для немедленного вывода
|
|
socat -u UNIX-CONNECT:"$NIRI_SOCKET" - | while read -r line; do
|
|
# Запрос текущего состояния при каждом изменении
|
|
STATE=$(echo 'get-state' | socat - UNIX-CONNECT:"$NIRI_SOCKET")
|
|
|
|
# Форматируем вывод в JSON для Waybar
|
|
echo "$STATE" | jq -c '
|
|
.outputs | map(.workspaces) | flatten | map(
|
|
{
|
|
"id": .name,
|
|
"name": .name,
|
|
"class": (if .focused then "focused" else (if .urgent then "urgent" else "default") end)
|
|
}
|
|
)
|
|
'
|
|
done
|