右键单击和菜单栏菜单如何工作?

时间:2012-05-21 18:06:34

标签: linux x11

我创建了一个监视X11的_NET_CLIENT_LIST的简单应用程序。当窗口(包括conky,tint2,...)打开或关闭时,它会打印我的信息。它工作正常,除非我创建菜单(RMB-click或前菜单栏)它不会打印任何东西 - 这意味着它们不是新窗口,但它们可以从它们创建的窗口中拉出,所以什么是吗?

我想在我的应用程序中创建自己的上下文菜单,我不想使用任何工具包(GTK,QT,...)。所以我需要知道它们是如何工作的。

2 个答案:

答案 0 :(得分:1)

菜单不受WM管理,也没有任何特定于WM的属性。

要观看窗口,请使用XMapNotify在根窗口中捕获XUnmapNotifySubstructureNotifyMask个事件。这是一个非常简单的程序:

#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);
        }
    }    
}

报告虚假的Unmap事件,可以忽略不计。

更完整的程序应该可以观看由SubstructureNotifyMaskSubstructureRedirectMask选择的所有事件。

答案 1 :(得分:1)

添加另一个答案,因为旧答案完全是针对不同的问题:)

弹出菜单(无论是RMB激活还是菜单栏)都是完全正常的X11窗口。您在监视程序中看不到它们的原因是您正在监视由窗口管理器引起的更改。弹出菜单通常完全绕过WM,因此WM不了解它们。

这是通过设置override_redirect窗口属性XSetWindowAttributes结构来实现的。将其设置为弹出菜单(并且用于弹出菜单),您应该全部设置。