blob: e81462a2e7497425ef99aef162634013c3e98661 (
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
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
}
|