blob: b1cad089dd041f847198fe755ccc05ad318b8e7c (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
#!/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"
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
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
}
|