此 C 函数可用于在许多窗口管理器中禁用或启用窗口装饰。如果“mode”为“d”,窗口将隐藏装饰,否则,如果“mode”为“D”,窗口将显示它们。
void window_tune_decorations(Display *disp, Window win, char mode) {
long hints[5] = { 2, 0, 0, 0, 0};
Atom motif_hints = XInternAtom(disp, "_MOTIF_WM_HINTS", False);
switch (mode) {
case 'D':
hints[2] = 1;
/* fall through */
case 'd':
XChangeProperty(disp, win, motif_hints, motif_hints, 32, PropModeReplace, (unsigned char *)hints, 5);
break;
default:
fputs("Invalid mode.\n", stderr);
}
}
我想实现“切换模式”。所以我的问题是,有没有办法检测 window 是否有装饰? 我尝试将 XGetWindowProperty 与 _MOTIF_WM_HINTS 一起使用,但我不确定如何解释输出。
最佳答案
您解释从 XGetWindowProperty
获取的数据的方式与解释发送到 XChangeProperty
的数据的方式相同。
就 _MOTIF_WM_HINTS
而言,它是一个 5 long
的数组,或者可能是 struct MwmHints
(同义词。MotifWmHints
)。它是一个由 5 个 long
字段组成的结构,加上几个 #define
d 位标志。它继承自 Motif 窗口管理器,但现在我们通常不保留 Motif 包含文件和库,因此该结构会被复制到各个位置(不好的做法,但每个人都在这样做)。您可以在 Gnome 的 xprops.h
和其他几个地方找到它的定义。在网上查找它并复制到您的代码中,或者在您已经依赖的包含文件中找到它,或者只是查看定义并继续使用 5 long
的数组,您的选择.
您需要检查正确字段中的正确标志。对于装饰,首先检查窗口是否是覆盖重定向的。如果是,则它是未装饰的(显然)并且您不能添加任何装饰。如果窗口管理器没有运行,它也没有被修饰,在这种情况下您也不能添加任何修饰。
否则,如果窗口根本没有该属性(XGetWindowProperty
将 type
设置为 None
),您可能会认为它已被装饰。
如果它确实具有该属性,并且在 flags
中设置了 MWM_HINTS_DECORATIONS
位,则它具有在 decorations
字段中指定的装饰由 MWM_DECOR_*
位值决定。如果该字段非零,则存在一些装饰。 AFAIK 如果 MWM_HINTS_DECORATIONS 未设置,则窗口将被(令人惊讶地)装饰。但请你自己测试一下,我不记得了,而且目前没有 X11 机器,所以我无法检查。
当然,有些窗口管理器不使用 _MOTIF_WM_HINTS
(例如 Motif 之前的窗口管理器)。如果您有其中之一,则无法使用此方法检查或设置装饰。
不要忘记XFree(提示)
。
关于x11 - 检测 X11 窗口是否有装饰,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13787553/