Cайт веб-разработчика, программиста Ruby on Rails ESV Corp. Екатеринбург, Москва, Санкт-Петербург, Новосибирск, Первоуральск

Особенности переключения раскладки клавиатуры 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 , но всё работает как надо.