summaryrefslogtreecommitdiff
path: root/.config/waybar/kbd-layout.sh
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
}