События мыши Xlib и ButtonPressMask

Я написал простую программу, которая будет сообщать о событиях нажатия и отпускания клавиш для определенного окна. В моем случае это в основном терминал, так как я запускаю программу из терминала. Я могу получить события нажатия и отпускания клавиш, происходящие в окне терминала (я использовал XSelectInput() с KeyPressMask и KeyReleaseMask на терминале), но то же самое не работает с ButtonPress и ButtonRelease. Не только об этом, но и о любых событиях, связанных с мышью, не сообщается. Любая идея, почему это происходит?

#include
#include
#include
#include
#include
#include

int main() {
Display *display = XOpenDisplay(NULL);
KeySym k;
int revert_to;
Window window;
XEvent event;

XGetInputFocus(display, &window, &revert_to);
XSelectInput(display, window, KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask);

while(1)
{
XNextEvent(display,&event);
  switch (event.type) {

  case KeyPress : printf("Key Pressed\n"); break;
  case KeyRelease : printf("Key Released\n"); break;
  case ButtonPress : printf("Button Pressed\n"); break;
  case ButtonRelease : printf("Button Released\n"); break;
  case EnterNotify : printf("Enter\n"); break;
  }
}
XCloseDisplay(display);
return 0;
}

person Community    schedule 27.11.2009    source источник
comment
также забыл упомянуть, что если я создаю свое собственное окно с помощью xlib, сообщаются события мыши. Означает ли это, что XSelectInput нельзя использовать с окнами, не сопоставленными мной?   -  person    schedule 27.11.2009
comment
Могу я спросить конечную цель того, что вы пытаетесь построить?   -  person kazanaki    schedule 20.08.2010


Ответы (1)


Проблема, с которой вы сталкиваетесь, заключается в том, что Xlib отправляет события ButtonPress/Release только одному клиенту. Я думаю, что у окна, с которым вы работаете, уже есть клиент, который прослушивает события мыши. Поэтому ваш вызов SelectInput фактически не устанавливал маски ButtonPress/Release и генерировал ошибку, которую вы не проверяли.

person Community    schedule 09.03.2010