#!/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