summaryrefslogtreecommitdiff
path: root/.config/waybar/kbd-layout.sh
diff options
context:
space:
mode:
Diffstat (limited to '.config/waybar/kbd-layout.sh')
-rwxr-xr-x.config/waybar/kbd-layout.sh42
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
+}