Здравствуйте!
Linux Mint 18.1 Cinnamon 64-bit
Cinnamon 3.2.7
Ядро версии 4.4.0-57-generic
Железо: MacBook Pro 2011 года
Приложение (версия 20.0) работает нормально везде, кроме Хрома. То есть раскладки замечательно переключаются, коррекция раскладки происходит, всё ок. В хроме клавиатура вообще не работает. Ни буквы, ни энтер, ни таб, ничего.
Выключал/включал метод ввода через im-config, навешивал разные кнопки переключения раскладки в свойствах системы и в настройках gxneur, выставлял задержку в 15 и 30 мс. Ничего из этого не помогает. Решил посмотреть логи. При запуске из терминала в логе нажатия на клавиши в хроме ничем не отличается от нажатия в терминале, например, кроме названия и типа события.
Вот нажатия клавиш в терминале:
[TRA] 14:08:51 Получено KeyPress 'q' (тип события 2)
[TRA] 14:08:51 Получено KeyRelease 'q' (тип события 3)
[TRA] 14:08:52 Получено KeyPress 'w' (тип события 2)
[TRA] 14:08:52 Получено KeyRelease 'w' (тип события 3)
[TRA] 14:08:52 Получено KeyPress 'e' (тип события 2)
[TRA] 14:08:52 Получено KeyRelease 'e' (тип события 3)
[TRA] 14:09:34 Received XI_KeyPress 'Control_L' (event type 35)
[TRA] 14:09:34 Получено KeyPress 'c' (тип события 2)
Идут события KeyPress и KeyRelease с буквами, и только для клавиши Ctrl идёт событие XI_KeyPress, которое замечательно обрабатывается.
Вот нажатия клавиш в браузере (Chrome):
[DBG] 14:12:30 Обрабатывается новое окно (ID 56623106) с именем 'Google-chrome' (статус Обработка, режим По-умолчанию)
[TRA] 14:12:30 Получено XI_ButtonPress (клавиша 1) (тип события 35, подтип 15)
[TRA] 14:12:32 Received XI_KeyPress 'q' (event type 35)
[ERR] 14:12:32 Ошибка определения символа для клавиши с кодом 2 и модификатором 0x0!
[ERR] 14:12:32 Попробуйте запустить программу командой "env LC_ALL=<LOCALE> xneur",
где LOCALE можно получить коммандой "locale -a"
[ERR] 14:12:32 Ошибка определения символа для клавиши с кодом 2 и модификатором 0x2000!
[ERR] 14:12:32 Попробуйте запустить программу командой "env LC_ALL=<LOCALE> xneur",
где LOCALE можно получить коммандой "locale -a"
[TRA] 14:12:32 Получено XI_KeyRelease 'q' (тип события 35)
[TRA] 14:12:32 Received XI_KeyPress 'w' (event type 35)
[TRA] 14:12:32 Получено XI_KeyRelease 'w' (тип события 35)
[TRA] 14:12:32 Received XI_KeyPress 'e' (event type 35)
[TRA] 14:12:32 Получено XI_KeyRelease 'e' (тип события 35)
Идут события XI_KeyPress и XI_KeyRelease, причём первое такое событие вызывает ошибку (не найден код клавиши для текущей локали в файле keymap.c [да, я посмотрел исходники на гитхабе] или что-то типа того). Попытки запуска с "env LC_AL=..." тоже не помогли, тем более что судя по логам локаль определяется верно (ru_RU.utf8).
Я нашёл, что вроде для Хрома как раз делали какой-то патч, который касается работы через XI_KeyPress вместо KeyPress при работе в линуксе на макбуках:
ash: Remap Command on Apple keyboards to Control [2/2] This is yusukes's http://codereview.chromium.org/9854025/ with my review comments applied. chrome/browser/chromeos/xinput_hierarchy_changed_event_listener.cc: * Every time when a new device is added, notify the name of the device to KeyRewriter. * Listens to XI_KeyPress and XI_KeyRelease events to the X root window, and notify the device ID of the event to KeyRewriter so that the rewriter could know the source of the next KeyPress/KeyRelease Core event. Note that it's not possible to monitor both XI_KeyPress and core KeyPress events for a single X window. For example, if we monitor XI_KeyPress events in aura::RootWindowHostLinux (by calling XISelectEvents() for the root Aura window, xwindow_), it becomes impossible to receive KeyPress core events for |xwindow_| in RootWindowHostLinux. It's also impossible to convert XI_KeyPress into core KeyPress. That is the reason why xinput_hierarchy_changed_event_listener.cc is used to monitor XI_KeyPress/Release events. chrome/browser/ui/views/ash/key_rewriter.cc: * Rewrites Command key press on an Apple keyboard to Control key press, regardless of the user preference for remapping modifier keys. Part 1 of 2 (Ash part): http://codereview.chromium.org/9838010/ BUG=121012 TEST=manual TBR=sky Review URL: http://codereview.chromium.org/9963027
Но так как я совершенно не разбираюсь в этом всём, решил дальше не искать.
И у меня остаётся вопрос: нельзя ли внедрить поддержку или какой-то дополнительный маппинг событий XI_KeyPress/XI_KeyRelease? Судя по логам, они нормально ловятся, и буквы определяются верно. Почему бы не обрабатывать их?