PDA

Показать полную графическую версию : Проблемма с клавиатурой в Thinstation 2.1


Страниц : 1 [2]

ruslandh
21-06-2005, 22:59
Barvinok
Это-то как раз ясно :)
Истина скрывается в нюансах :)

Figaro
28-06-2005, 18:29
Доброго времени суток. Сам столкнулся с такой проблемой (кстати, решение еще не найдено?), есть версия, что в rdesktop где-то прячется баг.

Поведение rdesktop:

При "правильном" переключении раскладки по альт-шифт:
1. Нажимаем альт. Генерируется событие (прерывание) "нажат альт"
2. Нажимаем шифт. Генерируется событие "нажат шифт"
3. Отпускаем шифт. Генерируется событие "отпущен шифт"
Здесь винда понимает, что нужно переключить раскладку. И переключает ее.
4. Отпускаем альт. Генерируется событие "отпущен альт"

При "неправильном" переключении альт-шифт происходит следующее:
1. Нажимаем альт. Событие "нажат альт"
2. Нажимаем шифт. Событие "нажат шифт"
3. Отпускаем альт. Что видим? Винда переключила раскладку,
как будто мы отпустили шифт. Возможно, здесь в rdesktop баг, и
он посылает сообщение "отпущен шифт"
4. Отпускаем шифт. Снова винда переключает раскладку, значит снова "отпустили шифт".

Замечаем, что после "неправильного" переключения раскладки у винды
остается ощущение, что клавиша альт все еще прижата (например, при нажатии "H" вываливается справка, как по Alt+H). Лечится повторным нажатием клавиши альт.

Проверил поведение штатного виндового десктоп-клиента. Оно адекватно: он в обоих случаях, при "правильном" и "неправильном" переключении, переключает раскладку один раз и не оставляет залипнутым альт.

Как это лечить, я пока не выяснил, буду колупать дальше (скорее всего, с использованием сниффера) и надеюсь на вашу поддержку :)

Barvinok
29-06-2005, 03:11
Figaro
Чувак, ты вкуриваешь..
Но ты не обратил внимание на один нюанс: если не включать при компиляции НИКАКИХ раскладок клавиатуры, то залипания не происходит.
Значит проблемма кроется не в rdesktop, а в интерференции между rdesktop и раскладками (IMHO).

Если что накапаешь - пиши обязательно: этой проблеммой масса людей изводится!
Я, к сожалению, линукс только начал изучать. Что то путное смогу сказать не раньше, чем через пол-года.

Drug_
29-06-2005, 12:24
Забавно, дошел до туда же что и Barvinok, пытаюсь "заработать" стрелки и клавиши повыше или отключить залипание.

Figaro
29-06-2005, 18:31
Радостно, что сниффер использовать не придется, а почти готовое решение проблемы описано вот тут: http://forum.opennet.ru/openforum/vsluhforumID1/57069.html. Насколько я понял, этот не баг, а такая иксовая особенность: интерпретировать нажатие альт+шифт как нажатие клавиши "мета".

Я тоже проверил, для нормальной работы thinstation нужно:
1. Запустить rdesktop (чтобы загрузились иксы)
2. Перейти во вторую свободную консоль (ctrl+alt+f2)
3. Там залогиниться (для дефолтной сборки пользователь root, а пароль pleasechangeme) и набрать команду

DISPLAY=':0' xmodmap -e "keysym Alt_L = Alt_L"

4. Проверить, как замечательно работает rdesktop :)

Ясно, что каждого так делать не заставишь, поэтому thinstation нужно пересобрать.
Пересборкой thinstation я еще не занимался (нет времени), поэтому пока не нашел, чего можно исправить, но есть подозрение, что можно поправить в файле packages/rdesktop/etc/cmd/rdesktop.global с

CMD_GLOBAL="rdesktop -k $KEYBOARD_MAP -f"

на

CMD_GLOBAL="xmodmap -e 'keysym Alt_L = Alt_L'; rdesktop -k $KEYBOARD_MAP -f"


Вот пока и все, что удалось найти :)

Barvinok
01-07-2005, 19:31
К сожалению не сработало.
При загрузке образа самой последней строкой идёт
//etc/cmd/rdesktop.global: 1: Syntax error: Unterminated quoted string

Пробовал давать команду второй строкой:
CMD_GLOBAL="rdesktop -k $KEYBOARD_MAP -f"
CMD_GLOBAL="xmodmap -e 'keysym Alt_L = Alt_L'"
Ошибку не выдаёт, но отказывается запускать rdesktop, сволочь

Вариант с комадой из второй консоли тоже не сработал:
-sh: xmodmap: not found

Barvinok
01-07-2005, 19:51
Собственно, я думаю проще перекомпилить саму раскладку, чем пытаться что-то править командами.
Мы выяснили, что проблемма заключается в раскладке X-сервера.
Раскладка находится в \packages\keymaps-en_us\x-common\lib\kmaps\xkb\en_us.xkm (соответственно для каждой локали)
Формат *.xkm - это раскладка, скомпилированная с помощью xkbcomp (http://www.nsc.ru/cgi-bin/www/unix_help/unix-man?xkbcomp)
Дело за малым: нужно взять раскладку xkb, найти строки, типа keycode 0x40 = Alt_L Meta_L
keysym Alt_L = Meta_L заменить их на keycode 0x40 = Alt_L Alt_L
keysym Alt_L = Alt_L скомпилировать и положить в соответствующий каталог Thinstation.
Кажись, должно сработать.

Так же я заметил попытки забороть эту проблемму в файле \packages\keymaps-en_us\rdesktop\lib\kmaps\keymaps\modifiers:
Shift_R 0x36
Shift_L 0x2a

Alt_R 0xb8
Mode_switch 0xb8
ISO_Level3_Shift 0xb8

Alt_L 0x38

Control_R 0x9d
Control_L 0x1d

# Translate Meta, Super and Hyper to Windows keys.
# This is hardcoded. See documentation for details.

# Translate Menu to the Windows Application key.
# This one does not work either.
Menu 0xdd
Но, поскольку трабла в Х-сервере, решить её с помощью rdesktop не удалось. Я так думаю!

Barvinok
07-07-2005, 14:47
Господа....
Можете пожать мою мужественную руку..
Я сам до сих пор в эйфории.. но это оправдано: сырость побеждена!
Проблемма залипающего Alt в Thinstation решена мною только что!
Делаем следующие манипуляции:
1. Берём бинарник раскладки клавиатуры X-сервера из дистрибутива Thinstation, например \packages\keymaps-en_us\x-common\lib\kmaps\xkb\en_us.xkm
2. С помощью утилиты xkbcomp конвертируем его в текстовый формат:
xkbcomp -xkb en_us.xkm
В полученном файле en_us.xkb ищем слово "Meta" - оно там встречается один раз в строке
key <LALT> { [ Alt_L, Meta_L ] };
3. Удаляем нафиг Meta_L
Получаем строку
key <LALT> { [ Alt_L ] };
4. Сохраняем изменения и компилим файл обратно в бинарник:xkbcomp -xkm en_us.xkb и заменяем нашим бинарником исходный в дистре Thinstation.
5. Компилим Thinstation и юзаем терминал без гиммороя.
Фсё

Barvinok
07-07-2005, 14:49
Пожалуй, напишу в FAQ на SourceForge...
А то не только в России люди мучаются.

Нужно будет полечить ещё следющие баги:
при нажатом CapsLock буквы <ю б ь х> и возможно ещё какие-то печатаются строчными (с Shift нормально)

При компиляции с русской раскладкой не работает <. ?> (русская точка-английский вопрос).
Буду разбираться.

ruslandh
02-08-2005, 12:10
Barvinok
Удачи !!! :)

Barvinok
09-08-2005, 14:21
Борюсь с багами 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.
Например:
согласно этой (http://ntlib.chat.ru/ware/tables/scan.htm) таблице клавиша "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/rdesktop-1.2.0/keymapping.txt

Barvinok
09-08-2005, 19:39
ОК.
Изучив матчасть, я понимаю, почему не работает CapsLock.
В конце файла Thinstation-2.1\packages\keymaps-en_us\rdesktop\lib\kmaps\keymaps\common есть прекрасные строки:
#
# Inhibited keys
#
Caps_Lock 0x0 inhibit
Multi_key 0x0 inhibit

Согласно вышеприведённой доке If flags is "inhibit", nothing will be sent to the server.

Я не могу понять почему он РАБОТАЕТ для группы alphabetic!

Barvinok
10-08-2005, 20:54
Что-то приуныл всезнающий All...
А может слухи о его всезнании преувеличены?

Figaro
13-08-2005, 12:53
Barvinok, спасибо за очень полезную работу. Если не сложно, ткни меня носом в ту "матчасть", которую ты изучал.

Barvinok
14-08-2005, 16:00
Figaro
Преимущественно это труды Ивана Паскаля: http://pascal.tsu.ru/other/xkb/
http://doc.marsu.ru/Linux/xkb/programs.html
http://linux.ru.net/index.php?module=library&act…d=118∂=1004 (http://linux.ru.net/index.php?module=library&action=show&docid=118∂=1004)

Ну, а далее поиск по ключевым словам...

Barvinok
14-08-2005, 16:07
Выяснил, почему рабтает CapsLock.
В описании типа "ALPHABETIC" имеется строка
preserve[Lock]= Lock; Вот что по этому поводу написано у Паскаля:
preserve[...]

Здесь требуются некоторые пояснения.
Напомню, что X-сервер передает прикладной программе сообщение о событии (нажатии/отпускании клавиши) в котором указывается скан-код клавиши и слово - "состояние" состоящее из набора модификаторов.

Для перевода этого сообщения в символ используются соответствующие подпрограммы Xlib.

Естественно, эти программы используют в качестве аргументов и скан-код и "состояние". Причем, отдельные подпрограммы (их там несколько) могут для принятия решения использовать не все модификаторы из "состояния".

Для того, чтобы избежать нежелательных эффектов, когда несколько таких подпрограмм обрабатывают сообщение последовательно, каждая подпрограмма обычно "вычищает" "использованные" модификаторы из слова-"состояния".

Но, в то же время, бывают ситуации, когда это нежелательно и какой-нибудь модификатор должен "приниматься во внимание" несколькими подпрограммами.

Для таких случаев и используется инструкция preserve - "сохранить" (имеется ввиду - сохранять модификатор в "состоянии").

В этой инструкции в квадратных скобках указывется модификатор (или комбинация модификаторов), такой же, как в одной из инструкции map[...], а справа от "присваивания" - модификатор (или набор модификаторов), который нужно сохранять.

Обратите внимание, что в скобках обязательно должна быть комбинация (или модификатор), точно такая же как и в одной из инструкций map[...].
Дело в том, что инструкция preserve[...] не является самостоятельной инструкцией, а представляет собой "продолжение" соответствующей инструкции map[...]. Поэтому, по "комбинации в скобках" XKB "сшивает" эти две инструкции.
А вот в правой части может быть только часть этих модификаторов (или даже один). То есть, в обработке будут учитываться все модификаторы из левой части, а сохраняться только те, которые указаны в правой.

Надо сказать, что в правой части инструкции preserve может, также, стоять и "None", что означает, что "ничего сохранять не нужно".
Но, поскольку "по умолчанию" и так ничего не сохраняется, то такие инструкции особого смысла не имеют и их можно не писать.

Barvinok
14-08-2005, 23:00
Полезная вещь - маны...
Давеча скачал последний релиз rdesktop и почитал \rdesktop-1.4.1.tar\rdesktop-1.4.1\doc\keymapping.txt

Что пишут та...
Keyboard mapping
================
This release of rdesktop uses a new, portable keyboard mapping
implementation. It should hopefully work on all X11 systems. This new
implementation only looks at X11 keysyms: Not on (nonportable)
keycodes or modifier status. This means that rdesktop will obey your
local keyboard configuration. For example, if you have swapped
CapsLock and Control, rdesktop will use this mapping.

XKB is currently not used. It seems like a good idea to me, but since
some X servers (like Xvnc) does not support XKB, we still need to use
the plain old interface as well, at least.

There are still some small problems.

* CapsLock: CapsLock changes are never sent to the RDP
server. rdesktop does not know which keys that are modified by
CapsLock and which are not. So, the CapsLock indicator in Wordpad
etc will always be off.
Тем не менее CapsLock работает...
Как мы уже выяснили это происходит багодаря X-серверу (значит некое взаимодействие с xkb есть).
На http://sourceforge.net/tracker/?group_id=24366&atid=381349 я нашёл вот такой патч: disable XKB extension (http://sourceforge.net/tracker/index.php?func=detail&aid=871648&group_id=24366&atid=381349)
Привожу его описание:
disable XKB extension
rdesktop will not translate altgr correctly (on solaris
at least) if XKB extension is enabled (+kb option for X
server). following patch will disable this extension

Т.е. глючило (и продолжает глючить?) расширение, отвечающее за взаимодействие с X-сервером (?).
Я не пойму, чему верить: rdesktop зависит от xkb или нет?

Skriva
13-07-2006, 12:18
Опишу и я свою проблему, написал сначала в раздел по win2k,2003, но почитал эту тему и понял, что здесь собака порылась.
Так вот: тонкий клиент цепляется к серверу на Вин2003, при помощи thinstation, версия вроде 2.1, но могу ошибаться (не знаю, где посмотреть, собирал не я).
Сама проблема: Если язык по умолчанию ставить русский, то работает только до выхода из системы пользователя, после след. входа ставится опять английский. Правка реестра не помогает. Судя по всему проблема где-то в thinstation, но где.
В опциях rdesktop ставил -k ru_ru, но русский таки не поставился...

p.s. Если цепляться при помощи mstsc, то с языками по умолдчанию проблем нет.

Hornet
06-12-2012, 13:10
День добрый, нашел как проблема решается в Thinstation 5.1.
Нужно редактировать файл ~build/packages/x-common/lib/X11/xkb/symbols/altwin
В частности секцию
xkb_symbols "meta_alt" {
key <LALT> { [ Alt_L, Meta_L ]};
key <RALT> { type[Group1] = "TWO_LEVEL",
symbols[Group1] = [ Alt_R, Meta_R ] };
modifier_map Mod1 { Alt_L, Alt_R, Meta_L, Meta_R};
};
Удаляем все упоминания Meta_L и Alt больше не залипает.




© OSzone.net 2001-2012