Skip to content

Instantly share code, notes, and snippets.

@gugglegum
Last active July 8, 2024 14:43
Show Gist options
  • Save gugglegum/43a24b3dddd001a23cdb6b355138b3d3 to your computer and use it in GitHub Desktop.
Save gugglegum/43a24b3dddd001a23cdb6b355138b3d3 to your computer and use it in GitHub Desktop.
Bash script to switch keyboard layout by Ctrl + Shift / Alt+Shift without issues with shortcuts (like Ctrl+Shift+F, Ctrl+Alt+Shift+C, etc.) https://www.youtube.com/watch?v=o78-LcC5xEs
#!/bin/bash
# ID устройства клавиатуры
readonly KEYBOARD_ID=8
# Коды клавиш
readonly KEY_LEFT_CTRL=37
readonly KEY_LEFT_ALT=64
readonly KEY_LEFT_SHIFT=50
readonly KEY_RIGHT_CTRL=105
readonly KEY_RIGHT_ALT=108
readonly KEY_RIGHT_SHIFT=62
switch_sequences=(
# Оставьте эти 4 строки, чтобы переключалось по Ctrl+Shift
"Ctrl_Down Shift_Down Ctrl_Up"
"Ctrl_Down Shift_Down Shift_Up"
"Shift_Down Ctrl_Down Ctrl_Up"
"Shift_Down Ctrl_Down Shift_Up"
# Оставьте эти 4 строки, чтобы переключалось по Alt+Shift
"Alt_Down Shift_Down Alt_Up"
"Alt_Down Shift_Down Shift_Up"
"Shift_Down Alt_Down Alt_Up"
"Shift_Down Alt_Down Shift_Up"
)
buffer=() # буфер с 3 последними кодами событий
check_sequence() {
if [[ ${#buffer[@]} -eq 3 ]]; then
for switch_sequence in "${switch_sequences[@]}"; do
if [[ "${buffer[*]}" == $switch_sequence ]]; then
echo "--- KEYBOARD SWITCH ---"
buffer=()
current_layout=$(xkb-switch -p)
if [ "$current_layout" = "us" ]; then
xkb-switch -s ru
else
xkb-switch -s us
fi
fi
done
fi
}
# Обрабатываем события клавиатуры
xinput test "$KEYBOARD_ID" | while read -r line; do
echo "$line" # Выводим все события для отладки
event_type=$(echo "$line" | awk '{print $2}')
keycode=$(echo "$line" | awk '{print $3}')
event=""
if [[ $event_type == "press" ]]; then
if [[ $keycode == $KEY_LEFT_CTRL || $keycode == $KEY_RIGHT_CTRL ]]; then
event="Ctrl_Down"
elif [[ $keycode == $KEY_LEFT_ALT || $keycode == $KEY_RIGHT_ALT ]]; then
event="Alt_Down"
elif [[ $keycode == $KEY_LEFT_SHIFT || $keycode == $KEY_RIGHT_SHIFT ]]; then
event="Shift_Down"
else
event="Other_Down"
fi
elif [[ $event_type == "release" ]]; then
if [[ $keycode == $KEY_LEFT_CTRL || $keycode == $KEY_RIGHT_CTRL ]]; then
event="Ctrl_Up"
elif [[ $keycode == $KEY_LEFT_ALT || $keycode == $KEY_RIGHT_ALT ]]; then
event="Alt_Up"
elif [[ $keycode == $KEY_LEFT_SHIFT || $keycode == $KEY_RIGHT_SHIFT ]]; then
event="Shift_Up"
else
event="Other_Up"
fi
fi
echo $event
buffer+=($event)
# Укорачиваем массив до 3 последних элементов
if [[ ${#buffer[@]} -gt 3 ]]; then
buffer=("${buffer[@]: -3}")
fi
# Очищаем буфер если была нажата или отпущена какая-то другая клавиша
if [[ "${buffer[@]}" =~ "Other_Down" ]] || [[ "${buffer[@]}" =~ "Other_Up" ]]; then
buffer=()
fi
check_sequence
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment