2016-07-31 4 views
1

Я использую xlib для ввода клавиатуры. Я хочу, чтобы имитировать окна в getAsynckeystate(), чтобы проверить, нажата ли кнопка. Я попытался использовать таймер, чтобы исправить результат, но его все еще сломал , функция должна всегда возвращать истину, если «г» удерживается в нажатом положении, даже если другие клавиши нажаты или отпущены в то же время (не работает прямо сейчас)xlib XNextEvent проверяет, удерживается ли клавиша

кодекса ниже

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

'если (кс == ...) ...; ks = ...; 'Если вы сначала используете переменную, а затем присваиваете ей значение, ваша программа имеет небольшую вероятность ошибочного поведения. Кроме того, 'clock()' является неправильной функцией времени для проверки по ряду причин, а сама проверка является избыточной. Ключ-сигнал не может появиться до нажатия клавиши. –

+0

Моя программа не заботится о прессовых прессах или выпусках ключей, которые оба уволят одновременно. Почему система unix не поддерживает знаменитое событие «HOLD KEY» ..... –

+0

Я не могу разобрать ваше предложение. У вашей программы есть ошибка сразу после 'case KeyRelease', исправить ее. Извините, не знаю, что такое событие «HOLD KEY» и что он знаменит. –

ответ

0

нм связана следующая функция, которая принят в качестве ответа:

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

Смежные вопросы