From e13ebf6b7a090732470dbc963ac08bacd305a5f7 Mon Sep 17 00:00:00 2001 From: seraphim <18ycm9tx@anonaddy.me> Date: Mon, 17 Aug 2026 18:52:02 +0700 Subject: . --- waybar/.config/waybar/config.jsonc | 7 +++++++ waybar/.config/waybar/kbd-layout.sh | 42 +++++++++++++++++++++++++++++++++++++ waybar/.config/waybar/style.css | 1 + 3 files changed, 50 insertions(+) create mode 100755 waybar/.config/waybar/kbd-layout.sh (limited to 'waybar') diff --git a/waybar/.config/waybar/config.jsonc b/waybar/.config/waybar/config.jsonc index 8fe5464..bba0757 100644 --- a/waybar/.config/waybar/config.jsonc +++ b/waybar/.config/waybar/config.jsonc @@ -19,6 +19,8 @@ "modules-right": [ "custom/separator", "custom/separator3", + "custom/kbd", + "custom/separator3", "pulseaudio", "custom/separator3", "memory", @@ -62,6 +64,11 @@ "critical": 80 } }, + "custom/kbd": { + "exec": "/home/seraphim/dotfiles-gentoo/waybar/.config/waybar/kbd-layout.sh", + "restart-interval": 5, + "tooltip": false + }, "custom/clock": { "exec": "date +'%H:%M %p - %A, %b %d' | tr '[:upper:]' '[:lower:]'", "interval": 60, diff --git a/waybar/.config/waybar/kbd-layout.sh b/waybar/.config/waybar/kbd-layout.sh new file mode 100755 index 0000000..e81462a --- /dev/null +++ b/waybar/.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 +} diff --git a/waybar/.config/waybar/style.css b/waybar/.config/waybar/style.css index 17fc256..196a1f7 100644 --- a/waybar/.config/waybar/style.css +++ b/waybar/.config/waybar/style.css @@ -81,6 +81,7 @@ window#waybar { #memory, #custom-media, +#custom-kbd, #tray, #cpu, #custom-clock, -- cgit v1.2.3