51 lines
1.3 KiB
Bash
Executable file
51 lines
1.3 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
set -euo pipefail
|
|
|
|
get_layout_display_name() {
|
|
idx="$1"
|
|
dbus-send --session --print-reply --dest=org.kde.keyboard /Layouts org.kde.KeyboardLayouts.getLayoutsList 2>/dev/null \
|
|
| grep 'string "' \
|
|
| sed 's/.*string "\([^"]*\)".*/\1/' \
|
|
| awk -v idx="$idx" 'NR%3==0 { if (c++ == idx) { print; exit } }'
|
|
}
|
|
|
|
get_layout_index() {
|
|
dbus-send --session --print-reply --dest=org.kde.keyboard /Layouts org.kde.KeyboardLayouts.getLayout 2>/dev/null \
|
|
| awk '/uint32/ { print $2; exit }'
|
|
}
|
|
|
|
LAST_LAYOUT=""
|
|
|
|
apply_layout() {
|
|
idx="$1"
|
|
CURRENT_LAYOUT=$(get_layout_display_name "$idx")
|
|
|
|
if test "$LAST_LAYOUT" = "$CURRENT_LAYOUT"; then
|
|
return 0
|
|
elif test "$CURRENT_LAYOUT" = "English (Colemak)"; then
|
|
echo "Setting layout to colemak"
|
|
setxkbmap us colemak
|
|
elif test "$CURRENT_LAYOUT" = "Portuguese (Brazil)"; then
|
|
echo "Setting layout to br"
|
|
setxkbmap br
|
|
fi
|
|
|
|
LAST_LAYOUT="$CURRENT_LAYOUT"
|
|
}
|
|
|
|
update_layout() {
|
|
INDEX=$(get_layout_index)
|
|
apply_layout "$INDEX"
|
|
}
|
|
|
|
while ! get_layout_index; do
|
|
sleep 1s
|
|
done
|
|
update_layout
|
|
|
|
dbus-monitor --session \
|
|
"type='signal',interface='org.kde.KeyboardLayouts',member='layoutChanged',path='/Layouts'" \
|
|
| while read -r line; do
|
|
update_layout
|
|
done
|