Обновление дистрибутива Федора9 до Федора 10 дало продолжение истории с преобразованием global keybinding событий от клавиатуры.
В новой версии Федора 10 изменена вся система ввода\вывода и переведена на использование hal. Это безусловно очень серьезный шаг к созданию гибкой системы с автоматической настройкой любых устройств ввода\вывода. В результате этих изменений получилось полностью отказаться от использования конфигурационного файла xorg.conf, и перейти на определение устройств на лету.
Я напомню читателям, о чем шла речь:я изучал проблему маппинга клавиш на своем ноутбуке начиная с Федора 9. Проблема заключалась в том, что используя стандартный механизм маппинга клавиш не позволял переопределять специальные клавиши такие как Windows Key и Print Src, новые значения игнорировались системой.
В новой версии Федора 10 была полностью изменена работа с устройствами ввода, в результате таких преобразований ошибка с global keybinding стала проявляться еще сильней. Так как новый дистрибутив полностью отказался от старой модели с событиями от клавиатуры посредством xkb, это позволяет нам перейти к поиску проблемы непосредственно в x window system.
Помимо X11, проблема может находится в обработчиках и обертках window managers. Анализ содержимого файлов gconf позволяет найти еще две критичные точки, это gnome и metacity.
gconftool-2 -g /apps/metacity/general/mouse_button_modifier
gconftool-2 -g /apps/panel/global/screenshot_key
gconftool-2 -g /apps/panel/global/window_screenshot_key
gconftool-2 -g /apps/metacity/global_keybindings/run_command_screenshot
gconftool-2 -g /apps/metacity/global_keybindings/run_command_window_screenshot
Однако, разобравшись в функциональной частью каждого модуля мы без труда локализуем место где должна находится ошибка: она находится в недрах x11. Вот приблизительный список всех модулей:
Функции: window managers keybinding:
- metacity
- gnome
Функции: передача событий, отслеживание глобальных keybinding, механизм xmodmap
- x11
Функции: чтение событий с устройства
- evdev
- kbd/xkb
- hal
Для справки, я привожу новые коды xev log для Fedora 10:
KeyPress event, serial 30, synthetic NO, window 0x4a00001,
root 0x8b, subw 0x0, time 24266678, (1005,395), root:(1008,440),
state 0x0, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 30, synthetic NO, window 0x4a00001,
root 0x8b, subw 0x0, time 24266741, (1005,395), root:(1008,440),
state 0x8, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
KeyPress event, serial 30, synthetic NO, window 0x4a00001,
root 0x8b, subw 0x0, time 24266869, (1005,395), root:(1008,440),
state 0x0, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 30, synthetic NO, window 0x4a00001,
root 0x8b, subw 0x0, time 24266917, (1005,395), root:(1008,440),
state 0x40, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
KeyPress event, serial 30, synthetic NO, window 0x4a00001,
root 0x8b, subw 0x0, time 24267597, (1005,395), root:(1008,440),
state 0x0, keycode 134 (keysym 0xffec, Super_R), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 30, synthetic NO, window 0x4a00001,
root 0x8b, subw 0x0, time 24267661, (1005,395), root:(1008,440),
state 0x40, keycode 134 (keysym 0xffec, Super_R), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
KeyPress event, serial 30, synthetic NO, window 0x4a00001,
root 0x8b, subw 0x0, time 24267797, (1005,395), root:(1008,440),
state 0x0, keycode 104 (keysym 0xff8d, KP_Enter), same_screen YES,
" XLookupString gives 1 bytes: (0d) "
" XmbLookupString gives 1 bytes: (0d) "
XFilterEvent returns: False
KeyRelease event, serial 30, synthetic NO, window 0x4a00001,
root 0x8b, subw 0x0, time 24267862, (1005,395), root:(1008,440),
state 0x0, keycode 104 (keysym 0xff8d, KP_Enter), same_screen YES,
" XLookupString gives 1 bytes: (0d) "
XFilterEvent returns: False
MappingNotify event, serial 30, synthetic NO, window 0x0,
request MappingKeyboard, first_keycode 8, count 248
MappingNotify event, serial 30, synthetic NO, window 0x0,
request MappingKeyboard, first_keycode 8, count 247
FocusOut event, serial 30, synthetic NO, window 0x4a00001,
mode NotifyGrab, detail NotifyAncestor
FocusIn event, serial 32, synthetic NO, window 0x4a00001,
mode NotifyUngrab, detail NotifyAncestor
KeymapNotify event, serial 32, synthetic NO, window 0x0,
keys: 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
MappingNotify event, serial 32, synthetic NO, window 0x0,
request MappingKeyboard, first_keycode 8, count 248
MappingNotify event, serial 32, synthetic NO, window 0x0,
request MappingKeyboard, first_keycode 8, count 247
Для корректной работы xmodmap необходимо обновить файл ~/.xmodmap и keycodes для hal драйвера.
~/.xmodmap
keycode 64 = Super_L
keycode 133 = Alt_L
keycode 134 = Alt_R
keycode 104 = Delete
keycode 169 = Print Sys_Req
После применения файла, обновленный xev log.
KeyPress event, serial 30, synthetic NO, window 0x4a00001,
root 0x8b, subw 0x0, time 27496232, (785,378), root:(788,423),
state 0x0, keycode 64 (keysym 0xffeb, Super_L), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 30, synthetic NO, window 0x4a00001,
root 0x8b, subw 0x0, time 27496288, (785,378), root:(788,423),
state 0x8, keycode 64 (keysym 0xffeb, Super_L), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
KeyPress event, serial 30, synthetic NO, window 0x4a00001,
root 0x8b, subw 0x0, time 27496456, (785,378), root:(788,423),
state 0x0, keycode 133 (keysym 0xffe9, Alt_L), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 30, synthetic NO, window 0x4a00001,
root 0x8b, subw 0x0, time 27496488, (785,378), root:(788,423),
state 0x8, keycode 133 (keysym 0xffe9, Alt_L), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
KeyPress event, serial 30, synthetic NO, window 0x4a00001,
root 0x8b, subw 0x0, time 27497104, (785,378), root:(788,423),
state 0x0, keycode 134 (keysym 0xffea, Alt_R), same_screen YES,
XKeysymToKeycode returns keycode: 108
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 30, synthetic NO, window 0x4a00001,
root 0x8b, subw 0x0, time 27497160, (785,378), root:(788,423),
state 0x8, keycode 134 (keysym 0xffea, Alt_R), same_screen YES,
XKeysymToKeycode returns keycode: 108
XLookupString gives 0 bytes:
XFilterEvent returns: False
KeyPress event, serial 30, synthetic NO, window 0x4a00001,
root 0x8b, subw 0x0, time 27497304, (785,378), root:(788,423),
state 0x0, keycode 104 (keysym 0xffff, Delete), same_screen YES,
XLookupString gives 1 bytes: (7f) ""
XmbLookupString gives 1 bytes: (7f) ""
XFilterEvent returns: False
KeyRelease event, serial 30, synthetic NO, window 0x4a00001,
root 0x8b, subw 0x0, time 27497352, (785,378), root:(788,423),
state 0x0, keycode 104 (keysym 0xffff, Delete), same_screen YES,
XLookupString gives 1 bytes: (7f) ""
XFilterEvent returns: False
MappingNotify event, serial 30, synthetic NO, window 0x0,
request MappingKeyboard, first_keycode 8, count 248
MappingNotify event, serial 30, synthetic NO, window 0x0,
request MappingKeyboard, first_keycode 8, count 247
FocusOut event, serial 30, synthetic NO, window 0x4a00001,
mode NotifyGrab, detail NotifyAncestor
FocusIn event, serial 32, synthetic NO, window 0x4a00001,
mode NotifyUngrab, detail NotifyAncestor
KeymapNotify event, serial 32, synthetic NO, window 0x0,
keys: 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
MappingNotify event, serial 32, synthetic NO, window 0x0,
request MappingKeyboard, first_keycode 8, count 248
MappingNotify event, serial 32, synthetic NO, window 0x0,
request MappingKeyboard, first_keycode 8, count 247
Из которого следует, что все преобразования прошли успешно. Однако, глобальные keybinding по прежнему не работают как надо. А именно: после применения файла
xmodmap ~/.xmodmap по прежнему на нажатие клавиши Eject (новой print screen) не происходит взятия снимка экрана, а нажатие на alt option (новая Window key) не возможно перетаскивать окно.
Из предыдущего опыта настройки маппинга для федора 9 я делаю вывод, что проблема находится в X11. Очивидно, что после запуска x11, некоторый модуль грузит карту клавиатуры и считывает значения специальных клавишь модификаторов и возможно системных кнопок. Такой вывод я делаю потому, что значения клавиш модефикаторов невозможно переопределить стандартыми средствами которые позволяют xmodmap. Кроме того, даже при наличии корректно сформированного xkb файла с расскладкой, данная ошибка продолжает пресутствовать, если расскладка загружена уже после старта X11. Другими словами, существует только один способ переопределить коды клавишь модификаторов - при старте x11 в файле xorg.conf.
Думаю проблемма всплыла значительно раньше и была бы уже исправлена если бы клавиатуры использовали различные коды для модификаторов. Если бы каждая клавиатура которую вы подключали к компьютеру имела бы сильно отличающийся layout, включая другое расположение кнопок shift, windows key, alt и другие. Но на сягодняший день видимо только у меня возникла необходимость переопределить занчения специальных кнопок на новые.
Продолжение следует...