Особенности переключения раскладки клавиатуры Ctrl+Shift в X Window System Linux
Использую для переключения раскладки клавиатуры (переключение между языками на клавиатуре) сочетание клавиш Ctrl+Shift - и в Windows, и в консоли сервера Linux. Установил Linux на рабочий компьютер, естественно, с графической средой, настроил так же переключение на Ctrl+Shift - и тут вдруг обнаружилась особенность работы переключателя раскладки в системе X Window System (подразумевается X11) (Gnome, KDE, Cinnamon). При переключении раскладки теряется само сочетание Ctrl+Shift, т.е. перестают работать сочетания клавиш, например, Ctrl+Shift+C, Ctrl+Shift+V, Ctrl+Shift+P и т.п..
Моё предположение - программа переключения раскладки работает несколько некорректно - срабатывает на нажате комбинации клавиш Ctrl+Shift, а по-хорошему то должна срабатывать на парное действие "нажали+отпустили", да при этом ещё и "затеняет", поглощает код Shift, что в итоге приводит к тому, что вместо, например, Ctrl+Shift+C система получает Ctrl+C, т.е. Shift теряется.
Благо, что в Linux при желании можно настроить очень многое. Решил использовать keyd (keyd.rvaiya - A key remapping daemon) - он позволяет при нажатии комбинации клавиш отправить другое сочетание клавиш в систему, т.е. осуществить подмену, имитацию. Для корректной работы необходимо назначить в системе для переключения раскладки другую комбинацию клавиш, я выбрал Alt+Shift.
$ cat /etc/default/keyboard # KEYBOARD CONFIGURATION FILE # Consult the keyboard(5) manual page. XKBMODEL="pc105" XKBLAYOUT="us,ru" XKBVARIANT="," # устанавливаем по-умолчанию переключение на Alt+Shift (или Win+space) # потом через сервис keyd добавляем ещё Ctrl+Shift # см. /etc/keyd/default.conf XKBOPTIONS="grp:alt_shift_toggle,terminate:ctrl_alt_bksp,grp_led:scroll" BACKSPACE="guess"
Устанавливаем keyd: sudo apt install keyd, и настраиваем через файл конфигурации:
$ cat /etc/keyd/default.conf # переназначение клавиш переключения раскладки клавиатуры # # требуется установка keyd: # apt install keyd # # man и команда мониторинга: # man keyd.rvaiya # keyd.rvaiya monitor # # monitor - показывает события клавиатуры в реальном времени. # удобно проверять, как keyd перехватывает нажатия. # [ids] * [main] [control] # обработка нажатия Ctrl # при быстром нажатии и отпускании следом Shift # имитируем нажатие правого Alt+Shift # 250 - это время задержки shift = overloadt2(shift, macro(rightalt+rightshift), 250) # имитация Win+space - это стандартная клавиша в Linux LMDE 7 # shift = overloadt2(shift, macro(leftmeta+space), 250) [alt] # обработка нажатия Alt # так же отрабатываем короткое нажатие Alt+Shift # чтобы точно так же не перекрывал комбинации клавиш Alt+Shift+ # имитация кратковременного Alt+Shift shift = overloadt2(shift, macro(rightalt+rightshift), 250)
Далее - запускаем демон, проверяем корректность запуска:
$ sudo systemctl enable keyd $ sudo systemctl start keyd $ sudo systemctl status keyd
В графической среде Linux также установить переключение по Alt+Shift, например, Linux LMDE 7: Параметры системы → Клавиатура → Параметры XKB → + → Переключение на другую раскладку → выбрать Alt+Shift.
И всё! Далее всё работает корректно - и переключение раскладки по Ctrl+Shift, и горячие клавиши с сочетанием Ctrl+Shift+… . Ну и бонусом получили ещё одно сочетание для переключения - Alt+Shift. Не ручаюсь за корректность и необходимость блока [alt] в файле /etc/keyd/default.conf , но всё работает как надо.