compiz 창 관리자 용 플러그인을 개발합니다. 변환 된 창 텍스처를 그리고 그 창에 이벤트를 보내려고합니다. 변환 된 창 렌더러 때 나는 모든 xevents을 제어 벗고 포인터를 잡아, 포인터를 잡고 컴 피즈 기능의 주요 부분은 다음과 같습니다포인터가 잡힐 때 XSendEvent를 사용하여 이벤트 보내기
포인터가 나는 버튼을 누른 좌표를 계산하고 내가 를 사용 잡고있다status = XGrabPointer (privateScreen.dpy, privateScreen.eventManager.getGrabWindow(), true,
POINTER_GRAB_MASK,
GrabModeAsync, GrabModeAsync,
privateScreen.rootWindow(), cursor,
CurrentTime);
XSendEvent을 사용하여 대상 창에 이벤트를 보냅니다. Google 크롬 창이나 다음과 같은 간단한 xwindow 응용 프로그램에서 제대로 작동합니다. 불행히도 OpenGL 렌더링을 수행하는 창에 대해 올바르게 작동하지 않습니다. SDL 및 GLFW를 테스트했습니다. 이러한 창은 클릭 이벤트를 받지만 XSendEvent에 지정된 것보다 다른 매개 변수 (xbutton.x_root, xbutton.y_root, xbutton.x, xbutton.y)를 사용합니다. 이벤트를 보낼 때마다 이러한 매개 변수에는 xgrabpointer가 호출되기 전에 마우스 위치와 같은 값이 포함됩니다. 포인터가 잡히지 않으면 XSendEvent의 이벤트가 올바르게 수신됩니다. xsendevent, xgrabpointer와 OpenGL 렌더링을 수행하는 창 사이에는 어떤 특정한 관계가 있어야합니다. 게다가 내 코드가 특정 윈도우에서만 작동하지 않거나 잘못된 것이 있기 때문에 클라이언트 (윈도우) 구현이 다를 수 있습니다.
EDIT1
의 다음 예제를 살펴 보자 : 나는 전체 화면 창을 가지고, 나는 여전히 (예 스케일 변환 (0.5, 0.5, 1.0)에 대한) 변환 창 질감을 그릴 수있는 플러그인을 사용하지만, X11 수 있습니다 전체 화면 창을보고 있으므로 변형 된 텍스처 이벤트 외부의 영역을 클릭하면 창으로 이동합니다. 플러그인에서 포인터를 가져올 때 모든 이벤트의 수신자가 유일한 수신기 인 경우 윈도우 트랜스 폼을 기반으로 cooridnates를 다시 계산하여 창에 보냅니다.
편집 2 Freeglut을 사용할 때 포인터가 잡히면 모든 이벤트가 대상 창에 올바르게 전송됩니다. 라이브러리 구현에는 몇 가지 차이가 있어야합니다.
Edit1 (포인터를 가져 오는 이유에 대한 대답)을 참조하십시오. 나는 X11에 익숙하지 않다. 어쩌면 당신의 솔루션은 내가 찾고있는 것이지만, 어떻게 사용하는지 모르겠습니다. Compiz가 복합 플러그인에 포함되어 있지만 RedirectCoordinate 또는 TransformCoordinate가 포함 된 헤더를/usr/include 또는/usr/local/include에서 찾을 수 없습니다. 제 경우에 Xcomposite 기능을 구현하는 방법을 설명해 주시겠습니까? –
Irbis