Last active
July 8, 2024 14:43
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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