2010-05-08 12 views
10

Implementé un widget de divisor horizontal en Xlib. Intento agarrar el mouse cuando el usuario hace clic en & arrastra en la barra de división (para que el usuario pueda mover dinámicamente la división & y cambiar el tamaño de las ventanas en ambos lados de la barra divisora).X11: ¿Cómo agarro REALMENTE el puntero del mouse?

He utilizado XGrabPointer() después de recibir un clic izquierdo, con la esperanza de que todo el movimiento futuro del mouse (arrastre) se desvíe a la ventana del divisor hasta que se suelte el botón izquierdo.

Desafortunadamente, parece que no funciona así. Si el usuario se arrastra demasiado rápido y el puntero del mouse entra en una de las ventanas a ambos lados de la división, los mensajes de MotionEvent se desvían a esa ventana (secundaria) en lugar de a la ventana del divisor.

¿Qué he hecho mal? Mi XGrabPointer() llamada es el siguiente:

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

Respuesta

11

Estoy casi avergonzado de admitir esto, pero la respuesta resultó ser tan simple como cambiar ese tercer parámetro (owner_events) de verdadero a falso.

Desde el Xlib tutorial/reference at tronche.com:

Si owner_events es falsa, se reportan todos los eventos de puntero generados con respecto a grab_window y se presentan sólo si seleccionada por event_mask. Si owner_events es True y si un evento de puntero generado normalmente se informa a este cliente, se informa como de costumbre. De lo contrario, el evento se informa con respecto a grab_window y solo se informa si está seleccionado por event_mask.

Todavía no estoy seguro de entender por completo el comportamiento del caso True, pero mi interpretación es que si es True, otros programas X (es decir, ventanas creadas por otros procesos) tienen prohibido recibir XEvents, pero aquellos que golpearían cualquier ventana creada por su proceso se entregan normalmente. En el caso falso, todos los eventos se informan con respecto a la ventana específica que ha seleccionado. Este era el comportamiento que estaba buscando.

+2

Odio aceptar mi propia respuesta, pero solo para atar cabos sueltos ... –

Cuestiones relacionadas