LINUX.ORG.RU

Переключение раскладки клавиатуры на отпускание, а не на нажатие клавиши


0

0

Дистр: Kubuntu 7.10
отключил в KDE переключение раскладок у клавиатуры,
xorg.conf:
Section "InputDevice"
Identifier "Generic Keyboard"
Driver "kbd"
Option "CoreKeyboard"
Option "XkbRules" "xorg"
Option "XkbModel" "pc105"
Option "XkbLayout" "us,ru"
Option "XkbVariant" ",winkeys"
Option "XkbOptions" "grp:mod1_shift_toggle"
EndSection

по альт+шифт раскладка переключается,
но в приложениях, где есть шорткаты альт+шифт+что-то, при попытке выполнить такой шорткат: у меня переключается раскладка

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

Re: Переключение раскладки клавиатуры на отпускание, а не на нажатие клавиши

а чем "XkbOptions" "grp:caps_toggle" не так?

Rumata ★★ ()

Re: Переключение раскладки клавиатуры на отпускание, а не на нажатие клавиши

Невозможно. По дизайну иксов.

svu ★★★★★ ()

Re: Переключение раскладки клавиатуры на отпускание, а не на нажатие клавиши

>Невозможно. По дизайну иксов.
там нет соответствующего события?

Yupiter ()

Re: Переключение раскладки клавиатуры на отпускание, а не на нажатие клавиши

Событие отпускания есть ЕМНИП. Но переключение раскладки как и другие действия xkb происходят именно по нажатию. Это обрабатывает сам иксовый сервер.

svu ★★★★★ ()

Re: Переключение раскладки клавиатуры на отпускание, а не на нажатие клавиши

ясно, печально,

т.е. либо использовать для переключения кнопку(и), которая не используется в шорткатах,
либо переключать не через xkb? (а через что?)

Yupiter ()

Re: Переключение раскладки клавиатуры на отпускание, а не на нажатие клавиши

Ну самому написать прикладуху, которая перехватывает клавиатуру... Вроде все имеющиеся это тоже делают по нажатию (но тут я могу ошибаться)

svu ★★★★★ ()

Re: Переключение раскладки клавиатуры на отпускание, а не на нажатие клавиши

нет, к этому я не готов: ни морально, ни знаниями :)

спасибо всем откликнувшимся
думаю, воспользуюсь предложением Rumat'ы

Yupiter ()

Re: Переключение раскладки клавиатуры на отпускание, а не на нажатие клавиши

>>По дизайну иксов.

Это как? Есть же KeyPress и KeyRelease event-ы. Так что дизайн Иксов такие вещи предусматривает.

Morgendorffer ()

Re: Переключение раскладки клавиатуры на отпускание, а не на нажатие клавиши

В своей статье An Unreliable Guide to XKB Configuration в главе 2.3 Doug Palmer утверждает, что нажатие клавиши порождает двасобытия, которые транслируются при проходе через keycodes. Т.е. можно предположить, что вина тут не в дизайне Иксов, а в отсутствии необходимых правил в файлах keycodes.

Morgendorffer ()

Re: Переключение раскладки клавиатуры на отпускание, а не на нажатие клавиши

> См. выше про действия xkb

Пф. "Дизайн X-ов" не запрещает послушать нужное событие (XNextEvent(3) или как его там...) и настучать об этом xkb (XkbLockGroup(3)).

2Yupiter: это не совсем перехват и не так страшно как кажется. Посмотри исходники xxkb, она маленькая, понятная и занимается очень похожей проблемой.

alexs ()

Re: Переключение раскладки клавиатуры на отпускание, а не на нажатие клавиши

Вот типа такого ужоса :)

#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/keysym.h>

int main()
{
    Window root;
    XEvent ev;
    int cur = 0;

    Display *dpy = XOpenDisplay(0);

    if (!dpy)
	return 1;

    root = DefaultRootWindow(dpy);

    XGrabKey(dpy, XKeysymToKeycode(dpy, XK_Shift_L), Mod1Mask, root, False,
	     GrabModeAsync, GrabModeAsync);
    XGrabKey(dpy, XKeysymToKeycode(dpy, XK_Alt_L), ShiftMask, root, False,
	     GrabModeAsync, GrabModeAsync);

    for (;;) {
	XNextEvent(dpy, &ev);
	if (ev.type == KeyRelease) {
	    if (cur) {
		system("setxkbmap ru\n");
		/* 100% есть более человеческий способ это сделать :)
		 * просто лень искать про xkb
		 */
		cur = 0;
	    } else {
		system("setxkbmap us\n");
		cur = -1;
	    }
	}
    }
}

anonymous ()

Re: Переключение раскладки клавиатуры на отпускание, а не на нажатие клавиши

Я ж сказал - можно написать об этом прогу. Но это все не то, что реализовано в grp:* XkbOptions - они-то реализуются самим сервером. И вот это - только по нажатию iirc.

svu ★★★★★ ()

Re: Переключение раскладки клавиатуры на отпускание, а не на нажатие клавиши

Я может не правильно понял код, но вроде бы здесь будет переключение и в случает шотката "альт+шифт+что-то", если сначала нажать "альт+шифт", потом клавишу "что-то", потом отпустить клавишу "что-то", а потом опустить "альт+шифт".

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

ИМХО, забыли добавить, "при условии что между нажатием и отпусканием альт+шифт не были нажаты другие клавиши"

mky ★★★★★ ()

Re: Переключение раскладки клавиатуры на отпускание, а не на нажатие клавиши

Как сказано в
http://www.win.tue.nl/~aeb/linux/kbd/scancodes-1.html#ss1.1
на IBM-PC клавиатурах сканкод для отпускания клавиши отличается от сканкода нажатия только добавлением к нему 0x80.
Если заглянуть в файлы /etc/X11/xkb/keycodes/*, то можно увидеть, что там определены сканкоды только для нажатия клавиш. Типа:
...
<TAB> = 23;
<AD01> = 24;
...
Что будет, если добавить туда строки для отпускания клавиш (например, <AD81> = ...;)?

anonymous ()

Re: Переключение раскладки клавиатуры на отпускание, а не на нажатие клавиши

Может лучше мозги SVU пропатчить?
Просто удивительно, насколько он плохо знает устройство xkb, несмотря на то, что написал какую-то переключалку клавиатуры.

anonymous ()

Re: Переключение раскладки клавиатуры на отпускание, а не на нажатие клавиши

Вы путаете нижнеуровневые сканкоды (которые идут от железа в ядро) и кейкоды, которые идут от драйвера клавиатуры (в иксах). Между ними минимум парочка слоев маппинга.

svu ★★★★★ ()

Re: Переключение раскладки клавиатуры на отпускание, а не на нажатие клавиши

Morgendorffer, перелогиньтесь.

И не гоните, если не понимаете разницы между перехватом клавиш в приложении - и переключением групп опциями самого икс-сервера.

svu ★★★★★ ()

Re: Переключение раскладки клавиатуры на отпускание, а не на нажатие клавиши

Почитайте http://pascal.tsu.ru/unixx/en/xkb/gram-compat.html

И если найдете способ привязать action к отпусканию клавиши - я признаю Вашу правоту. А иначе извольте извиниться за хамство и пустой наезд.

С уважением и пр...

svu ★★★★★ ()

Re: Переключение раскладки клавиатуры на отпускание, а не на нажатие клавиши

Извините SVU, я скорее готов поверить в вашу некомпетентность, чем злокозненность авторов Иксов. Сканкод Иксы получают (к примеру, xev сообщает два события - нажатие и отпускание клавиши), а что исключительно по злонамеренности авторов они не пропускают это событие в xkb - не верю!

anonymous ()

Re: Переключение раскладки клавиатуры на отпускание, а не на нажатие клавиши

А может Вы не будете обращаться к вере, а почитаете доки? Тем более что в xkb хватает проблем, о которых Вы и не подозреваете (и не по злонамеренности авторов, а по недомыслию).

Так что почитайте доки - а потом я с удовольствием приму Ваши извинения за обвинение в некомпетентности.

svu ★★★★★ ()

Re: Переключение раскладки клавиатуры на отпускание, а не на нажатие клавиши

Еще раз. Они пропускают оба события в приложение. Это факт. Но нельзя повесить action (в терминах xkb конфигурации) на отпускание. Таки образом нельзя обеспечить переключение групп средствами икс-сервера - при отпускании клавиши.

Различайте эти два принципиально различных сценария - перехват клавиш приложением и обработка их самим сервером. И тогда Вы поймете суть моего утверждения (и свою неправоту)

svu ★★★★★ ()

Re: Переключение раскладки клавиатуры на отпускание, а не на нажатие клавиши

А между ними есть разница? Вот Иван Паскаль считает, что это одно и тоже:
http://pascal.tsu.ru/unixx/other/xkb/setup.html

База данных, необходимых XKB, состоит из 5 компонентов

keycodes
таблицы, которые просто задают символические имена для скан-кодов.
Например
<TLDE>= 49;
<AE01> = 10;

anonymous ()

Re: Переключение раскладки клавиатуры на отпускание, а не на нажатие клавиши

Где он сказал, что это АППАРАТНЫЕ скан-коды? Он выбрал не очень удачный термин "скан-коды". Это коды, которые доставляет драйвер клавиатуры в иксах (либо kbd, либо evdev). Причем с одной и той же клавиатуры разные драйвера дают разные кейкоды (при том что аппаратные сканкоды, понятное дело, не меняются).

svu ★★★★★ ()

Re: Переключение раскладки клавиатуры на отпускание, а не на нажатие клавиши

Ладно, признаю, что со сканкодами был не прав. ХКБ получает уже препарированные хсервером сканкоды от клавиатурного драйвера, которые хотя и напоминают те, что изображаются командой showkey -s, но не настолько чтобы можно было различить нажатия от отпускания клавиш (соответствующий бит попутно замазывается).

Но тем не менее, есть второй вариант - комбинация из SetGroup/LatchGroup/LockGroup, чтобы при нажатии клавиши переключалки суммарная группа остовалась неизменной, а изменения происходили только при отпучкании клавиши,

anonymous ()

Re: Переключение раскладки клавиатуры на отпускание, а не на нажатие клавиши

> признаю, что со сканкодами был не прав

Это как - вместо извинения за "некомпетентность"?

> второй вариант - комбинация из SetGroup/LatchGroup/LockGroup

Второй вариант есть, я его с самого начала указал - руками ловить события и работать с группами. Но это надо делать кодом, отдельной аппликухой (а не установками xkb). Кроме того, коль скоро это реализуется не на сервере, есть опасения насчет всяких race conditions - ведь иксы же не гарантируют порядок доставки сообщений разным приложениям.

svu ★★★★★ ()

Re: Переключение раскладки клавиатуры на отпускание, а не на нажатие клавиши

Хе-хе. Выше я уже один раз извинялся, если предложение пропатчить мозги вам показалось слишком резким. А что "я скорее готов поверить в вашу некомпетентность, чем..." то предложение имело сослагательный оттенок, нежели утвердительный.

>>SetGroup/LatchGroup/LockGroup

А на сервере нельза одновременно к одному нажатию клавиши привязать одновременно действия SetGroup и LockGroup? ХКБ протокол это не запрещает, поскольку предполагется, что события параллелятся. В таком случае, если бы было SetGroup(group=+1);LockGroup(group=-1), то изменение группы произошло бы именно при отжатии клавиши.

Morgendorffer ()

Re: Переключение раскладки клавиатуры на отпускание, а не на нажатие клавиши

Вроде, нельзя несколько акций запихивать в одну клавишу (точно не помню, надо посмотреть структуры данных).

Предлагаемое решение с двумя акциями выглядит как грязный хак - не факт, что это заработало бы как Вы ожидаете. Впрочем, если нельзя - то и обсуждать нечего.

svu ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.