2012-04-10 3 views
1

X11에서 글로벌 마우스 클릭 이벤트를 캡처하고 싶습니다.Qt : X11로 글로벌 커서 클릭 이벤트를 모니터링 하시겠습니까?

x11event 필터를 설치하려고했지만 전체적으로 작동하지 않습니다. 나는 창을 클릭 할 때

class XApplication: public QApplication 
{ 
    public: 
    XApplication (int & argc, char **argv): 
     QApplication (argc , argv) 
    { 
    } 

protected: 
    bool x11EventFilter (XEvent *e) 
    { 
     qDebug() << "X11 Event: " << e->type; 
     return QApplication::x11EventFilter(e); 
    } 
}; 

UPDATE 나는 창 밖으로 의미

은, 위의 코드가 작동합니다.

+0

는 "글로벌 마우스 클릭"정의합니다. 애플리케이션의 창 안쪽을 클릭하십시오. 응용 프로그램 창 외부를 포함하여 모든 창 안의 아무 곳이나 클릭하십시오. 원하는 이벤트를 받기 위해 Qt가 구독되어 있습니까? 내 추측에 따르면 필터는 Qt 앱이 수신을 신청 한 이벤트 만 표시합니다 ... – pzanoni

답변

2

QX11Info 클래스를 사용하여 Qt에서 X11 정보를 쿼리 할 수 ​​있습니다. 해당 설명서를 참조하십시오. 그런 다음 원시 Xlib을 사용할 수 있습니다.

XGrabPointer()을 사용할 수 있습니다. 그것을 사용하면 다른 애플 리케이션 포인터를 잡는 동안 포인터 이벤트를받지 않습니다. man XGrabPointer이 도움이 될 것입니다.

이벤트를 구독하는 "일반적인"방법은 창에서 XSelectInput()을 사용하는 것이지만 모든 기존 창의 XSelectInput을 호출해야한다는 점이 문제입니다. 해당 man 페이지를 참조하십시오 ...

xxf86dga 확장에는 마우스와 관련된 몇 가지 호출이 있지만 나는 그들이하는 일을 확신하지 못합니다.

XQueryPointer()은 다른 창에서 이벤트를 도용하지 않고 포인터 상태를 쿼리하는 또 다른 방법입니다.

내가 생각할 수있는 유일한 다른 곳은 XInput 확장이지만 그 중 하나가 도움이 될지 확신 할 수 없습니다.

는 X11 이벤트를 처리하기에 좋은 참고의 xev 소스 코드를 참조하십시오 XGrabPointer를 사용 http://cgit.freedesktop.org/xorg/app/xev

샘플 코드 :

#include <stdio.h> 
#include <assert.h> 
#include <X11/Xlib.h> 

int main(void) 
{ 
     Display *d; 
     Window root; 

     d = XOpenDisplay(NULL); 
     assert(d); 

     root = DefaultRootWindow(d); 

     XGrabPointer(d, root, False, ButtonPressMask | ButtonReleaseMask | 
        PointerMotionMask, GrabModeAsync, GrabModeAsync, None, 
        None, CurrentTime); 

     XEvent ev; 
     while (1) {      
       XNextEvent(d, &ev); 
       switch (ev.type) { 
       case ButtonPress: 
         printf("Button press event!\n"); 
         break; 
       case ButtonRelease: 
         printf("Button release event!\n"); 
         break; 
       case MotionNotify: 
         printf("Motion notify event!\n"); 
         break; 
       default: 
         printf("Unknown event...\n"); 
       } 
     } 

     XCloseDisplay(d); 
     return 0; 
} 

사용하여 컴파일을 : gcc x11mouse.c -o x11mouse -lX11

관련 문제