2017-05-21 2 views
0

So gestern, ich ausgecheckt the xinput source code, um nachzuahmen, was dort getan wird, so konnte ich einen Tastenanschlag Listener für ein Projekt, das ich mache.Doppel-RawKeyPress Ereignisse mit Xinput2

Nach dem Auschecken des Quellcodes, vor allem test_xi2.c, kam ich damit.

#include <iostream> 
#include <X11/Xlib.h> 
#include <X11/extensions/XInput2.h> 
#include <X11/Xutil.h> 
#include <stdio.h> 
#include <stdlib.h> 


int main() { 
    Display* display = XOpenDisplay(NULL); 
    Window win; 
    win = DefaultRootWindow(display); 


    XIEventMask* m = new XIEventMask; 

    m->deviceid = XIAllDevices; 
    m->mask_len = XIMaskLen(XI_LASTEVENT); 
    m->mask = (unsigned char*)calloc(m->mask_len, sizeof(char)); 

    XISetMask(m->mask, XI_RawKeyPress); 
    XISetMask(m->mask, XI_RawKeyRelease); 

    XISelectEvents(display, win, m, 1); 

    XSync(display, False); 

    while(true) 
     { 
      XEvent ev; 
      XGenericEventCookie *cookie = (XGenericEventCookie*)&ev.xcookie; 
      XNextEvent(display, (XEvent*)&ev); 

      if (XGetEventData(display, cookie) && cookie->type == GenericEvent) { 
       switch (cookie->evtype) { 
       case XI_RawKeyPress: std::cout << "keystroke" << std::endl; break; 
       } 
      } 


      XFreeEventData(display, cookie); 
     } 

    XDestroyWindow(display, win); 

    return 0; 
} 

du kompilieren von g++ main.cpp -lX11 -lXi tun.

Also, wenn Sie es mit der ursprünglichen Quelle vergleichen, werden Sie sehen, das einzige, was ich nicht tun, abgesehen von allen anderen Arten von Ereignissen, die im Moment nutzlos für mich sind, ist die Überprüfung, ob cookie->extension == xi_opcode (line 431 of test_xi2.c). Nach einiger Recherche kam ich zu dem Schluss, dass es nicht wirklich notwendig ist zu prüfen, ob diese Bedingung erfüllt ist. xi_opcode stellt sich als Erweiterungsoperationscode heraus, der unter Verwendung von XQueryExtensionhere abgefragt wird. Ich habe auf meinem Rechner nachgesehen, und die Erweiterung scheint immer 131 zu sein, also ist es nicht so, dass die Hälfte der RawKeyPress-Ereignisse eine Erweiterung hat und die andere Hälfte eine andere Erweiterung hat.

Ich kann wirklich nicht sagen, was sonst noch passieren könnte.

Antwort

1

Es scheint XIAllDevices fängt auch virtuelle „extra“ Geräte, die in diesem Fall eine zweite Tastatur enthält, das heißt, dass Sie alle Tastatur Zeiten abrufen 2.

mit XIAllMasterDevices Versuchen, die alle diese nimmt zusammen in einem " Tastatur".