我正在编写一个程序,它需要在运行 X11 的 Linux 主机上检测正在运行的窗口管理器的名称(例如 Compiz)。
我目前依赖于扩展窗口管理器提示规范,它允许我查询_NET_SUPPORTING_WM_CHECK
以XGetWindowProperty
获取 a 的 ID,Window
然后我可以查询(通过另一个调用XGetWindowProperty
)_NET_WM_NAME
属性:
if ((disp = XOpenDisplay(NULL)))
{
if (!(XGetWindowProperty(disp, DefaultRootWindow(disp), XInternAtom(disp, "_NET_SUPPORTING_WM_CHECK", True),
0, 1024, False, XA_WINDOW, &actual_type, &actual_format, &nitems, &bytes, (unsigned char **) &wm_check_window)))
{
if (!(XGetWindowProperty(disp, *wm_check_window, XInternAtom(disp, "_NET_WM_NAME", True),
0, 1024, False, XInternAtom(disp, "UTF8_STRING", True), &actual_type,
&actual_format, &nitems, &bytes, (unsigned char **) &wm_name)))
{
strncpy(str, (char *) wm_name, MAX_STRLEN);
XFree(wm_name);
}
}
}
这对于符合 EWMH 的窗口管理器非常有效,但对于不符合 EWMH 的窗口管理器根本不起作用。我尝试过获取这些WM_NAME
属性,但它只包含活动窗口的标题(或与标题相关的内容)。
有没有什么方法可以在没有EWMH的情况下通过 X11 获取窗口管理器的实际名称?