[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: про X-овую клавиатуру
> Прочитал я дискуссию по поводу XKB vs. xmodmap, и решил внести свою
> лепту :) Все изложенное ниже есть теоретические измышления.
>
> Вопрос: что именно (минимум) требуется от X сервера для
> локализации клавиатуры? Нужны ли вообще XKB и modmap?
>
> Вот моя версия: от сервера не нужно почти ничего. На сервере должна
> храниться информация о том, в каком режиме находится клавиатура. В
> режим входит CapsLock, текущий язык и т.п. Все остальное может быть
> сделано на клиенте (в Xlib'е), в том числе изменение режима клавиатуры
> (и CapsLock'a тоже). Нажатие отдельных клавиш уже хранится на сервере
> и может быть получено клиентами (XQueryKeymap), автоповтор также уже
> контролируется core-протоколом (XChangeFeedbackControl), лампочки
> клавиатуры тоже могут меняться клиентами (XChangeKeyboardControl).
А вот как сейчас сделано :-)
- на сервере хранится информация о том, в каком режиме находится клавиатура
- В режим входит состояние (нажат/отжат) CapsLock, Shift, Control и т.п.
и "текущий язык" - номер группы (которую надо выбрать в раскладке)
- все остальное сделано на клиенте (в Xlib'e). В смысле - какой символ
надо сопоставить keycod'у в зависимости от CapsLock, Shift, etc. и
"текущего языка"
- Таблица (не "нажатие клавиш") для всех этих переводов хранится на сервере
и может быть получена приложением (XQueryKeymap), а "нажатие клавиши" (keycode)
вместе с состоянием (state, куда входят все эти CapsLock/Shift/"текущий язык")
передается приложению в XKeyEvent по мере появления этих "нажатий".
Дальше как я сказал - все делает приложение.
(Кстати управление автоповтором на PC'шках работает только в 4.0.1 :-)
> modmap или прочие таблицы могут храниться и у клиента, хотя они будут
> зависимы от конкретных keycode'ов и могут различаться у разных
> клиентов.
Modmap хранится у клиентов и там же и интерпретируется. Вот только -
откуда она берется? Приложение при старте выспрашивает ее у сервера
с помощью XQueryKeymap. Ну еще сервер при изменении у него keymap
рассылает приложениям ChangeKeyboardMappingNotify и приложения, если
"не дураки" снова перезапрашивают у него "modmap или прочие таблицы"
Теоретически, приложению можно подсунуть специфическую для него
таблицу, а не ту, что на сервере. Но стандартных функций для этого нет.
Хотя написать - не проблема. Проблема только в том, что надо будет в
Xlib встраивать "парсер" для зачитки таблиц из текстового файла.
> Состояние клавиатуры может храниться на уровне Properties root'ового
> окна. В принципе туда же можно запихнуть таблицы KeySym'ов, если нужно.
Состояние и так хранится в сервере в виде 16-битной переменной и
как я уже сказал сообщается приложению вместе со скан-кодом при каждом
нажатии кнопки. Какая разница будет это переменная сервера или "свойство
root'ового окна"? К Property надо будет еще и какое-то имя и приложение
должно будет его запрашивать по каждому получению keycode.
> Почему состояние должно храниться на сервере: оно должно быть
> одинаково для всех клиентов (хотя это спорно, некоторые хотят, чтобы в
> каждом приложении был свой режим клавиатуры - это тоже может быть
> легко решено на клиентской стороне).
Вот это действительно было бы не плохо, особенно с "текущим языком".
(Собственно ради этого и была написана xxkb). Но тогда приложение
должно и само отрабатывать нажатие клавиш CapsLock/Shift/Control и т.п.
Не говоря уж о комбинациях типа L_Shift+R_Shift.
В общем случае получится не такая уж простая программа.
Ну и что дальше? "Зашить" ее в Xlib? Или в каждом приложении писать свою?
> Что есть сейчас: режим клавиатуры меняется на сервере, таблицы
> хранятся на сервере, Lock-клавиши обрабатываются на сервере. Состояние
> и таблицы скачиваются Xlib'ом для трансляции keycode'ов.
Не совсем так.
Что есть сейчас -
- режим клавиатуры меняется на сервере (но сообщается приложению с каждым
keycode)
- таблицы хранятся на сервере, но только для того, чтобы приложение знало -
откуда их взять. Интепретируются они в клиенте.
- Lock-клавиши? Их состояние хранится на сервере и там же они "вычисляются",
но ... какой символ должен получиться в зависимости от того нажата эта
Lock или не нажата - решает клиент.
- таблицы скачиваются, а состояние "само приходит" с каждым нажатием.
> Таким образом, имеющееся _серверное_ решение не минимально.
Ну это я не понял. Можно еще кое-что "свалить на клиента", но зачем?
Единственное, что еще можно отдать клиенту - "язык".
А представьте себе, если каждое приложение начнет само решать - какая
клавиша типа CapsLock, Shift, L_Win, Menu и т.п. - как меняет состояние.
В одном приложении CapsLock работает как CapsLock, в другом - переключает
"язык". В одном приложении правый Shift - Shift, в другом - Meta.
Ну и так далее.
Сами же взвоете и захотите "однообразия".
Так вот оно уже есть. :-)
> Второй вопрос - как лучше реализовать трансляцию keycode'ов в текст
> и команды внутри Xlib'a. Но это уже никак не относится к X серверу.
Ну и как-то же делается сейчас :-)
> На мой взгляд, loadable module вполне подходит на роль транслятора
> keycode'ов, язык C богаче всяких скриптов :)
Вот это масль хорошая. И кстати, такая возможность, по крайней мере
для всех "локалезавсимых" функций Xlib уже сейчас есть.
Только никто ей не пользуется.
> Заключение: теоретически можно обойтись без XKB и без modmap, нужно
> только выкинуть все лишнее из X сервера и подправить Xlib. :)
Так что подправлять то?
Вместо нынешней схемы где
- сервер просто держит раскладку и "раздает" ее приложениям
- зависимость флажков-модификаторов от физических кнопок заложена
в сервере
- а состояние сообщается клиенту с каждой кнопкой.
Вы предлагаете
- таблицу приложениям грузить не с сервера, а из текстового файла
или - опять же с сервера только через properties root'ового окна
- зависимость модификаторов от клавиш вычислять в каждом приложении
(а если они это будут делать по разному? Кошмар!!!)
- состояние клавиатуры (если клиент не сам его вычисляет) пусть каждый
раз запрашивает с сервера. (Зачем? Ему сейчас его и так докладывают.)
Ну и чем это лучше? :-)
--
Ivan U. Pascal | e-mail: pascal@tsu.ru
Administrator of | Tomsk State University
University Network | Tomsk, Russia