Me gustaría interceptar el mensaje WM_DELETE_WINDOW
que se publica en una determinada selección de ventanas que una aplicación que estoy escribiendo (AllTray), para que pueda actuar sobre él en lugar de la aplicación que lo recibe. Actualmente estoy tratando de probar esto en el nivel GDK via gdk_display_add_client_message_filter
si es posible, pero estaría contento con una solución Xlib si hay una también; es parece posible, pero parece que no entiendo cómo lo voy a hacer con éxito.¿Interceptar WM_DELETE_WINDOW en X11?
Actualmente, tengo dos programas (escrito en C) que yo estoy tratando de utilizar para obtener esta resuelto, the first one no hace más que crear una ventana y registro que se sabe acerca de WM_DELETE_WINDOW
y the second one intentos de atrapar ese mensaje, pero parece fallar al hacerlo; parece que no hace precisamente nada. ¿Estoy entendiendo mal la documentación sobre esto, o hay algo adicional que debo hacer (o debo evitar usar GDK por completo)?
El trasfondo es el siguiente: antes de volver a escribir AllTray, la forma en que haría las cosas parece ser intentar interceptar un clic del mouse sobre el botón X. Para algunos administradores de ventanas, esto funcionó correctamente, para otros no funcionó en absoluto, y para otros, el usuario tuvo que configurarlo manualmente e indicar a AllTray dónde estaba el botón para cerrar la ventana. Lo que estoy buscando es una solución que no implique un LD_LIBRARY_PRELOAD
y funcionará para cualquier administrador de ventanas/combinación de aplicaciones que cumpla con los estándares actuales y envíe un WM_DELETE_WINDOW
ClientMessage cuando se cierre la ventana.
ACTUALIZACIÓN: Todavía estoy buscando una respuesta. La ruta que estoy tomando en este momento es intentar reparar la ventana y administrarla yo mismo, pero simplemente no puedo hacer que funcione. Después de la reparación, parece que no puedo recuperarlo de ninguna manera. Puede que me esté perdiendo algo muy fundamental, pero no puedo imaginar cómo hacerlo aparecer como mi propia ventana nuevamente, para volver a mostrarla en la pantalla.
ACTUALIZACIÓN 2: Muy bien, así que he golpeado otra pared de ladrillo. La documentación del servidor X dice que establezca StructureNotifyMask en la máscara de eventos de la ventana para recibir los eventos MapNotify y ReparentNotify. Me interesaría recibir cualquiera. Mi pensamiento actual era crear una ventana que sirviera solo como un receptor de eventos, y luego cuando obtengo eventos para cosas interesantes, actúo sobre ellos creando y reparentándolos. Sin embargo, esto simplemente no parece estar funcionando. Los únicos eventos que realmente recibo son eventos de PropertyNotify. Entonces, esta ruta tampoco parece estar haciendo demasiado bien.
Creo que podría ser posible reparenting la ventana dentro de su propio toplevel, y filtrar los eventos que pasa? No creo que la forma en que estás tratando actualmente pueda funcionar. – wrt
¿Hay algún inconveniente para hacerlo de esa manera? Es decir, ¿hay algo en particular que pueda interferir con cosas como XDND o lo que sea? ¿Es una idea portátil (como en, no romperá aplicaciones o administradores de ventanas)? Parece que puedo encontrar muy poca información sobre eso. Supongo que también significa que tendré que crear una nueva ventana "principal" para cada nueva ventana del cliente, ¿correcto? –