Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Новый участник


Сообщения: 48
Благодарности: 1

Профиль | Отправить PM | Цитировать


Борюсь с багами CapsLock.
Симптомы:
При работе в терминале, при нажатом CapsLock следующие буквы печатаются строчными:
Цитата:
х ъ ж э б ю
Симптомы явно указывают, что бага случается с типами клавиш "non alphabetic"
Для примера выдержка из декомпилированного файла Thinstation-2.1\packages\keymaps-ru\x-common\lib\kmaps\xkb\ru.xkm:
Код: Выделить весь код
key <AB07> {
        type= "ALPHABETIC",
        symbols[Group1]= [               m,               M ],
        symbols[Group2]= [ Cyrillic_softsign, Cyrillic_SOFTSIGN ]
    };
    key <AB08> {
        type[group2]= "ALPHABETIC",
        symbols[Group1]= [           comma,            less ],
        symbols[Group2]= [     Cyrillic_be,     Cyrillic_BE ]
    };
Клавиша "M" относится к группе "ALPHABETIC" вне зависимости от раскладки (русской или английской).
Следующая клавиша в этом ряду относится к группе "ALPHABETIC" только для русской раскладки: type[group2]= "ALPHABETIC"

На самом деле при обычно компиляции образа я использую только английскую раскладку (компилю с en_us).
Если компилить с русской - добавляется ещё один баг: перестаёт работать русская точка.

Насколько я понял принцип работы клавиатуры вThinstation, обработка сигналов происходит следующим образом:
  • по идее клавиатура работает в режиме K_RAW, т.е.
  • скан-коды в десятичном виде передаются X-серверу, который преобразует их сначала в keycodes, затем в буквенные символы ASCII-таблицы (английские или русские соответственно).
  • X-сервер передаёт буквы прикладному приложению - в нашем случае это rdesktop.
  • rdesktop производит обратное преобразование в скан-коды, но уже в шестнадцатиричный вид.
  • rdesktop отправляет скан-коды на сервер терминалов.

Есть одна странность:
номера скан-кодов в Thinstation смещены на +8.
Например:
согласно этой таблице клавиша "q" имеет сканкод 16 (в hex - 0x10).
В en_us.xkm она соответсвует скан-коду 24:
Код: Выделить весь код
<AD01> = 24;
......
key <AD01> {
        symbols[Group1]= [               q,               Q ],
        symbols[Group2]= [              at,     Greek_OMEGA ]
однако при обратном преобразовании в rdesktop всё становится на свои места:
Код: Выделить весь код
q 0x10 addupper
Скан-код есть скан-код. Он не зависит от того, какая буква и в какой раскладке была нажата. Это наглядно видно в выдержке из \Thinstation-2.1\packages\keymaps-ru\rdesktop\lib\kmaps\keymaps\ru:
Код: Выделить весь код
semicolon 0x27
colon 0x27 shift
Cyrillic_zhe 0x27 altgr
Cyrillic_ZHE 0x27 shift altgr
Все четыре варианта преобразуются в один и тот же скан-код.
Cервер терминалов уже сам решает какой символ вывести на печать в зависимости от включённой раскладки и состояния модификаторов.
Значит собака порылась именно в состоянии модификатора CapsLock, который по каким-то причинам не доходит до сервера (причём это отностися только к группе "non ALPHABETIC").
Тут я застрял.
Не пойму, что где нужно исправлять.
Может в моих рассуждениях есть какая-то ошибка?

Вот, наткнулся на полезную доку: http://www.hupo.org.cn/docs/linuxdoc...keymapping.txt

Последний раз редактировалось Barvinok, 09-08-2005 в 18:55. Причина: Добавление


Отправлено: 14:21, 09-08-2005 | #31