此C函数可用于在许多窗口管理器中禁用或启用Windows装饰。如果'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);
}
}
我想实现一个“切换模式”。所以我的问题是,有办法检测窗户是否有装饰? 我尝试将XGetWindowProperty与_MOTIF_WM_HINTS一起使用,但我不确定如何解释输出。
答案 0 :(得分:2)
您解释从XGetWindowProperty
获取的数据的方式与解释发送到XChangeProperty
的数据的方式相同。
在_MOTIF_WM_HINTS
的情况下,它是5个long
s的数组,或者struct MwmHints
(同义词MotifWmHints
)。它是5 long
个字段的结构,加上几个#define
d位标志。它继承自Motif窗口管理器,但我们现在通常不会保留Motif包含和库,因此结构被复制到各个地方(不好的做法,但每个人都在这样做)。您可以在Gnome的xprops.h
和其他几个地方找到它的定义。在'网上查找并复制到您的代码,或者在您已经依赖的包含文件中找到它,或者只是查看定义并继续使用您选择的5 long
数组。
您需要检查右侧字段中的右侧标志。对于装饰,请检查窗口是否首先覆盖重定向。如果是,它是未修饰的(显然),你不能添加任何装饰。如果窗口管理器没有运行,它也是未修饰的,在这种情况下你也不能添加任何装饰。
否则,如果窗口根本没有属性(XGetWindowProperty
将type
设置为None
),您可以认为它已经过装饰。
如果它具有该属性,并且在MWM_HINTS_DECORATIONS
中设置了flags
位,那么它具有decorations
字段中MWM_DECOR_*
字段指定的装饰。如果该字段非零,则存在一些装饰。 AFAIK如果MWM_HINTS_DECORATIONS
未设置,则窗口(令人惊讶地)装饰。但是请自己测试一下,我不记得了,现在没有X11机器所以我无法检查它。
当然,有些窗口管理员不使用_MOTIF_WM_HINTS
(例如在Motif之前出现的窗口管理器)。如果您有其中一种,则无法使用此方法检查或设置装饰。
不要忘记XFree(hints)
。