3

特定のウィンドウのキープレスとリリースイベントを報告する簡単なプログラムを作成しました。私の場合、端末からプログラムを呼び出すので、ほとんどが端末です。ターミナルウィンドウでキープレスとリリースイベントを取得できます (ターミナルで KeyPressMask と KeyReleaseMask で XSelectInput() を使用しました) が、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;
}
4

1 に答える 1

1

遭遇する問題は、Xlib が ButtonPress/Release イベントを 1 つのクライアントだけに送信することです。あなたが作業しているウィンドウには、マウスイベントをリッスンしているクライアントが既にあると思います。したがって、 SelectInput 呼び出しは実際には ButtonPress/Release マスクを設定せず、チェックしなかったエラーを生成しました。

于 2010-03-09T10:16:56.760 に答える