Как настроить смену языка в X Window System, аналогично тому, как это реализовано в Gnome?

Как я могу реализовать переключение раскладки клавиатуры в Linux, используя комбинации клавиш "Super + Space" для последовательного переключения на последнюю использованную раскладку и "Super + Space + Space" для перехода к третьей раскладке по частоте использования? Мой текущий скрипт для смены языка выглядит следующим образом: <br/> <pre><code>#! /bin/bash

CURRENT_LAYOUT=$(setxkbmap -query | awk -F : 'NR==3{print $2}' | sed 's/ //g')

if [ "$CURRENT_LAYOUT" = "us" ]; then
    setxkbmap "ru"
	notify-send "Lang: RU" -t 700
else
    setxkbmap "us"
    notify-send "Lang: US" -t 700
fi</code></pre> <br/> <br/> Мне неясно, как отслеживать множественные нажатия клавиш в системе, что затрудняет реализацию необходимой логики.
  • 19 сентября 2024 г. 19:23
Ответы на вопрос 1
Для реализации переключения раскладок клавиатуры в X Window System с использованием горячих клавиш "Super + Space" и "Super + Space + Space", вам потребуется немного изменить свой текущий скрипт и использовать инструмент `xbindkeys` для отслеживания нажатий клавиш. 

### Установка необходимых пакетов

1. Убедитесь, что у вас установлены `xbindkeys`, `xkb-switch` (или `setxkbmap`), а также `notify-send`.
   
   ```bash
   sudo apt install xbindkeys xdotool x11-utils
   ```

### Конфигурация `xbindkeys`

2. Создайте файл конфигурации для `xbindkeys`, если он еще не создан:

   ```bash
   xbindkeys --defaults > ~/.xbindkeysrc
   ```

### Написание скрипта для переключения раскладок

3. Создайте новый скрипт, например, `switch_layout.sh`, и вставьте следующий код:

   ```bash
   #! /bin/bash

   # Получаем текущую раскладку
   CURRENT_LAYOUT=$(setxkbmap -query | awk -F : 'NR==3{print $2}' | sed 's/ //g')

   # Определяем массив раскладок
   LAYOUTS=("us" "ru")  # Добавьте дополнительные раскладки, если необходимо
   LAYOUT_COUNT=${#LAYOUTS[@]}

   if [ "$1" == "next" ]; then
       # Переключение на следующую раскладку
       for i in "${!LAYOUTS[@]}"; do
           if [ "${LAYOUTS[$i]}" == "$CURRENT_LAYOUT" ]; then
               next_layout=${LAYOUTS[$(( (i + 1) % LAYOUT_COUNT ))]}
               break
           fi
       done
       
   elif [ "$1" == "prev" ]; then
       # Переключение на предыдущую раскладку
       for i in "${!LAYOUTS[@]}"; do
           if [ "${LAYOUTS[$i]}" == "$CURRENT_LAYOUT" ]; then
               next_layout=${LAYOUTS[(( (i - 1 + LAYOUT_COUNT) % LAYOUT_COUNT ))]}
               break
           fi
       done
   fi

   # Применяем новую раскладку
   if [ ! -z "$next_layout" ]; then
       setxkbmap "$next_layout"
       notify-send "Lang: $next_layout" -t 700
   fi
   ```

   Не забудьте сделать его исполняемым:

   ```bash
   chmod +x ~/switch_layout.sh
   ```

### Настройка горячих клавиш в `~/.xbindkeysrc`

4. Добавьте следующие строки в файл `~/.xbindkeysrc` для реагирования на комбинации клавиш:

   ```bash
   # Переключение на последнюю использованную раскладку (Super + Space)
   "bash ~/switch_layout.sh next"
       Super + space

   # Переключение на следующую раскладку (Super + Space + Space)
   "bash ~/switch_layout.sh prev"
       Super + space + space
   ```

### Запуск `xbindkeys`

5. Запустите `xbindkeys`:

   ```bash
   xbindkeys
   ```

   Можно добавить `xbindkeys` в автозагрузку вашего менеджера окон или рабочего окружения, чтобы он запускался автоматически при входе в систему.

### Проверка работы

Теперь после нажатия "Super + Space" у вас будет происходить переключение на последнюю использованную раскладку, а нажатие "Super + Space + Space" будет переключать раскладку на предыдущую по частоте использования.

### Дополнительные настройки

Вы можете расширить массив `LAYOUTS` для добавления новых раскладок, а также настроить логические условия для их переключения, если потребуется.
Похожие вопросы