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