LINUX.ORG.RU

[иксы][клава]и всё таки как?

 


0

0

в продолжение http://www.linux.org.ru/forum/desktop/5104000?lastmod=1279133816226
таки как завести?
кнопки видно только через

cat /dev/input/event4
иксолог с голыми конфигами относительно ввода (кусок о сабже)
[120457.602] (II) config/udev: Adding input device USB-compliant keyboard (/dev/input/event4)
[120457.602] (**) USB-compliant keyboard: Applying InputClass "evdev keyboard catchall"
[120457.602] (**) USB-compliant keyboard: Applying InputClass "Keyboard Defaults"
[120457.602] (**) USB-compliant keyboard: always reports core events
[120457.602] (**) USB-compliant keyboard: Device: "/dev/input/event4"
[120457.607] (--) USB-compliant keyboard: Found 1 mouse buttons
[120457.607] (--) USB-compliant keyboard: Found scroll wheel(s)
[120457.607] (--) USB-compliant keyboard: Found relative axes
[120457.607] (--) USB-compliant keyboard: Found x and y relative axes
[120457.607] (--) USB-compliant keyboard: Found absolute axes
[120457.607] (--) USB-compliant keyboard: Found keys
[120457.607] (II) USB-compliant keyboard: Configuring as mouse
[120457.607] (II) USB-compliant keyboard: Configuring as keyboard
[120457.607] (**) USB-compliant keyboard: YAxisMapping: buttons 4 and 5
[120457.607] (**) USB-compliant keyboard: EmulateWheelButton: 4, EmulateWheelInertia: 10, EmulateWheelTimeout: 200
ничего не работает
куда копать?

★★★★

Я свою Logitech G11 вот так завел:

Section "InputDevice"
	Identifier  "Keyboard0"
	Driver      "evdev"
	Option	"XkbModel"	"logitech_g15"
	Option	"Device"	"/dev/input/event5"
EndSection

Section "InputDevice"
	Identifier  "Keyboard1"
	Driver "evdev"
	Option "Device"  "/dev/input/event8"
	Option "XkbModel"  "syevdev"
EndSection

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

А lsusb что говорит? Моя видится как 3 устройства - 2 клавиатуры и хаб. Кстати, я еще добавлял в /usr/share/X11/XKeysymDB

G1                      :15000001
G2                      :15000002
G3                      :15000003
G4                      :15000004
G5                      :15000005
G6                      :15000006
G7                      :15000007
G8                      :15000008
G9                      :15000009
G10                     :15000010
G11                     :15000011
G12                     :15000012
G13                     :15000013
G14                     :15000014
G15                     :15000015
G16                     :15000016
G17                     :15000017
G18                     :15000018
M1                      :15000019
M2                      :1500001A
M3                      :1500001B
LCD0                    :1500001D
LCD1                    :1500001E
LCD2                    :1500001F
LCD3                    :15000020
LCD4                    :15000021
MR                      :15000022
Без этого клавиши не работали.

kernelpanic ★★★★★
()
Ответ на: комментарий от kernelpanic
megabaks@desktop ~ $ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 002: ID 09da:000a A4 Tech Co., Ltd Port Mouse
Bus 002 Device 004: ID 062a:0201 Creative Labs Defender Office Keyboard (K7310) S Zodiak KM-9010
megabaks@desktop ~ $ 
megabaks ★★★★
() автор топика
Ответ на: комментарий от megabaks

Слушай, а может у тебя в генте твоей что не так? Я серьезно. Запусти для проверки какой-нибудь LiveCD с федорой, мандривой, или убунтой в конце концов.

http://www.google.ru/search?q=Creative+Labs+Defender+Office+Keyboard+(K7310)+S+Zodiak+KM-9010
http://www.orsha.linux.by/forum/index.php?action=printpage;topic=57.0

поставил мандриву 2008.1 free клава завелась без проблем

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

>2008.1
это когда было-то )
ладно - найду чего гляну

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

плохая шутка - постНГ - а тут ещё на клаве и пробел провалился - надо брать...сам понимаешь - всё в печени (

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

да не новая она )
хотя да - ща на новой кнопаю - монстр ещё страшней предыдущей :3

megabaks ★★★★
() автор топика

взял монстра ещё одного - беда такая же
погуглил - под линём беда не у меня одного
один чел запостил сей косяк везде где только смог - ответа так и нет
если что - очередной монстр - http://shop.key.ru/shop/goods/59631/

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

если что - куски

megabaks@desktop ~ $ xinput list
⎡ Virtual core pointer                    	id=2	[master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer              	id=4	[slave  pointer  (2)]
⎜   ↳ A4Tech USB Mouse                        	id=8	[slave  pointer  (2)]
⎜   ↳ KYE 4D device Ergomedia                 	id=10	[slave  pointer  (2)]
⎣ Virtual core keyboard                   	id=3	[master keyboard (2)]
    ↳ Virtual core XTEST keyboard             	id=5	[slave  keyboard (3)]
    ↳ Power Button                            	id=6	[slave  keyboard (3)]
    ↳ Power Button                            	id=7	[slave  keyboard (3)]
    ↳ KYE 4D device Ergomedia                 	id=9	[slave  keyboard (3)]
megabaks@desktop ~ $ 
[685623.328] (II) config/udev: Adding input device KYE 4D device Ergomedia (/dev/input/event3)
[685623.328] (**) KYE 4D device Ergomedia: Applying InputClass "evdev keyboard catchall"
[685623.328] (**) KYE 4D device Ergomedia: Applying InputClass "Keyboard Defaults"
[685623.328] (**) KYE 4D device Ergomedia: always reports core events
[685623.328] (**) KYE 4D device Ergomedia: Device: "/dev/input/event3"
[685623.332] (--) KYE 4D device Ergomedia: Found keys
[685623.332] (II) KYE 4D device Ergomedia: Configuring as keyboard
[685623.332] (II) XINPUT: Adding extended input device "KYE 4D device Ergomedia" (type: KEYBOARD)
[685623.332] (**) Option "xkb_rules" "evdev"
[685623.332] (**) Option "xkb_model" "evdev"
[685623.332] (**) Option "xkb_layout" "us,ru"
[685623.332] (**) Option "xkb_options" "grp:caps_toggle,grp_led:scroll,compose:rwin"
[685623.332] (II) config/udev: Adding input device KYE 4D device Ergomedia (/dev/input/event4)
[685623.332] (**) KYE 4D device Ergomedia: Applying InputClass "evdev keyboard catchall"
[685623.332] (**) KYE 4D device Ergomedia: Applying InputClass "Keyboard Defaults"
[685623.332] (**) KYE 4D device Ergomedia: always reports core events
[685623.332] (**) KYE 4D device Ergomedia: Device: "/dev/input/event4"
[685623.338] (--) KYE 4D device Ergomedia: Found 1 mouse buttons
[685623.338] (--) KYE 4D device Ergomedia: Found scroll wheel(s)
[685623.338] (--) KYE 4D device Ergomedia: Found relative axes
[685623.338] (--) KYE 4D device Ergomedia: Found absolute axes
[685623.338] (--) KYE 4D device Ergomedia: Found keys
[685623.338] (II) KYE 4D device Ergomedia: Configuring as mouse
[685623.338] (II) KYE 4D device Ergomedia: Configuring as keyboard
[685623.338] (II) KYE 4D device Ergomedia: Adding scrollwheel support
[685623.338] (**) KYE 4D device Ergomedia: YAxisMapping: buttons 4 and 5
[685623.338] (**) KYE 4D device Ergomedia: EmulateWheelButton: 4, EmulateWheelInertia: 10, EmulateWheelTimeout: 200
[685623.338] (II) XINPUT: Adding extended input device "KYE 4D device Ergomedia" (type: KEYBOARD)
[685623.338] (**) Option "xkb_rules" "evdev"
[685623.338] (**) Option "xkb_model" "evdev"
[685623.338] (**) Option "xkb_layout" "us,ru"
[685623.338] (**) Option "xkb_options" "grp:caps_toggle,grp_led:scroll,compose:rwin"
[685623.338] (EE) KYE 4D device Ergomedia: failed to initialize for relative axes.
[685623.338] (II) KYE 4D device Ergomedia: initialized for absolute axes.

megabaks ★★★★
() автор топика

ответ на дебил-посты anon_666
по делу будет ответ?

megabaks ★★★★
() автор топика

мыпитя

Тк стандартные драйвера не работают - ковыряй в сорцах причину.
Можно написать отдельный костыль на epoll(), и в нём запуск команд.

anon_666
()
Ответ на: мыпитя от anon_666

Собственно, костыль. Вместо event2 подставить нужный девайс, должны быть права на его чтение; На выходе - хексдамп данных из устройства.

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/select.h>
#include <stdio.h>

#define BUFSZ 100

int main()
{
  fd_set z;
  unsigned char s[BUFSZ];
  int i, f;

  f = open("/dev/input/event2", O_RDONLY | O_NONBLOCK);
  if(f==-1){ puts("error in open\n"); return 0; }

  FD_ZERO(&z); FD_SET(f, &z);

  for(;;){
    if(select(f+1, &z, NULL, NULL, NULL)==-1)
    {
      puts("error in select\n"); return 0;
    }

    puts("\ngot event");

    while((i=read(f, s, BUFSZ)) > 0){
      printf("len: %d s: ", i);
      do{ printf("%02X", s[--i]); }while(i);
    }
  }

  return 0;
}
Анализируй выхлоп, потом можно будет навесить команды на определённые эвенты.

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

повторяю - я не кодер )
для меня это филькина грамота
кстати - а чем это лучше вот этого?

megabaks@desktop ~/scripts $ cat /dev/input/event4 | hexdump 
0000000 d314 4d27 1e4a 0004 0004 0004 0188 000c
0000010 d314 4d27 1e50 0004 0001 01a9 0001 0000
0000020 d314 4d27 1e52 0004 0000 0000 0000 0000
0000030 d314 4d27 d9d2 0004 0004 0004 0188 000c
0000040 d314 4d27 d9d8 0004 0001 01a9 0000 0000
0000050 d314 4d27 d9da 0004 0000 0000 0000 0000
^C
megabaks@desktop ~/scripts $ 

megabaks ★★★★
() автор топика
Ответ на: комментарий от hbars
megabaks@desktop ~/scripts $ ./evtest /dev/input/event4
Input driver version is 1.0.0
Input device ID: bus 0x3 vendor 0x5d5 product 0x8001 version 0x110
Input device name: "KYE 4D device Ergomedia"
Supported events:
  Event type 0 (Sync)
  Event type 1 (Key)
    Event code 113 (Mute)
    Event code 114 (VolumeDown)
    Event code 115 (VolumeUp)
    Event code 116 (Power)
    Event code 119 (Pause)
    Event code 128 (Stop)
    Event code 130 (Props)
    Event code 131 (Undo)
    Event code 133 (Copy)
    Event code 134 (Open)
    Event code 135 (Paste)
    Event code 136 (Find)
    Event code 137 (Cut)
    Event code 138 (Help)
    Event code 139 (Menu)
    Event code 140 (Calc)
    Event code 142 (Sleep)
    Event code 143 (WakeUp)
    Event code 144 (File)
    Event code 150 (WWW)
    Event code 152 (Coffee)
    Event code 155 (Mail)
    Event code 156 (Bookmarks)
    Event code 158 (Back)
    Event code 159 (Forward)
    Event code 161 (EjectCD)
    Event code 163 (NextSong)
    Event code 164 (PlayPause)
    Event code 165 (PreviousSong)
    Event code 166 (StopCD)
    Event code 167 (Record)
    Event code 168 (Rewind)
    Event code 169 (Phone)
    Event code 171 (Config)
    Event code 172 (HomePage)
    Event code 173 (Refresh)
    Event code 174 (Exit)
    Event code 177 (ScrollUp)
    Event code 178 (ScrollDown)
    Event code 181 (?)
    Event code 182 (?)
    Event code 206 (Close)
    Event code 207 (Play)
    Event code 208 (Fast Forward)
    Event code 209 (Bass Boost)
    Event code 210 (Print)
    Event code 213 (Sound)
    Event code 216 (Chat)
    Event code 217 (Search)
    Event code 219 (Finance)
    Event code 223 (Cancel)
    Event code 226 (Media)
    Event code 231 (?)
    Event code 232 (?)
    Event code 233 (?)
    Event code 234 (?)
    Event code 235 (?)
    Event code 256 (Btn0)
    Event code 354 (Goto)
    Event code 358 (Info)
    Event code 362 (Program)
    Event code 366 (PVR)
    Event code 376 (PC)
    Event code 377 (TV)
    Event code 378 (TV2)
    Event code 379 (VCR)
    Event code 380 (VCR2)
    Event code 381 (Sat)
    Event code 383 (CD)
    Event code 384 (Tape)
    Event code 385 (Radio)
    Event code 386 (Tuner)
    Event code 389 (DVD)
    Event code 396 (Memo)
    Event code 397 (Calendar)
    Event code 402 (ChannelUp)
    Event code 403 (ChannelDown)
    Event code 405 (Last)
    Event code 416 (?)
    Event code 417 (?)
    Event code 418 (?)
    Event code 419 (?)
    Event code 420 (?)
    Event code 421 (?)
    Event code 422 (?)
    Event code 423 (?)
    Event code 424 (?)
    Event code 425 (?)
    Event code 426 (?)
    Event code 427 (?)
    Event code 428 (?)
    Event code 429 (?)
    Event code 430 (?)
    Event code 432 (?)
    Event code 433 (?)
    Event code 439 (?)
  Event type 2 (Relative)
    Event code 6 (HWheel)
  Event type 3 (Absolute)
    Event code 32 (Volume)
      Value      0
      Min        0
      Max      752
  Event type 4 (Misc)
    Event code 4 (ScanCode)
Testing ... (interrupt to exit)
Event: time 1294456288.966805, type 4 (Misc), code 4 (ScanCode), value c022e
Event: time 1294456288.966811, type 1 (Key), code 419 (?), value 1
Event: time 1294456288.966812, -------------- Report Sync ------------
Event: time 1294456289.094833, type 4 (Misc), code 4 (ScanCode), value c022e
Event: time 1294456289.094839, type 1 (Key), code 419 (?), value 0
Event: time 1294456289.094840, -------------- Report Sync ------------
Event: time 1294456294.007991, type 4 (Misc), code 4 (ScanCode), value c022d
Event: time 1294456294.007998, type 1 (Key), code 418 (?), value 1
Event: time 1294456294.007999, -------------- Report Sync ------------
Event: time 1294456294.160028, type 4 (Misc), code 4 (ScanCode), value c022d
Event: time 1294456294.160034, type 1 (Key), code 418 (?), value 0
Event: time 1294456294.160035, -------------- Report Sync ------------
Event: time 1294456298.937154, type 4 (Misc), code 4 (ScanCode), value c0188
Event: time 1294456298.937161, type 1 (Key), code 425 (?), value 1
Event: time 1294456298.937162, -------------- Report Sync ------------
Event: time 1294456299.041178, type 4 (Misc), code 4 (ScanCode), value c0188
Event: time 1294456299.041184, type 1 (Key), code 425 (?), value 0
Event: time 1294456299.041185, -------------- Report Sync ------------
Event: time 1294456299.809360, type 4 (Misc), code 4 (ScanCode), value c0186
Event: time 1294456299.809365, type 1 (Key), code 423 (?), value 1
Event: time 1294456299.809367, -------------- Report Sync ------------
Event: time 1294456299.881376, type 4 (Misc), code 4 (ScanCode), value c0186
Event: time 1294456299.881382, type 1 (Key), code 423 (?), value 0
Event: time 1294456299.881383, -------------- Report Sync ------------
Event: time 1294456300.625553, type 4 (Misc), code 4 (ScanCode), value c0184
Event: time 1294456300.625559, type 1 (Key), code 421 (?), value 1
Event: time 1294456300.625561, -------------- Report Sync ------------
Event: time 1294456300.689565, type 4 (Misc), code 4 (ScanCode), value c0184
Event: time 1294456300.689571, type 1 (Key), code 421 (?), value 0
Event: time 1294456300.689572, -------------- Report Sync ------------
^C
megabaks@desktop ~/scripts $
megabaks ★★★★
() автор топика
Ответ на: чёгысэ от anon_666

хм - у меня норм...

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

Ну и соответственно kremote, или что там у вас.

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

это не мыша - на мыше другая проблема:
есть кнопка, которая на одно нажатие генерит 2 нажатия ЛКМ - вот как задать чтоб двойной клик ЛКМ с интервалом <Nms считался за отдельную кнопку, а не за двойной клик?
так - а по-подробнее про lirc/kremote можно?
кстати - имхо проблема с кнопками связана с иксами, которые не понимают коды кноп овер 255
и да - на рабочих (тех что видят xev и соответственно иксы) кнопках xev и evtest показывают разные коды - WTF?

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

irrecord --disable-namespace -H devinput -d /dev/input/your-device-name ./output-file
Попробуй что получится. С lirc у меня давние счеты. Благо на одном avermedia super007 работает родной и rc-5 пульты. Так что думаю помочь смогу. Чем смогу. В инете, бля кстати, инфы как это делать = 0. Все вроде знают, результат ...

hbars ★★★★★
()

короче - таки кое-что завёл из тех кноп, что откликались
по порядку - наложил патч на evdev

diff -Naur xf86-input-evdev-2.5.0/src//evdev.c xf86-input-evdev/src//evdev.c
--- xf86-input-evdev-2.5.0/src//evdev.c	2010-08-16 00:45:25.000000000 +0000
+++ xf86-input-evdev/src//evdev.c	2011-01-09 10:59:23.000000000 +0000
@@ -110,6 +110,46 @@
 static Atom prop_btn_label = 0;
 #endif
 
+static uint16_t
+remapKey(EvdevPtr ev, uint16_t code)
+{
+    uint8_t slice=code/256;
+    uint8_t offs=code%256;
+
+    if (!ev->keyremap) return code;
+    if (!(ev->keyremap->sl[slice])) return code;
+    if (!(ev->keyremap->sl[slice]->cd[offs])) return code;
+    return ev->keyremap->sl[slice]->cd[offs];
+}
+
+static void
+addRemap(EvdevPtr ev,uint16_t code,uint8_t value)
+{
+    uint8_t slice=code/256;
+    uint8_t offs=code%256;
+
+    if (!ev->keyremap) {
+        ev->keyremap=(EvdevKeyRemapPtr)xcalloc(1,sizeof(EvdevKeyRemap));
+    }
+    if (!ev->keyremap->sl[slice]) {
+        ev->keyremap->sl[slice]=(EvdevKeyRemapSlice*)xcalloc(1,sizeof(EvdevKeyRemapSlice));
+     }
+     ev->keyremap->sl[slice]->cd[offs]=value;
+}
+
+static void
+freeRemap(EvdevPtr ev)
+{
+    uint16_t slice;
+    if (!ev->keyremap) return;
+    for (slice=0;slice<256;++slice) {
+        if (!ev->keyremap->sl[slice]) continue;
+        xfree(ev->keyremap->sl[slice]);
+    }
+    xfree(ev->keyremap);
+    ev->keyremap=0;
+}
+
 /* All devices the evdev driver has allocated and knows about.
  * MAXDEVICES is safe as null-terminated array, as two devices (VCP and VCK)
  * cannot be used by evdev, leaving us with a space of 2 at the end. */
@@ -257,6 +297,41 @@
     }
 }
 
+static void
+SetRemapOption(InputInfoPtr pInfo,const char* name,EvdevPtr ev)
+{
+    char *s,*c;
+    unsigned long int code,value;
+    int consumed;
+
+    s = xf86SetStrOption(pInfo->options, name, NULL);
+    if (!s) return;
+    if (!s[0]) {
+        xfree(s);
+        return;
+    }
+
+    c=s;
+    while (sscanf(c," %li = %li %n",&code,&value,&consumed) > 1) {
+        if (code < 0 || code > 65535L) {
+            xf86Msg(X_ERROR,"%s: input code %ld out of range for option \"event_key_remap\", ignoring.\n",pInfo->name,code);
+            continue;
+        }
+        if (value < MIN_KEYCODE || value > 255) {
+            xf86Msg(X_ERROR,"%s: output value %ld out of range for option \"event_key_remap\", ignoring.\n",pInfo->name,code);
+            continue;
+        }
+        xf86Msg(X_INFO,"%s: remapping %ld into %ld.\n",pInfo->name,code,value);
+        addRemap(ev,code,value-MIN_KEYCODE);
+        c+=consumed;
+    }
+
+    if (*c!='\0') {
+        xf86Msg(X_ERROR, "%s: invalid input for option \"event_key_remap\" starting at '%s', ignoring.\n",
+                pInfo->name, c);
+    }
+}
+
 static int wheel_up_button = 4;
 static int wheel_down_button = 5;
 static int wheel_left_button = 6;
@@ -265,10 +340,14 @@
 void
 EvdevQueueKbdEvent(InputInfoPtr pInfo, struct input_event *ev, int value)
 {
-    int code = ev->code + MIN_KEYCODE;
+    int code;
+    static char warned[KEY_CNT];
     EventQueuePtr pQueue;
     EvdevPtr pEvdev = pInfo->private;
 
+    ev->code=remapKey((EvdevPtr)(pInfo->private),ev->code);
+    code = ev->code + MIN_KEYCODE;
+
     /* Filter all repeated events from device.
        We'll do softrepeat in the server, but only since 1.6 */
     if (value == 2
@@ -1117,6 +1196,8 @@
     if (!pEvdev->rmlvo.options)
         SetXkbOption(pInfo, "XkbOptions", &pEvdev->rmlvo.options);
 
+    SetRemapOption(pInfo,"event_key_remap",pEvdev);
+
 #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 5
     if (!InitKeyboardDeviceStruct(device, &pEvdev->rmlvo, NULL, EvdevKbdCtrl))
         return !Success;
@@ -1600,6 +1681,7 @@
             pInfo->fd = -1;
         }
         EvdevRemoveDevice(pInfo);
+        freeRemap(pEvdev);
         pEvdev->min_maj = 0;
 	break;
     }
diff -Naur xf86-input-evdev-2.5.0/src//evdev.h xf86-input-evdev/src//evdev.h
--- xf86-input-evdev-2.5.0/src//evdev.h	2010-08-06 02:26:24.000000000 +0000
+++ xf86-input-evdev/src//evdev.h	2011-01-09 10:59:23.000000000 +0000
@@ -115,6 +115,13 @@
 } EventQueueRec, *EventQueuePtr;
 
 typedef struct {
+    uint8_t cd[256];
+} EvdevKeyRemapSlice;
+typedef struct {
+    EvdevKeyRemapSlice* sl[256];
+} EvdevKeyRemap, *EvdevKeyRemapPtr;
+
+typedef struct {
     const char *device;
     int grabDevice;         /* grab the event device? */
 
@@ -174,6 +181,8 @@
 
     unsigned char btnmap[32];           /* config-file specified button mapping */
 
+    EvdevKeyRemapPtr keyremap;
+
     int reopen_attempts; /* max attempts to re-open after read failure */
     int reopen_left;     /* number of attempts left to re-open the device */
     OsTimerPtr reopen_timer;
через evtest вытащил коды кноп
в xorg.conf
Section "ServerLayout"
     Identifier      "Layout0"
     Screen      0  "Screen0" 0 0
     InputDevice     "Keyboard1" "SendCoreEvents"
EndSection

Section "InputDevice"
     Identifier  "Keyboard1"
     Driver      "evdev"
     Option      "Device" "/dev/input/event4"
     Option      "event_key_remap" "418=185 419=186 423=101 425=156 421=157"
EndSection
строка с event_key_remap собственно описывает переназначения кодов - нужные коды вытащил из
xmodmap -pke
теперь разродиться бы кнопки не откликающиеся ни на что растолкать...

megabaks ★★★★
() автор топика

патчик для 2.6.0(может кому пригодится)

diff -Naur xf86-input-evdev-2.5.99.903/src/evdev.c xf86-input-evdev-2.5.99.903-my//src/evdev.c
--- xf86-input-evdev-2.5.99.903/src/evdev.c	2010-12-23 02:13:15.000000000 +0000
+++ xf86-input-evdev-2.5.99.903-my//src/evdev.c	2011-01-14 12:37:25.000000000 +0000
@@ -127,6 +127,46 @@
 static Atom prop_btn_label = 0;
 #endif
 
+static uint16_t
+remapKey(EvdevPtr ev, uint16_t code)
+{
+    uint8_t slice=code/256;
+    uint8_t offs=code%256;
+
+    if (!ev->keyremap) return code;
+    if (!(ev->keyremap->sl[slice])) return code;
+    if (!(ev->keyremap->sl[slice]->cd[offs])) return code;
+    return ev->keyremap->sl[slice]->cd[offs];
+}
+
+static void
+addRemap(EvdevPtr ev,uint16_t code,uint8_t value)
+{
+    uint8_t slice=code/256;
+    uint8_t offs=code%256;
+
+    if (!ev->keyremap) {
+        ev->keyremap=(EvdevKeyRemapPtr)xcalloc(1,sizeof(EvdevKeyRemap));
+    }
+    if (!ev->keyremap->sl[slice]) {
+        ev->keyremap->sl[slice]=(EvdevKeyRemapSlice*)xcalloc(1,sizeof(EvdevKeyRemapSlice));
+     }
+     ev->keyremap->sl[slice]->cd[offs]=value;
+}
+
+static void
+freeRemap(EvdevPtr ev)
+{
+    uint16_t slice;
+    if (!ev->keyremap) return;
+    for (slice=0;slice<256;++slice) {
+        if (!ev->keyremap->sl[slice]) continue;
+        xfree(ev->keyremap->sl[slice]);
+    }
+    xfree(ev->keyremap);
+    ev->keyremap=0;
+}
+
 /* All devices the evdev driver has allocated and knows about.
  * MAXDEVICES is safe as null-terminated array, as two devices (VCP and VCK)
  * cannot be used by evdev, leaving us with a space of 2 at the end. */
@@ -274,6 +314,41 @@
     }
 }
 
+static void
+SetRemapOption(InputInfoPtr pInfo,const char* name,EvdevPtr ev)
+{
+    char *s,*c;
+    unsigned long int code,value;
+    int consumed;
+
+    s = xf86SetStrOption(pInfo->options, name, NULL);
+    if (!s) return;
+    if (!s[0]) {
+        xfree(s);
+        return;
+    }
+
+    c=s;
+    while (sscanf(c," %li = %li %n",&code,&value,&consumed) > 1) {
+        if (code < 0 || code > 65535L) {
+            xf86Msg(X_ERROR,"%s: input code %ld out of range for option \"event_key_remap\", ignoring.\n",pInfo->name,code);
+            continue;
+        }
+        if (value < MIN_KEYCODE || value > 255) {
+            xf86Msg(X_ERROR,"%s: output value %ld out of range for option \"event_key_remap\", ignoring.\n",pInfo->name,code);
+            continue;
+        }
+        xf86Msg(X_INFO,"%s: remapping %ld into %ld.\n",pInfo->name,code,value);
+        addRemap(ev,code,value-MIN_KEYCODE);
+        c+=consumed;
+    }
+
+    if (*c!='\0') {
+        xf86Msg(X_ERROR, "%s: invalid input for option \"event_key_remap\" starting at '%s', ignoring.\n",
+                pInfo->name, c);
+    }
+}
+
 static int wheel_up_button = 4;
 static int wheel_down_button = 5;
 static int wheel_left_button = 6;
@@ -297,9 +372,13 @@
 void
 EvdevQueueKbdEvent(InputInfoPtr pInfo, struct input_event *ev, int value)
 {
-    int code = ev->code + MIN_KEYCODE;
+    int code;
+    static char warned[KEY_CNT];
     EventQueuePtr pQueue;
 
+    ev->code=remapKey((EvdevPtr)(pInfo->private),ev->code);
+    code = ev->code + MIN_KEYCODE;
+
     /* Filter all repeated events from device.
        We'll do softrepeat in the server, but only since 1.6 */
     if (value == 2
@@ -1263,6 +1342,8 @@
     if (!pEvdev->rmlvo.options)
         SetXkbOption(pInfo, "XkbOptions", &pEvdev->rmlvo.options);
 
+    SetRemapOption(pInfo,"event_key_remap",pEvdev);
+
 #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 5
     if (!InitKeyboardDeviceStruct(device, &pEvdev->rmlvo, NULL, EvdevKbdCtrl))
         return !Success;
@@ -1760,6 +1841,7 @@
             pInfo->fd = -1;
         }
         EvdevRemoveDevice(pInfo);
+        freeRemap(pEvdev);
         pEvdev->min_maj = 0;
 	break;
     }
diff -Naur xf86-input-evdev-2.5.99.903/src/evdev.h xf86-input-evdev-2.5.99.903-my//src/evdev.h
--- xf86-input-evdev-2.5.99.903/src/evdev.h	2010-12-23 02:13:13.000000000 +0000
+++ xf86-input-evdev-2.5.99.903-my//src/evdev.h	2011-01-14 12:39:08.000000000 +0000
@@ -116,6 +116,13 @@
 } EventQueueRec, *EventQueuePtr;
 
 typedef struct {
+    uint8_t cd[256];
+} EvdevKeyRemapSlice;
+typedef struct {
+    EvdevKeyRemapSlice* sl[256];
+} EvdevKeyRemap, *EvdevKeyRemapPtr;
+
+typedef struct {
     const char *device;
     int grabDevice;         /* grab the event device? */
 
@@ -177,6 +184,8 @@
 
     unsigned char btnmap[32];           /* config-file specified button mapping */
 
+    EvdevKeyRemapPtr keyremap;
+
     int reopen_attempts; /* max attempts to re-open after read failure */
     int reopen_left;     /* number of attempts left to re-open the device */
     OsTimerPtr reopen_timer;
теперь вопрос - есть несколько потенциально интерактивных кнопок - в выхлопе strings нашёл проверку запущенных процессов - дык вот - что и как сказать клаве, чтоб завелись кнопы?
кнопы сии для вендо-плеера и мессенджера

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

>в выхлопе strings нашёл проверку запущенных процессов

Кто здесь7 Где нашёл? Хексдамп на эти кнопки не реагирует?

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

всмысле в дире с установленными дровами

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

Не, дизассемблироать это задача другого порядка сложности. Я в таких случаях снифаю под virtualbox-ом.

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