Желающие могут переходить сразу к амбуле :)
ПРЕАМБУЛА:
=========
Как можно русифицировать Х-ы?
1)"По-старому", через xmodmap + xrus или что-то подобное
Это, опять-таки, можно сделать двумя способами:
a)По-хакерски, когда кейкодам соответствуют кейсимы из latin-1 с charater
code-ами, совпадающими с необходимыми русскими буквами
б)По-правильному, когда кейкодам соответствуют кейсимы Cyrillic_XXX
2)"По-новому", через xkb
Что происходит при переключении клавиатуры, русифицированной этими способами?
1а и 1б: с помощую xmodmap или аналогичного механизма (дальше рассказ
начинает страдать отсутствием точных технических терминов) изменяется
обмениваются содержимое 1,2 и 3,4 колонок раскладки, при этом посылаются
сообщения MappingKeyboard и/или MappingModifier.
2: происходит "фиксация" (locking) необходимой группы Xkb, при этом
сообщения MapppingKeyboard и/или MappingModifier _не_ посылаются.
Если у xemacs-а на некоторый keysym повешена self-insert-command, то при
нажатии кнопки, генерирующией этот keysym, в буффер будет вставлен символ,
"живущий" в свойстве (property) этого keysym-а под именем ascii_character
АМБУЛА:
=======
Что мы видим в функции maybe_define_x_key_as_self_inserting_character?
Цитата:
static void
maybe_define_x_key_as_self_inserting_character (KeySym keysym, Lisp_Object symbol)
{
Lisp_Object character = x_keysym_to_character (keysym);
if (CHARP (character))
{
extern Lisp_Object Vcurrent_global_map;
extern Lisp_Object Qascii_character;
Fput (symbol, Qascii_character, character);
if (NILP (Flookup_key (Vcurrent_global_map, symbol, Qnil)))
Fdefine_key (Vcurrent_global_map, symbol, Qself_insert_command);
}
}
Эта функция вызывается из x_reset_(key|modifier)_mapping для всех keysym-ов
в текущей раскладке. При этом для keysym-ов Cyrillic_XXX функция
x_keysym_to_character возвращает некие hard-coded значения, являющиеся
кодами символов в кодировке iso8859-5.
Видно, что ascii_character property всегда устанавливается равным этому значению.
Что получается в результате? Для честных способов русификации (1б и 2) мы
в результате имеем принудительную переустановку ascii-character property в
iso8859-5 при приходе события MappingKeyboard/MappingModifier. Как
показывает практика, эти события могут быть инициированы не только при
переключении клавиатуры xrus-ом. Это раздражает :(
Лучше всего чувствуют себя при этом те, кто русифицировал свою клавиатуру
хакерским способом, так как у них все работает так, как они настроили, ибо
Cyrillic_XXX у них не используются вообще.
Вопрос - не лучше ли будет делать так:
if (NILP (Flookup_key (Vcurrent_global_map, symbol, Qnil)))
{
Fput (symbol, Qascii_character, character);
Fdefine_key (Vcurrent_global_map, symbol, Qself_insert_command);
}
, то есть назначать ascii_character property только в том случае, если
keysym отсутствует в current-global-map?
Или, может, проверять на наличие этого property и назначать только в случае
его отсутствия?
Что скажут местные знатоки?
--
Dmitry Astapov //ADEpt (mail-to: adept(a)umc.com.ua)