2016-07-31 27 views
1

Ich benutze xlib um Tastatureingabe zu erhalten Ich möchte Fenster simulieren ihre getAsynckeystate() um zu prüfen, ob eine Taste gedrückt wird Ich versuchte einen Timer zu verwenden, um das Ergebnis zu reparieren, aber es ist immer noch kaputt . die Funktion sollte immer true zurück, wenn ‚z‘ auch gedrückt gehalten wird, wenn andere Tasten gedrückt werden oder zur gleichen Zeit veröffentlicht (nicht gerade jetzt in Betrieb)xLib XNextEvent überprüft, ob eine Taste gedrückt wird

-Code unten

bool KeyboardState::keyPressed(Display* d, Window curFocus,int revert, Window root) { 
XEvent ev; 
XNextEvent(d, &ev); 
clock_t startTime; 
switch (ev.type) { 
    case FocusOut: 
     if (curFocus != root) 
      XSelectInput(d, curFocus, 0); 

     XGetInputFocus(d, &curFocus, &revert); 
     printf("New focus is %d\n", (int) curFocus); 

     if (curFocus == PointerRoot) 
      curFocus = root; 

     XSelectInput(d, curFocus, KeyReleaseMask | FocusChangeMask | KeyPressMask); 
     break; 

    case KeyPress: 
     ks = XLookupKeysym(&(ev.xkey), 0); 

     if (ks == XK_z) { 

      keyState = true; 
      startTime = clock(); 
     } 
     break; 
    case KeyRelease: 
     if(ks == XK_z && startTime - clock() > 0){ 

     ks = XLookupKeysym(&(ev.xkey), 0); 
      keyState = false; 
     } 
} 
return keyState; 
} 
+1

'if (ks == ...) ...; ks = ...; 'Wenn Sie zuerst eine Variable verwenden und ihr dann einen Wert zuweisen, hat Ihr Programm eine geringe Chance auf ein fehlerhaftes Verhalten. Darüber hinaus ist "clock()" eine falsche Zeitfunktion, die aus einer Reihe von Gründen überprüft werden muss, und die Überprüfung selbst ist redundant. Eine Schlüsselfreigabe kann nicht vor einem Tastendruck ankommen. –

+0

Mein Programm kümmert sich nicht um Pressen oder Schlüsselfreigaben, die beide gleichzeitig ausgelöst werden Warum unterstützt das Unix-System nicht das berühmte "HOLD KEY" -Ereignis ..... –

+0

Ich kann Ihren Satz nicht analysieren. Ihr Programm hat einen Fehler direkt nach "case KeyRelease", beheben Sie es. Entschuldigung, keine Ahnung, was ein "HOLD KEY" Event ist und wofür es berühmt ist. –

Antwort

0

nm folgende Funktion verknüpfen, ist akzeptiert als Antwort:

tronche.com/gui/x/xlib/input/XQueryKeymap.html