Особенности переключения раскладки клавиатуры 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
И всё! Далее всё работает корректно - и переключение раскладки по Ctrl+Shift, и горячие клавиши с сочетанием Ctrl+Shift+… . Ну и бонусом получили ещё одно сочетание для переключения - Alt+Shift. Не ручаюсь за корректность и необходимость блока [alt] в файле /etc/keyd/default.conf , но всё работает как надо.