Hi, I am able to receive the input from the uinput device, if I explicitly select extension input events like this:
int main(int argc, char** argv) { Display* display = XOpenDisplay(NULL); Window window = XCreateSimpleWindow(display, RootWindow(display, 0), 1, 1, 500, 500, 0, BlackPixel(display, 0), BlackPixel(display, 0)); int ndevices = 0; XDeviceInfo * devices = XListInputDevices(display, &ndevices); int i = 0; XDevice* uinputDev = NULL; for(;i < ndevices;++i) { if (strcmp(devices[i].name, "uinput-sample") == 0) { uinputDev = XOpenDevice(display, devices[i].id); } } unsigned long keyPressInputClass; unsigned long event_type_base; DeviceKeyPress(uinputDev, event_type_base, keyPressInputClass); XEventClass eventsOfInterest[] = {keyPressInputClass}; XSelectExtensionEvent(display, window, eventsOfInterest, 1); XMapWindow(display, window); XFlush(display); XEvent report; while (1) { XNextEvent(display, &report); switch (report.type) { default: printf("got a %d event\n", report.type); break; } } XFlush(display); sleep(5); return (EXIT_SUCCESS); } This produces the following output: got a 68 event got a 67 event ... Now I have 2 questions: - can I get the same result with an XSelectInput call instead of XSelectExtensionEvent? - If not, in which header are the extension input types (68 and 67 in this case) defined? Kind regards, Arne -----Original-Nachricht----- Betreff: WG: Re: using uinput connect X to proprietary (TCP based) keyboard endpoint Datum: Fri, 17 Oct 2014 02:09:14 +0200 Von: "arne.ad...@t-online.de" <arne.ad...@t-online.de> An: xorg@lists.x.org Hi Peter, thanks for the quick reply. Unfortunately that did not do the trick. When I use my laptop keyboard, I do see the output from my loop, however the simulated scancodes (currently that device just sends the scan code for the letter 'r') from my uinput device are not displayed. This is the output from showkey: sudo showkey -s kb mode was ?UNKNOWN? [ if you are trying this under X, it might not work since the X server is also reading /dev/console ] press any key (program terminates 10s after last keypress)... 0x13 0x13 0x13 0x13 0x13 0x13 0x13 0x13 0x13 0x13 0x13 0x13 0x13 0x13.... This is the output from xinput: xinput test-xi2 uinput-sample | perl -lne ... KeyPress 27 [r] 0x10 [Num_Lock] KeyPress 27 [r] 0x10 [Num_Lock] KeyPress 27 [r] 0x10 [Num_Lock] KeyPress 27 [r] 0x10 [Num_Lock] KeyPress 27 [r] 0x10 [Num_Lock] KeyPress 27 [r] 0x10 [Num_Lock] KeyPress 27 [r] 0x10 [Num_Lock] ... and this is the output without the perl filter: xinput test-xi2 uinput-sample uinput-sample id=15 [slave keyboard (3)] Reporting 1 classes: Class originated from: 15. Type: XIKeyClass Keycodes supported: 248 EVENT type 2 (KeyPress) device: 15 (15) detail: 27 flags: repeat root: 1113.00/127.00 event: 146.00/75.00 buttons: modifiers: locked 0x10 latched 0 base 0 effective: 0x10 group: locked 0 latched 0 base 0 effective: 0 valuators: windows: root 0x285 event 0x3400001 child 0x0 EVENT type 2 (KeyPress) device: 15 (15) detail: 27 flags: repeat root: 1069.00/129.00 event: 102.00/77.00 buttons: modifiers: locked 0x10 latched 0 base 0 effective: 0x10 group: locked 0 latched 0 base 0 effective: 0 valuators: windows: root 0x285 event 0x3400001 child 0x0 EVENT type 2 (KeyPress) device: 15 (15) detail: 27 flags: repeat root: 1061.00/129.00 event: 94.00/77.00 buttons: modifiers: locked 0x10 latched 0 base 0 effective: 0x10 group: locked 0 latched 0 base 0 effective: 0 valuators: windows: root 0x285 event 0x3400001 child 0x3400002 EVENT type 2 (KeyPress) device: 15 (15) detail: 27 flags: repeat root: 1058.00/130.00 event: 91.00/78.00 buttons: modifiers: locked 0x10 latched 0 base 0 effective: 0x10 group: locked 0 latched 0 base 0 effective: 0 valuators: windows: root 0x285 event 0x3400001 child 0x3400002 Kind regards, Arne -----Original-Nachricht----- Betreff: Re: using uinput connect X to proprietary (TCP based) keyboard endpoint Datum: Thu, 16 Oct 2014 17:12:45 +0200 Von: Peter Hutterer <peter.hutte...@who-t.net> An: "arne.ad...@t-online.de" <arne.ad...@t-online.de> Cc: xorg@lists.x.org On Thu, Oct 16, 2014 at 04:48:37AM +0200, arne.ad...@t-online.de wrote: > Hi, > I am trying to integrate a proprietary keyboard, sending linux scancodes via > TCP. > My idea is to use uinput to forward the received keycodes to locally running > applications (including the x server). > In my xorg.conf I have the following section: > > Section "InputDevice" > # to enable user defined virtual keyboard > Identifier "Keyboard1" > Option "Device" "/dev/input/event14" > Driver "evdev" > EndSection > where event14 is the event queue associated to the uinput simulated "device". > I do see the scancodes sent from my device with both commands: > - xinput test-xi2 --root > - showkey -s > However I am not able to intercept the keyboard events in this simple X > application > > int main(int argc, char** argv) > { > Display* display = XOpenDisplay(NULL); > Window window = XCreateSimpleWindow(display, RootWindow(display, 0), 1, 1, > 500, 500, > 0, BlackPixel(display, 0), > BlackPixel(display, 0)); > XSelectInput(display, window, KeyPressMask | KeyReleaseMask); > XMapWindow(display, window); add a XFlush() here, that should do the trick. Cheers, Peter > XEvent report; > while (1) > { > XNextEvent(display, &report); > switch (report.type) > { > case KeyRelease: > printf("got a KeyRelease event: %d, %d\n", report.xkey.keycode, > report.xkey.state); > break; > case KeyPress: > printf("got a KeyPress event: %d, %d\n", report.xkey.keycode, > report.xkey.state); > break; > default: > printf("got a %d event\n", report.type); > break; > > } > } > XFlush(display); > sleep(5); > return (EXIT_SUCCESS); > } > > > > > > > > > _______________________________________________ > xorg@lists.x.org: X.Org support > Archives: http://lists.freedesktop.org/archives/xorg > Info: http://lists.x.org/mailman/listinfo/xorg > Your subscription address: %(user_address)s > _______________________________________________ xorg@lists.x.org: X.Org support Archives: http://lists.freedesktop.org/archives/xorg Info: http://lists.x.org/mailman/listinfo/xorg Your subscription address: %(user_address)s