2014-12-19 5 views
0

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을 사용할 때 포인터가 잡히면 모든 이벤트가 대상 창에 올바르게 전송됩니다. 라이브러리 구현에는 몇 가지 차이가 ​​있어야합니다.

답변

1

OpenGL은 입력 이벤트와 관련이 없으며 X11 이벤트 나 포인터 이벤트가 무엇인지 알지 못하는 채로 항목을 그립니다.

이것은 창 설정에서 SDL과 GLFW가 모두 수행해야합니다.

그러나 나는 왜 포인터를 잡는 지 궁금합니다. Compiz 및 기타 합성 WM이 빌드 된 기초 인 X Composite 확장은 http://www.x.org/archive/X11R7.5/doc/compositeproto/compositeproto.txtRedirectCoordinateTransformCoordinate을 참조하십시오. 포인터를 잡는 대신에 그 기능을 사용해야합니다. 포인터를 잡는 것은 정말 나쁜 생각입니다.

좋아요, 제가 연결 한 (컴퓨터에있는) X 복합 확장 복사본은 여전히 ​​RedirectCoordinate가있는 초안입니다. 좌표 버전 리디렉션이 제거 된 최신 버전이 있습니다 (불행하게도 그 날짜에 동일한 날짜가 표시됩니다 - WTF?).

+0

Edit1 (포인터를 가져 오는 이유에 대한 대답)을 참조하십시오. 나는 X11에 익숙하지 않다. 어쩌면 당신의 솔루션은 내가 찾고있는 것이지만, 어떻게 사용하는지 모르겠습니다. Compiz가 복합 플러그인 에 포함되어 있지만 RedirectCoordinate 또는 TransformCoordinate가 포함 된 헤더를/usr/include 또는/usr/local/include에서 찾을 수 없습니다. 제 경우에 Xcomposite 기능을 구현하는 방법을 설명해 주시겠습니까? – Irbis

0

SDL은 MouseMotion 이벤트를 처리 할 때 마우스 위치를 업데이트합니다. ButtonPress 이벤트에 저장된 좌표는 사용하지 않습니다. 창 관리자가 포인터를 잡고 ButtonPress 이벤트를 SDL 창으로 보내면 수신기 내부의 마우스 위치는 업데이트되지 않습니다. 다음은 예제 솔루션입니다 (다음 코드는 SDL_x11 이벤트의 ButtonPress 레이블 뒤에 섹션에 추가되어야합니다.)c :