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