2

「XGrabPointer」を使用して、アクティブなウィンドウで発生したマウス クリック イベントを取得しています。しかし、私の要件は、クリックをグローバルに、つまり X11 デスクトップ上の任意のアプリケーションで検出することです。XGrabPointer はアクティブ ウィンドウをブロックするため、他のアプリケーションに移動してマウス クリック イベントを検出できません。

コードは次のとおりです。

#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>

int main(int argc, char **argv)
{
  Display *display;
  XEvent xevent;
  Window window;
  int grb;
  int scr;

  if( (display = XOpenDisplay(NULL)) == NULL )
    return -1;

  unsigned int t_new=0,t_prev=0,t_diff=0;
  scr = DefaultScreen(display);
  window = RootWindow(display, scr);

  while(1) {
    XGrabPointer(display,
                 window,
                 True,
                 PointerMotionMask | ButtonPressMask | ButtonReleaseMask,
                 GrabModeAsync,
                 GrabModeAsync,
                 None,
                 None,
                 CurrentTime);

    XAllowEvents(display,AsyncPointer, CurrentTime);
    XNextEvent(display, &xevent);

    switch (xevent.type) {
      case MotionNotify:{
        printf("motion event\n");
        break;
      }
      case ButtonPress:{
        switch (xevent.xbutton.button) {
          case 1:
            printf("Left Click\n");
            t_prev=t_new;
            printf("Click Occured      : [%d, %d]\n",
                   xevent.xbutton.x_root,
                   xevent.xbutton.y_root);
            break;
          case 2:
            printf("Grabed\n");
            printf("Middle Click\n");
            break;
          case 3:
            printf("Right Click\n");
            break;
          case 4:
            printf("Grabed\n");
            printf("Scroll UP\n");
            break;
          case 5:
            printf("Scroll Down\n");
            break;
        }
        break;
      }
    }
  }
  XUngrabPointer(display,CurrentTime);
  return 0;
}
4

1 に答える 1