diff options
Diffstat (limited to '.config/waybar/kbd-layout.sh')
| -rwxr-xr-x | .config/waybar/kbd-layout.sh | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/.config/waybar/kbd-layout.sh b/.config/waybar/kbd-layout.sh new file mode 100755 index 0000000..e81462a --- /dev/null +++ b/.config/waybar/kbd-layout.sh @@ -0,0 +1,42 @@ +#!/bin/sh + +# Kill any leftover instances so reloads don't pile up. +for p in $(pgrep -f "kbd-layout.sh"); do + [ "$p" != "$$" ] && kill "$p" 2>/dev/null +done + +STATE="${XDG_RUNTIME_DIR:-/tmp}/waybar-kbd.state" +rm -f "$STATE" + +# Index of the Russian layout (from configured layouts), so we don't hardcode order. +RUS_IDX=$(niri msg keyboard-layouts 2>/dev/null | grep -i russian | grep -oE '^[ *]*[0-9]+' | tr -d ' *' | head -1) + +kbd_query() { + niri msg keyboard-layouts 2>/dev/null | grep -Fm1 '*' | grep -qi russian && echo Ru || echo En +} + +# Parse a "Keyboard layout switched: N" or "...current_idx: N" event line. +kbd_event() { + idx=$(printf '%s' "$1" | grep -oE '[0-9]+' | tail -1) + [ "$idx" = "$RUS_IDX" ] && echo Ru || echo En +} + +emit() { + v="$1"; src="$2" + echo "$v" + echo "$v" > "$STATE" +} + +# Instant path: react to niri's layout-change events. +niri msg event-stream 2>/dev/null | { + while true; do + if IFS= read -r -t 0.2 line; then + case "$line" in + *"Keyboard layout switched"*|*"Keyboard layouts changed"*) emit "$(kbd_event "$line")" event ;; + esac + else + v=$(kbd_query) + [ "$(cat "$STATE" 2>/dev/null)" != "$v" ] && emit "$v" poll + fi + done +} |
