我創建了一個簡單的應用程序來監視X11的_NET_CLIENT_LIST
。當窗口(包括conky,tint2,...)打開或關閉時,它會打印我的信息。它工作正常,除了當我創建菜單(人民幣點擊或前菜單欄)它不會打印任何東西 - 這意味着他們不是新窗口,但他們可以從他們創建的窗口繪製,所以什麼是嗎?右鍵單擊和菜單欄菜單如何工作?
我想在我的應用程序中創建我自己的上下文菜單,我不想使用任何工具包(GTK,QT,...)。所以我需要知道他們是如何工作的。
我創建了一個簡單的應用程序來監視X11的_NET_CLIENT_LIST
。當窗口(包括conky,tint2,...)打開或關閉時,它會打印我的信息。它工作正常,除了當我創建菜單(人民幣點擊或前菜單欄)它不會打印任何東西 - 這意味着他們不是新窗口,但他們可以從他們創建的窗口繪製,所以什麼是嗎?右鍵單擊和菜單欄菜單如何工作?
我想在我的應用程序中創建我自己的上下文菜單,我不想使用任何工具包(GTK,QT,...)。所以我需要知道他們是如何工作的。
添加另一個答案,因爲舊的是完全不同的問題:)
彈出菜單(無論是人民幣激活或從菜單欄)是完全正常的X11窗口。您在監控程序中沒有看到它們的原因是您正在監控由窗口管理器引起的更改。彈出式菜單通常完全繞過WM,所以WM不知道它們。
這是通過設置override_redirect
窗口屬性XSetWindowAttributes
結構來實現的。將其設置爲彈出式菜單(並且僅適用於彈出式菜單中的),並且應該全部設置好。
菜單不是由WM管理的,也沒有任何WM特定的屬性。
要觀察窗口,使用SubstructureNotifyMask
在根窗口上捕獲XMapNotify
和XUnmapNotify
事件。這裏是一個非常簡單的程序,做一些事情:
#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
所選的所有事件。
謝謝,但我想知道他們如何工作,而不是如何監測他們。因爲我想創建我自己的上下文菜單。 – kravemir
所以你的問題不是很清楚。首先,爲什麼你必須告訴你,如果你根本不打算監視窗口,那麼你的監控程序只能用於一種窗口而不能與另一種窗口一起工作?其次,「如何做它」的問題太廣泛,不可能像現在這樣回答。你不解釋你已經知道的東西,以及你找不到什麼樣的信息。 –
我修改了我的問題,希望它有助於:) – kravemir