2010-05-08 9 views
10

나는 Xlib에 수평 스플리터 위젯을 구현했다. 나는 사용자가 &을 스플리터 바에서 드래그 할 때 마우스를 움켜 잡기 위해 사용자가 동적으로 스플릿 바의 양쪽에있는 윈도우의 크기를 조정할 수 있도록 &을 움직일 수있다.X11 : 마우스 포인터를 실제로 가져 오는 방법은 무엇입니까?

나는 왼쪽 마우스 버튼을 놓은 후 XGrabPointer()을 사용했습니다. 이후의 모든 마우스 동작 (드래그)은 왼쪽 버튼을 놓을 때까지 스플리터 창으로 전환되기를 바랍니다.

불행히도, 그런 식으로 작동하지 않는 것 같습니다. 사용자가 너무 빨리 드래그하고 마우스 포인터가 분할 창의 양쪽 중 하나에 들어가면 MotionEvent 메시지가 분할 자 윈도우가 아닌 해당 (자식) 윈도우로 전환됩니다.

내가 잘못 했습니까?

::XGrabPointer(mDisplay, window, True, 
       ButtonPressMask | 
       ButtonReleaseMask | 
       PointerMotionMask | 
       FocusChangeMask | 
       EnterWindowMask | 
        LeaveWindowMask, 
       GrabModeAsync, 
       GrabModeAsync, 
       RootWindow(mDisplay, DefaultScreen(mDisplay)), 
       None, 
       CurrentTime); 

답변

11

나는이 인정 거의 당황 해요,하지만 대답은 참에서 거짓으로 그 세 번째 매개 변수 (owner_events)을 변경하는 것만 큼 간단 밝혀졌다 다음과 같이 내 XGrabPointer() 전화입니다. Xlib tutorial/reference at tronche.com에서

:

owner_events이 거짓 인 경우, 생성 된 모든 포인터 이벤트가 grab_window 관련하여보고하고 event_mask 선택한 경우에만보고됩니다. owner_events가 True이고 생성 된 포인터 이벤트가 일반적으로이 클라이언트에보고되면 평소대로보고됩니다. 그렇지 않으면, 이벤트는 grab_window와 관련하여보고되며 event_mask에 의해 선택된 경우에만보고됩니다.

나는 진실한 경우의 행동을 완전히 이해하고 있는지 확실하지 않지만, 사실이라면 다른 X 프로그램 (즉, 다른 프로세스에 의해 생성 된 창)이 XEvents를받지 못하도록되어있다. 당신의 프로세스에 의해 생성 된 창을 치는 것들은 정상적으로 전달됩니다. 거짓의 경우 모든 이벤트는 선택한 특정 창과 관련하여보고됩니다. 이것은 내가 따라온 행동이었다.

+2

나는 내 자신의 대답을 받아들이 기는 싫지만 그냥 느슨한 말을 묶어 ... –