LINUX.ORG.RU

Проблема с кодами клавиш

 , ,


0

3

Есть клавиатура logitech g103, ОС Debian.
На клавиатуре боковые клавиши G1-G6 выдают те же коды (если верить xev и evrouter) что и обыкновенные F1-F6.
При этом Винда их умеет различать. Вот как бы различить эти коды?
вот например нажимать если G2 и F2
KeyPress event, serial 36, synthetic NO, window 0x1c00001,
root 0x2c3, subw 0x1c00002, time 3267241, (42,47), root:(1599,155),
state 0x10, keycode 68 (keysym 0xffbf, F2), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False

KeyRelease event, serial 36, synthetic NO, window 0x1c00001,
root 0x2c3, subw 0x1c00002, time 3267297, (42,47), root:(1599,155),
state 0x10, keycode 68 (keysym 0xffbf, F2), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False

KeyPress event, serial 36, synthetic NO, window 0x1c00001,
root 0x2c3, subw 0x1c00002, time 3267481, (42,47), root:(1599,155),
state 0x10, keycode 68 (keysym 0xffbf, F2), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False

KeyRelease event, serial 36, synthetic NO, window 0x1c00001,
root 0x2c3, subw 0x1c00002, time 3267569, (42,47), root:(1599,155),
state 0x10, keycode 68 (keysym 0xffbf, F2), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False

Как бы их все таки различить? Эти клавиши Gх от Fх?


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

alegz ★★ ()
Ответ на: комментарий от alegz

Это печально. До этого была G15 - там как то поживее все было, кодов много, разных....

griz ()
Ответ на: комментарий от alegz

ну кстати да, оказалось что если в винде обозвать кнопки как неFx то режим работы клавы меняется. Но тогда нажатий этих клавиш не видно совсем. ни в xev ни в evrouter ни в dmesg. При передергивании USB клавиатура ожидаемо переходит к «режиму совместимости».

Тогда вопрос раз - как ловить коды в этом «хитром режиме»? варианты xev, evrouter и смотреть в dmesg не работают.

griz ()
Ответ на: комментарий от alegz

Удалось выяснить следующее:
из устройства /dev/usb/hiddev0 читаются различные коды для клавиш Gx и Fx
Например для F3
cat /dev/usb/hiddev0 | hexdump
0001850 0001 ff00 0000 0000 0001 ff00 003e 0000
0001860 0001 ff00 0000 0000 0001 ff00 0000 0000
*
00018c0 0001 ff00 0000 0000 0001 ff00 003e 0000
00018d0 0001 ff00 0000 0000 0001 ff00 0000 0000
*
0001930 0001 ff00 0000 0000 0001 ff00 003e 0000
0001940 0001 ff00 0000 0000 0001 ff00 0000 0000
*
00019a0 0001 ff00 0000 0000 0001 ff00 003e 0000
00019b0 0001 ff00 0000 0000 0001 ff00 0000 0000
*
каждое нажатие две строки и одна «звездочка»
для G3
cat /dev/usb/hiddev0 | hexdump
0001a10 0003 ff00 0010 0000 0003 ff00 0000 0000
0001a20 0003 ff00 0000 0000 0003 ff00 0000 0000
0001a30 0003 ff00 0010 0000 0003 ff00 0000 0000
0001a40 0003 ff00 0000 0000 0003 ff00 0000 0000
0001a50 0003 ff00 0010 0000 0003 ff00 0000 0000
0001a60 0003 ff00 0000 0000 0003 ff00 0000 0000
0001a70 0003 ff00 0010 0000 0003 ff00 0000 0000
0001a80 0003 ff00 0000 0000 0003 ff00 0000 0000
0001a90 0003 ff00 0010 0000 0003 ff00 0000 0000
0001aa0 0003 ff00 0000 0000 0003 ff00 0000 0000
две строки на нажите, но без звездочек.

Вопрос - можно ли как то эту информацию транслировать в коды клавиш что бы ее понимал X11 ?

griz ()
Ответ на: комментарий от griz

Это надо не на уровне иксов пилить, а пониже, на уровне hid-input-модуля ядра, hid-logitech.ko или как его там. Там, кстати, для каких-то логитеховских клавиатур прописана особая обработка, но, по-видимому, не для всех. Самому этот протокол hiddev с его кучей ioctl разбирать — дело муторное...

А showkey в консольном режиме тоже этих клавиш не видит?

alegz ★★ ()
Ответ на: комментарий от alegz

Видит, но не различает. Одинаковые коды для Gx и Fx выдает, как собственно и иксы.

На зарубежных форумах изредка трут про похожую задачу http://stackoverflow.com/questions/873975/how-to-capture-raw-hid-input-on-linu но там, как я понял, предлагается писать демона который будет слушать /dev/usb/hiddev0 и транслировать его в эвент. Но для меня это неподъемная задача, я не писатель, я читатель.

Мне надо что то более готовое найти, я сам не напишу.

griz ()
Ответ на: комментарий от griz

Да не, hiddev — это же вообще костыль для всякой экзотики, работающей по hid, типа датчиков. Я ж говорю, по уму hid-input допиливать надо. Можно порыться в мэйллисте kernel-input, на предмет не делал ли уже кто-нибудь что-то похожее. Там встречаются патчи, которые в апстрим ещё/уже не включены.

alegz ★★ ()
Ответ на: комментарий от alegz

А чем обычно обрабатываются данные из hiddev при наличии всякой экзотики? может можно какой то обработчик заставить действовать по поступлению моих данных?

griz ()
Ответ на: комментарий от griz

Да фиг его знает, я как-то глубоко не интересовался. Библиотеки для юзерспейса вроде были какие-то, типа libhidapi. Может, и какая-нибудь питоновская обвязка есть, или даже готовый софт...

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