Проблема с клавиатурой на FreeNX

На openSUSE 11.4 используется FreeNX-0.7.2-29.1.x86_64.rpm (из X11:RemoteDesktop/openSUSE_11.4) так вот при подключении к серверу неазвисимо от клиента (“NX Client for Linux” или “Remmina”) стабильно возникает проблема в обработке управляющих клавиш, анализ работы клавиатуры выполняю через “Show Current Layout/Показать текущую раскладку”, далее полный перечень проблемных клавиш (нажимаемая клавиша - отрабатываемое действие):

  1. "Cursor Up" - “Print Screen”;
  2. "Cursor Left" - “Alt-R”;
  3. "Cursor Right" - не обрабатывается;
  4. "Cursor Down" - не обрабатывается;
  5. "Super/Win-L" - не обрабатывается;
  6. "Super/Win-R" - не обрабатывается;
  7. "Alt-R" - “Enter-num pad”;
  8. "Menu" - не обрабатывается;
  9. "Ctrl-R" - “Page Down”;
  10. "Insert" - не обрабатывается;
  11. "Delete" - не обрабатывается;
  12. "Home" - “Pause”;
  13. "End" - “Super/Win-L”;
  14. "Page Up" - “/ - num pad”;
  15. "Page Down" - не обрабатывается;
  16. "/ - num pad" - “Insert”;
  17. "Enter-num pad" - “Cursor Down”.
    Поиск в Гугле дал ссылу на подобную проблему - Incorrect key mappings in remote NX session, ответ ссылается к NoMachine Trouble Report #TR11F02131, но предложенное решение проблему не решает.
    Кто сталкивался с подобным?

По ходу поиска попалось - Установка и настройка FreeNX в Fedora 10](http://prostofedora.blogspot.com/2009/03/freenx-fedora-10.html?showComment=1308731002306#c537772219669706676), там предлагается

Добавляем в автозапуск скрипт для установки правильных параметров клавиатуры:

    # gedit /etc/xdg/autostart/setxkmap.desktop

И вставляем в него следующие строки:

    [Desktop Entry]
    Version=1.0
    Encoding=UTF-8
    Name=Fix keyboard settings
    Exec=setxkbmap -rules xorg -model pc105 -layout "us,ru" -variant ",winkeys" -option "grp:ctrl_shift_toggle"
    Terminal=false
    Type=Application

Из статьи не ясно на решение кокой проблемы направлены данные действия, но судя по всему данное решение пересекается с моей темой.
Простое выполнение команды “setxkbmap -rules xorg -model pc105 …” на стороне FreeNX-сервера никакого эффекта не дает.
Сравнивая с методом решения проблемы от NoMachine:

However, it has been reported that the arrow up key is still mapped as print screen, and the alt+gr key combination is mapped as enter. The issue can also be reproduced connecting from NX Client for Windows to NX Server on Ubuntu.

As a temporary workaround, Ubuntu 8.10 users (as well as any others using an Xorg server 1.5) can disable the Evdev driver by adding these lines to the /etc/X11/xorg.conf file residing on the Ubuntu host:

Section "ServerFlags"
    Option "AutoAddDevices" "false"
EndSection

Then restart the X server.

If layout falls back to US keyboard after this change, modify the keyboard InputDevice section to set the proper layout, e.g. for an Italian keyboard:

Section "InputDevice"
        Identifier  "Keyboard0"
        Driver      "kbd"
        Option      "XkbModel" "pc105"
        Option      "XkbLayout" "it"
EndSection

Можно заметить сходную направленность на определение типа клавиатуры и режима её работы.
Ковыряние навело на мысль, что проблема связана с внедрением Udev, а в частности изменение обработчика клавиатуры Evdev. openSUSE 11.4 использует новую модель настройки Xorg, т.е. вместо единого файла /etc/X11/xorg.conf используется набор конфигурационных файлов в папке /etc/X11/xorg.conf.d/:

# ls -1 /etc/X11/xorg.conf.d
10-evdev.conf
11-mouse.conf
50-device.conf
50-monitor.conf
50-screen.conf
50-synaptics.conf
50-vmmouse.conf
50-wacom.conf
90-keytable.conf

Однако что и как нужно правит/настраивать я так и не понял. :frowning:
Новые ключевые слова в поиске (freenx evdev xorg) дали новые полезные результаты:

  1. TIP freenx evdev
  2. Xorg/evdev: no arrow keys

Действительно:

Проблема ушла после добавления в конфигурацию Xorg, точнее в файл /etc/X11/xorg.conf.d/10-evdev.conf дополнительной секции:

Section "ServerFlags"
        Option "AutoAddDevices" "off"
EndSection

После этого достаточно перезапустить xdm:

# rcxdm restart

(запускать из текстовой консоли).
Данная процедура выполняется на стороне NX-клиента (на клиенте с которого подключаемся к FreeNX-серверу).
Хоть проблема и решена, на я не совсем понял что при этом происходит, может кто в курсе темы прокомментирует/объяснит?

Поскольку разработчики NX-технологии рассматривают использование Option “AutoAddDevices” “off” как “обходной путь”, то нужно понять какой путь будет “прямым”.
В man по данной опции говорится:

Option “AutoAddDevices” “boolean”
If this option is disabled, then no devices will be added from HAL events. Enabled by default.

Т.е. этим отключается “авто добавление” устройств по событию от HAL, судя по всему man-ы “не догоняют” развитие технологий, и о Udev в них нет не единого упоминания, в нашем случае это касается Udev.
Для понимания что происходит можно сравнить перечень устройств ввода при активной/включенной опции:

# **xinput list**
⎡ Virtual core pointer                    	id=2	[master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer              	id=4	[slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad              	id=13	[slave  pointer  (2)]
⎜   ↳ PIXART USB OPTICAL MOUSE                	id=9	[slave  pointer  (2)]
⎣ Virtual core keyboard                   	id=3	[master keyboard (2)]
    ↳ Virtual core XTEST keyboard             	id=5	[slave  keyboard (3)]
    ↳ Power Button                            	id=6	[slave  keyboard (3)]
    ↳ Video Bus                               	id=7	[slave  keyboard (3)]
    ↳ Sleep Button                            	id=8	[slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard            	id=12	[slave  keyboard (3)]
    ↳   USB Keyboard                          	id=10	[slave  keyboard (3)]
    ↳   USB Keyboard                          	id=11	[slave  keyboard (3)]

(Клиентом является ноутбук с подключеннми к нему USB мышой и клавиатурой)

и при выключенной опции:

# **xinput list**
⎡ Virtual core pointer                    	id=2	[master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer              	id=4	[slave  pointer  (2)]
⎜   ↳ <default pointer>                       	id=6	[slave  pointer  (2)]
⎣ Virtual core keyboard                   	id=3	[master keyboard (2)]
    ↳ Virtual core XTEST keyboard             	id=5	[slave  keyboard (3)]
    ↳ <default keyboard>                      	id=7	[slave  keyboard (3)]

Аппаратные устройства не детектируются и заменяются стандартными эквивалентами. В типичных конфигурациях это не должно давать новых проблем, но при использовании расширенных клавиатур и много-кнопочных мышек, проблемы гарантированы.

Так же несколько напрягает возникновение в логах (/var/log/Xorg.0.log) вот таких событий:

  9724.950] (II) XINPUT: Adding extended input device "<default keyboard>" (type: KEYBOARD)
  9724.963] (II) config/udev: Adding input device Power Button (/dev/input/event3)
  9724.963] (II) AutoAddDevices is off - not adding device.
  9724.964] (II) config/udev: Adding input device Video Bus (/dev/input/event8)
  9724.964] (II) AutoAddDevices is off - not adding device.
  9724.985] (II) config/udev: Adding input device Lid Switch (/dev/input/event1)
  9724.986] (II) AutoAddDevices is off - not adding device.
  9724.986] (II) config/udev: Adding input device Sleep Button (/dev/input/event2)
  9724.986] (II) AutoAddDevices is off - not adding device.
  9724.996] (II) config/udev: Adding input device HDA Intel Headphone (/dev/input/event10)
  9724.996] (II) AutoAddDevices is off - not adding device.
  9724.998] (II) config/udev: Adding input device   USB Keyboard (/dev/input/event5)
  9724.998] (II) AutoAddDevices is off - not adding device.
  9724.999] (II) config/udev: Adding input device   USB Keyboard (/dev/input/event7)
  9724.999] (II) AutoAddDevices is off - not adding device.
  9725.000] (II) config/udev: Adding input device PIXART USB OPTICAL MOUSE (/dev/input/event4)
  9725.000] (II) AutoAddDevices is off - not adding device.
  9725.000] (II) config/udev: Adding input device PIXART USB OPTICAL MOUSE (/dev/input/mouse1)
  9725.000] (II) AutoAddDevices is off - not adding device.
  9725.018] (II) config/udev: Adding input device AT Translated Set 2 keyboard (/dev/input/event0)
  9725.018] (II) AutoAddDevices is off - not adding device.
  9725.018] (II) config/udev: Adding input device SynPS/2 Synaptics TouchPad (/dev/input/event6)
  9725.018] (II) AutoAddDevices is off - not adding device.
  9725.019] (II) config/udev: Adding input device SynPS/2 Synaptics TouchPad (/dev/input/mouse0)
  9725.019] (II) AutoAddDevices is off - not adding device.
  9725.019] (II) config/udev: Adding input device PC Speaker (/dev/input/event9)
  9725.019] (II) AutoAddDevices is off - not adding device.

В частности не подключение Sleep Button - препятствует работе кнопке “Сна” на клавиатуре ноутбука - очень редко но необходима.
В итоге: решаем одну проблему - создам новую.

Просмотр хвоста Xorg.0.log во время подключения к FreeNX-серверу выдал вот такие записи:

при Option “AutoAddDevices” “on

 17617.499] (II) XKB: reuse xkmfile /var/lib/xkb/compiled/server-37CC34890C995A28EC77EE7C6F8ADC4A74BBB4D6.xkm

при Option “AutoAddDevices” “off

 17869.091] (II) XKB: reuse xkmfile /var/lib/xkb/compiled/server-B480C861E5DEE455B79F1A5910FC0E4A93E80852.xkm

Новый вопрос - что это такое?

Вот несколько полезных ссылок в тему:

  1. Настройка XKB.](http://www.linux.org.ru/books/xkb/setup.html)
  2. Подробное руководство по настройке тонких клиентов на основе дистрибутива Thinstation и протокола NX](http://www.deltann.ru/10/d-042009/p-82)
  3. xkb [xgu.ru]
  4. xkb - X keyboard extension - wikipedia.org
  5. XKB - X Keyboard Extension - X.org

Перекопал весь Интернет, а решение было под носом - SDB:FreeNX server.

Another problem is that the arrow keys do not work or have an unexpected action.

Там же есть решение:
Нужно на сервере открыть файл на редактирование (CLI:vi | GUI: gedit) /usr/bin/nxnode, найти в нем строчку которая содержит:

${kbtype:+kbtype=$kbtype,}${kbload:+kbload=$kbload,}${keymap:+keymap=$keymap,}

Вся строка довольно таки длинная, и именно в нее нужно вставить:

${client:+client=$client,}

Важно, что бы не дабавились лишние пробелы, ни до, ни после вставленного кода.
Далее достаточно сохранить файл и пере подключится к сессии.

И еще, там же попалось решение мене критичной проблемы:

A problem which regularly occurs is that you have to try to make the connection a number of times before it succeeds.

Иногда при пропадании соединения, или некорректном отключении от NX-сессии, необходимо несколько раз (бывало до 4-х попыток) повторить попытку подключения.
Решение: на сервере правим тот же файл (/usr/bin/nxnode), в нем нужно найти строчку:

cho "Xft.dpi: 96" | DISPLAY=:$display xrdb -merge >>"$USER_FAKE_HOME/.nx/C-$sess_id/session" 2>&1

и вставить перед ней: sleep 4 (можно с комментарием), в итоге должно получится:

# Patch - delay to allow nxagent to complete launching. ccb 20100407
    **sleep 4**
 
echo "Xft.dpi: 96" | DISPLAY=:$display xrdb -merge >>"$USER_FAKE_HOME/.nx/C-$sess_id/session" 2>&1

nvy Если найдете время было бы неплохо обновить русскоязычную версию статьи SDB:FreeNX server, что бы решение у всех под боком было…
Тем более вы уже в курсе вопроса, вам это будет легче сделать.