¿Cómo funcionan los menús del botón derecho y de la barra de menús?

Creé una aplicación simple que monitorea los X11 _NET_CLIENT_LIST. Me imprime información cuando la ventana (incluyendo conky,tint2,...) se abre o se cierra. Funciona bien, excepto cuando creo un menú (RMB-clic o barra de menú frontal) no imprimirá nada, eso significa que no son ventanas nuevas, pero se pueden sacar de la ventana desde la que se crearon, ¿y qué? ¿Lo es?

Me gustaría crear mi propio menú contextual en mi aplicación y no quiero usar ningún conjunto de herramientas (GTK, QT,...). Entonces necesito saber cómo funcionan.

preguntado el 21 de mayo de 12 a las 19:05

2 Respuestas

Agregar otra respuesta porque la anterior es para una pregunta completamente diferente :)

Los menús emergentes (ya sea que estén activados con RMB o desde una barra de menú) son ventanas X11 perfectamente normales. La razón por la que no los ve en su programa de monitoreo es que está monitoreando los cambios causados ​​por el administrador de ventanas. Los menús emergentes normalmente pasan por alto el WM por completo, por lo que WM no los conoce.

Esto se logra estableciendo el override_redirect atributo de ventana XSetWindowAttributes estructura. Configúrelo para sus menús emergentes (y , solamente para los menús emergentes) y debería estar todo listo.

contestado el 23 de mayo de 12 a las 13:05

Los menús no son administrados por un WM y no tienen propiedades específicas de WM.

Para mirar ventanas, captura XMapNotify y XUnmapNotify eventos en la ventana raíz, usando SubstructureNotifyMask. Aquí hay un programa muy simple que hace algo:

#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>


int main () {
    Display* d = XOpenDisplay(0);
    if (!d) {
        printf ("Oops...!\n");
        exit (EXIT_FAILURE);
    }

    XSelectInput(d, DefaultRootWindow(d), SubstructureNotifyMask);

    for(;;) {
        XEvent e;
        XNextEvent(d, &e);
        if (e.type == MapNotify) {
            printf ("Window %lx mapped!\n", e.xmap.window);
        }
        if (e.type == UnmapNotify) {
            printf ("Window %lx unmapped!\n", e.xunmap.window);
        }
    }    
}

Reporta espurio Unmap eventos que pueden ser simplemente ignorados.

Un programa más completo probablemente debería ver todos los eventos seleccionados por SubstructureNotifyMask y SubstructureRedirectMask.

contestado el 21 de mayo de 12 a las 20:05

Gracias, pero quiero saber cómo funcionan, no cómo monitorearlos. Porque quiero crear mi propio menú contextual. - Kravemir

Entonces tu pregunta no es muy clara. Primero, ¿por qué tiene que informar que su programa de monitoreo funciona con un tipo de ventana y no funciona con otro, si no tiene la intención de monitorear ventanas en absoluto? En segundo lugar, la pregunta de "cómo funciona" es demasiado amplia e imposible de responder tal cual. No explicas lo que ya sabes y qué tipo de información no puedes encontrar. - norte. 1.8e9-donde-es-mi-parte m.

He modificado mi pregunta, espero que ayude :) - Kravemir

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.