我创建了监控 X11 的简单应用程序_NET_CLIENT_LIST
。当窗口(包括 conky、tint2、...)打开或关闭时,它会打印我的信息。它工作正常,除非我创建菜单(RMB-click 或 front Menu-Bar)它不会打印任何东西 - 这意味着它们不是新窗口,但它们可以从创建它们的窗口中绘制出来,所以什么是吗?
我想在我的应用程序中创建自己的上下文菜单,我不想使用任何工具包(GTK、QT、...)。所以我需要知道它们是如何工作的。
我创建了监控 X11 的简单应用程序_NET_CLIENT_LIST
。当窗口(包括 conky、tint2、...)打开或关闭时,它会打印我的信息。它工作正常,除非我创建菜单(RMB-click 或 front Menu-Bar)它不会打印任何东西 - 这意味着它们不是新窗口,但它们可以从创建它们的窗口中绘制出来,所以什么是吗?
我想在我的应用程序中创建自己的上下文菜单,我不想使用任何工具包(GTK、QT、...)。所以我需要知道它们是如何工作的。
添加另一个答案,因为旧答案完全是针对不同的问题:)
弹出菜单(无论是用人民币激活还是从菜单栏)都是完全正常的 X11 窗口。您在监视程序中看不到它们的原因是您正在监视由窗口管理器引起的更改。弹出菜单通常会完全绕过 WM,因此 WM 不知道它们。
这是通过设置override_redirect
窗口属性XSetWindowAttributes
结构来实现的。为您的弹出菜单设置它(并且仅用于弹出菜单),您应该已经设置好了。
菜单不由 WM 管理,也没有任何 WM 特定的属性。
要在根窗口上查看窗口、捕获XMapNotify
和事件,请使用. 这是一个非常简单的程序,它做了一些事情:XUnmapNotify
SubstructureNotifyMask
#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
它报告可以简单地忽略的虚假事件。
一个更完整的程序可能应该监视SubstructureNotifyMask
和选择的所有事件SubstructureRedirectMask
。