slackware.ru
http://www.slackware.ru/forum/

И снова о переключении раскладок...
http://www.slackware.ru/forum/viewtopic.php?f=8&t=893
Страница 1 из 1

Автор:  burn [ 05 фев 2013 16:31 ]
Заголовок сообщения:  И снова о переключении раскладок...

И так, попробую изложить свои соображения по поводу механизма переключения раскладок клавиатуры в консоли и иксах, по порядку. При том в моём случае всё усложняется следующими требованиями:
  • я использую раскладку Дворака
  • я использую русскую раскладку "Машинопись" (typewriter)
  • я привык переключать раскладки одной клавишей, а именно левый Ctrl

1. Консоль

Посмотрим, что из моих требований удовлетворяет консоль в "стандартной" поставке.

1.1 Раскладки дворак-кириллица вообще нет, есть какая-то не понятная dvorak-ru (/usr/share/kbd/keymaps/i386/dvorak), но и она не работает, как выясняется, она дважды сжата gzip'ом. Я проделал вот что:
Код:
# cd /usr/share/kbd/keymaps/i386/dvorak
# gunzip dvorak-ru.map.gz
# mv dvorap-ru.map dvorak-ru.map.gz

Однако и это не помогло, так как эта раскладка далека от совершенства, а именно:
  • она не typewriter
  • нет буквы ё, а я щепетильно отношусь к этой букве
  • вместо символа на клавише 3 символ #
  • и самое главное, это переключение по Caps Lock, о чём я расскажу отдельно

1.2 Переключение раскладок

Если брать раскладки qwerty, то выбор даже не плохой, есть раскладки серии ruwin*UTF-8, с возможностью переключения по: Caps Lock, Ctrl-Shift, Right Ctrl и Right Alt. Левого контрола нету, ну что ж... Что нам это даёт?

Переключение по Caps Lock - это просто ад! Как заявлено, Caps Lock переключает раскладки, а для того, чтобы использовать Caps Lock по его обычному назначению, надо нажать Shift-Caps Lock. Не верьте! Я опробовал это, Caps Lock действительно переключает, но стоит только попробовать нажать Shift-Caps Lock, то всё, о нормально работе можно забыть! Верхний регистр действительно включается, но вот выключить его нет никакой возможности! При этом, если мы хотели включить верхний регистр русских букв, то включается всё равно он для латинских. Можно конечно возразить, что есть Shift, но попробуйте набрать хоть пару слов с удерживаемым Shift вместо Caps Lock, я на вас посмотрю... Особое неудобство испытывают люди, владеющие методом слепой печати, так как привыкли нажимать Shift правильно, а именно пальцем руки, противоположной к руке, набирающей символ.

Переключение по Ctrl-Shift, как по правым, так и по левым, в принципе, приемлемо, НО в русской раскладке не работает Caps Lock!

Переключение по Right Ctrl - почти то, что нужно, если бы он был левый, НО при этом правый Ctrl становится не доступен для использования в сочетаниях клавиш! Согласитесь, то, что все сочетания клавиш нужно нажимать только с левым Ctrl, особым удобством не назовёшь.

Переключение по Right Alt - та же проблема, что и у правого Ctrl, плюс я предпочитаю использовать эту клавишу (Right Alt) действительно как AltGr, то есть как временный переключатель раскладки.

Что имеем в остатке? Ни одна из раскладок не смогла удовлетворить такого придирчивого пользователя, как я :ni_zia:

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

2. Иксы

2.1 Раскладки

Тут всё в порядке, пишем в конфиг иксов
Код:
Option "XkbLayout" "dvorak,ru"
Option "XkbVariant" ",typewriter"
и проблем нет.

2.2 Переключение

А вот с этим опять то же самое. В принципе назначить на переключение раскладок левый Ctrl не составит труда:
Код:
Option "XkbOptions" "grp:lctrl_toggle,..."
но если так сделать, эта клавиша опять "выпадает" из работы, пользоваться ей можно будет только для переключения, и больше ни для чего.

3. Эпилог

Рабочего решения проблемы, исходя из собственных требований, я пока не нашёл. Если кто знает, как это сделать, буду премного благодарен за совет.

Автор:  bormant [ 05 фев 2013 17:12 ]
Заголовок сообщения:  Re: И снова о переключении раскладок...

burn писал(а):
Верхний регистр действительно включается, но вот выключить его нет никакой возможности!
По Shift+CapsLock и включается, и выключается без каких-либо затруднений. Но влияет действительно только на латиницу. Можете добавить сброс CapsLock по одному только Shift, если это устраивает...
burn писал(а):
попробуйте набрать хоть пару слов с удерживаемым Shift вместо Caps Lock, я на вас посмотрю
Редактор не умеет поднять регистр набранного? Для vim gU <movement> в помощь, например, gUU поднимет в верхний регистр строку целиком.

Если так интересна консоль, посмотрите на содержимое раскладок внимательно, посмотрите man loadkeys, полагаю, вопросы с составлением собственной раскладки благополучно разрешатся. По поводу клавиши переключения раскладок: фиксация второго языка по AltGr_Lock и прописывание второй таблицы как altgr [shift] keycode NN = ... (ruwin_cplk-UTF-8 из этой серии). Почему-то кажется, что видел другой подход (AltGr_Lock в файле раскладки отсутствовало), но сходу подобной раскладки не нашёл, надо повспоминать...

burn писал(а):
вместо символа № на клавише 3 символ #
Когда-то основной кодировкой русских локалей была KOI8-R, в KOI8-R нет символа "№". В юникодную раскладку (а равно в такие кодировки, где этот символ есть) добавление символа "№" затруднений не вызовет.

burn писал(а):
клавиша опять "выпадает" из работы, пользоваться ей можно будет только для переключения
По Интернету гуляют патчи для X, исправляющие переключение с нажатия на отпускание клавиши. Для одноклавишных комбинаций оно работает вроде бы даже без сторонних эффектов.

Автор:  bormant [ 05 фев 2013 19:16 ]
Заголовок сообщения:  Re: И снова о переключении раскладок...

Ещё пару слов про воздействие CapsLock только на латиницу в консоли. Возможно тут виновато ядро (это его таблицы). Смотрим на таблицы ядра для, например, keycode 30 ("a" латинская, "ф" русская):
Код:
# dumpkeys | grep "keycode  30\|keymaps"
keymaps 0-6,8-12,14
keycode  30 = +a               +A               cyrillic_small_letter_ef cyrillic_capital_letter_ef Control_a        Control_a        Control_a        Meta_a           Meta_A           Meta_a           Meta_A           Meta_Control_a   Meta_Control_a
Видим, что латиница задана с "+" -- указание на то, что CapsLock работает для неё как Shift. Видим, что кириллица опознана в принципе (3 и 4 колонка после "=" -- это как раз AltGr), вот только символа "+" перед ними нет. Пробуем исправить ситуацию при помощи loadkeys:
Код:
# echo "altgr keycode  30 = +cyrillic_small_letter_ef" | loadkeys -
Проверяем... Мимо кассы. То есть, смотреть в первую очередь нужно в сторону исходников ядра в части таблиц трансляции клавиатуры и исходников loadkeys на предмет установки маркера влияния CapsLock.

Автор:  burn [ 05 фев 2013 19:23 ]
Заголовок сообщения:  Re: И снова о переключении раскладок...

bormant писал(а):
По Shift+CapsLock и включается, и выключается без каких-либо затруднений. Но влияет действительно только на латиницу.
Подскажите, как вы это сделали? Я выключить верхний регистр так и не смог.

bormant писал(а):
Редактор не умеет поднять регистр набранного? Для vim gU <movement> в помощь, например, gUU поднимет в верхний регистр строку целиком.
Это всё устранение следствий проблемы, я же хочу устранить саму причину проблемы.

bormant писал(а):
Если так интересна консоль, посмотрите на содержимое раскладок внимательно, посмотрите man loadkeys, полагаю, вопросы с составлением собственной раскладки благополучно разрешатся. По поводу клавиши переключения раскладок: фиксация второго языка по AltGr_Lock и прописывание второй таблицы как altgr [shift] keycode NN = ... (ruwin_cplk-UTF-8 из этой серии). Почему-то кажется, что видел другой подход (AltGr_Lock в файле раскладки отсутствовало), но сходу подобной раскладки не нашёл, надо повспоминать...
C этим проблем как раз-таки нет.

bormant писал(а):
По Интернету гуляют патчи для X, исправляющие переключение с нажатия на отпускание клавиши. Для одноклавишных комбинаций оно работает вроде бы даже без сторонних эффектов.
Спасибо за наводку

Автор:  burn [ 05 фев 2013 19:33 ]
Заголовок сообщения:  Re: И снова о переключении раскладок...

дополнение на счёт Caps Lock, у меня это происходит так: переключаю раскладку на русскую (одиночным нажатием на CpLk), проверяю - пишутся русские строчные буквы, пробую зафиксировать верхний регистр (нажатием Shift-CpLk при включенной русской раскладке), проверяю - эффекта ноль; переключаюсь на английскую раскладку, пробую - прописные буквы, хочу переключить регистр обратно в нижний для английской раскладки (для этого нажимаю Shift-CpLk при включенной английской раскладке), проверяю _первое_ нажатие на любую клавишу выводит русскую строчную букву, последующие - английские прописные, и так всегда, какие бы комбинации нажатий CpLk и Shift-CpLk и раскладок я не пробовал.

Автор:  bormant [ 05 фев 2013 19:43 ]
Заголовок сообщения:  Re: И снова о переключении раскладок...

burn писал(а):
Подскажите, как вы это сделали? Я выключить верхний регистр так и не смог.
Жму Shift, жму CapsLock, отпускаю CapsLock, отпускаю Shift. Раскладка ruwin_cplk-UTF-8.
burn писал(а):
проверяю _первое_ нажатие на любую клавишу выводит русскую строчную букву, последующие - английские прописные
перепроверил, из русского переключается всегда, из латиницы -- как у вас -- по кругу можно ходить... Но особенности про первую после нажатия букву нет.

По поводу выключения Caps по Shift-ам можно попробовать:
Код:
keycode  42 = Uncaps_Shift
keycode  54 = Uncaps_Shift

Кстати, в однобайтовых раскладках плюсики на месте, например, ruwin_cplk-KOI8-R:
Код:
$ less /usr/share/kbd/keymaps/i386/qwerty/ruwin_cplk-KOI8-R.map.gz
altgr           keycode  30 =   +0xC6
altgr   shift   keycode  30 =   +0xE6

Автор:  bormant [ 06 фев 2013 09:50 ]
Заголовок сообщения:  Re: И снова о переключении раскладок...

По поводу поддержки со стороны ядра смотреть в первую очередь в сторону:
/usr/src/linux/include/linux/keyboard.h
/usr/src/linux/drivers/tty/vt/keyboard.c

Изначально было задумано, что Caps действует на те символы, у которых KTYP(keysym) == KT_LETTER, причём KTYP(x) определено как (x)>>8. Потом добавляли юникод...
Код:
static void kbd_keycode(unsigned int keycode, int down, int hw_raw)
{
    unsigned short keysym, *key_map;
    unsigned char type;
    ...
    if (keycode < NR_KEYS) keysym = key_map[keycode];
    ...
    type = KTYP(keysym);
    if (type < 0xf0) {
        param.value = keysym;
        rc = atomic_notifier_call_chain(&keyboard_notifier_list, KBD_UNICODE, &param);
        if (rc != NOTIFY_STOP) if (down && !raw_mode) to_utf8(vc, keysym);
        return;
    }
    type -= 0xf0;
    if (type == KT_LETTER) {
        type = KT_LATIN;
        if (vc_kbd_led(kbd, VC_CAPSLOCK)) {
            key_map = key_maps[shift_final ^ (1 << KG_SHIFT)];
            if (key_map) keysym = key_map[keycode];
        }
    }
    param.value = keysym;
    rc = atomic_notifier_call_chain(&keyboard_notifier_list, KBD_KEYSYM, &param);
    if (rc == NOTIFY_STOP) return;
    if ((raw_mode || kbd->kbdmode == VC_OFF) && type != KT_SPEC && type != KT_SHIFT) return;
    (*k_handler[type])(vc, keysym & 0xff, !down);
    param.ledstate = kbd->ledflagstate;
    atomic_notifier_call_chain(&keyboard_notifier_list, KBD_POST_KEYSYM, &param);
    if (type != KT_SLOCK) kbd->slockstate = 0;
}
(немного свернул форматирование)
Выходит, что не попадают символы из русской Unicode/UTF-8 таблицы в блок "if (type == KT_LETTER) { ... }"... и CapsLock для них не срабатывает. Аналогичное поведение легко наблюдать и с ruwin_ctrl_-UTF-8 (переключение по правому Ctrl).

Автор:  burn [ 06 фев 2013 16:25 ]
Заголовок сообщения:  Re: И снова о переключении раскладок...

Описание проблемы переключения раскладок по нажатию клавиш, а не по отпусканию я нашёл на баг-трэкере freedesktop, там же доступен для скачивания патч.

Я пересобрал xorg-server с применённым патчем. С одиночной клавишей для переключения раскладок по прежнему не работает. Имею slackware64 14.0, переключение раскладок по левому Ctrl (Option "XkbOptions" "grp:lctrl_toggle"). Пробовал вот как: запускаю иксы, запускаю эмулятор терминала, пробую набирать в русской и английской раскладке, они прекрасно переключаются по нажатию соответствующей клавиши; зажимаю LCtrl, нажимаю u - набранное в командной строке должно исчезнуть, однако этого не происходит. Пробую с правым Ctrl, работает как и задумано.

Так же пробовал и другие варианты переключения раскладок, Ctrl-Alt, Ctrl-Shift - работают нормально.

Автор:  burn [ 06 фев 2013 16:38 ]
Заголовок сообщения:  Re: И снова о переключении раскладок...

bormant писал(а):
Аналогичное поведение легко наблюдать и с ruwin_ctrl_-UTF-8 (переключение по правому Ctrl).

Я всё-таки стремлюсь добиться того, чтобы работало переключение по одиночной горячей клавише, как в консоли, так и в иксах, проблема с капсом меня пока не интересует.

Относительно плюсиков в map-файлах, они означают лишь то, что эти символы "un-capslockable-by-shift-holding", то есть действие CpLk можно отменить, нажав Shift Пример: включаем CpLk, зажимаем Shift, пробуем набирать буквы - они получаются маленькие. Для не буквенных клавиш такое поведение обычно не требуется.

Автор:  bormant [ 06 фев 2013 19:00 ]
Заголовок сообщения:  Re: И снова о переключении раскладок...

Цитата:
лишь то, что эти символы "un-capslockable-by-shift-holding"
не только, но еще и собственно "capslockable" -- ведь у вас 1 не превращается в !, а 2 в кавычку. А ставит их dumpkeys по признаку KTYP(keysym) == KT_LETTER, посмотрите исходники dumpkeys.
Исходники ядра в части обработки CapsLock уже приводил выше частично. Изменение регистра делается через выбор plain/shift таблицы.

Автор:  burn [ 06 фев 2013 20:31 ]
Заголовок сообщения:  Re: И снова о переключении раскладок...

bormant писал(а):
Цитата:
лишь то, что эти символы "un-capslockable-by-shift-holding"
не только, но еще и собственно "capslockable"
Верно. Тем не менее, мы отклонились от темы. Есть ли способ добиться переключения раскладок по одиночной горячей клавише, как в консоли, так и в иксах? Прошу вас протестировать патч, о котором речь несколькими постами выше, если вам не сложно, и сообщить о работоспособности либо наоборот одиночных клавиш в качестве переключателей раскладок.

Автор:  bormant [ 06 фев 2013 22:05 ]
Заголовок сообщения:  Re: И снова о переключении раскладок...

Начиналось там: https://bugs.freedesktop.org/show_bug.cgi?id=865
Правда точно для двуклавишных только, а про одноклавишные комбинации надо искать/проверять или дописывать.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/