检测X11窗口是否有装饰



此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个longs的数组,或者可能是struct MwmHints(syn.MotifWmHints)。它是一个由5个long字段和几个#defined位标志组成的结构。它继承自Motif窗口管理器,但我们现在通常不保留Motif包含和库,所以结构会被复制到不同的地方(这是一种糟糕的做法,但每个人都在这样做)。你可以在Gnome的xprops.h和其他一些地方找到它的定义。在网上查找并复制到您的代码中,或者在您已经依赖的包含文件中找到它,或者只查看定义并继续使用您选择的5个long的数组。

您需要在正确的字段中检查正确的标志。对于装饰,请先检查窗口是否为覆盖重定向。如果是,它是未装饰的(显然),你不能添加任何装饰。如果窗口管理器没有运行,它也会被取消装饰,并且在这种情况下也不能添加任何装饰。

否则,如果该窗口根本没有该属性(XGetWindowPropertytype设置为None),则可能会认为它已被装饰。

如果它确实具有属性,并且在flags中设置了MWM_HINTS_DECORATIONS位,则它具有由MWM_DECOR_*位值在decorations字段中指定的装饰。如果字段为非零,则存在一些装饰。AFAIK如果未设置MWM_HINTS_DECORATIONS,则该窗口(令人惊讶地)被装饰。但请你自己测试一下,我不记得了,现在也没有X11机器,所以我不能检查它

当然,有些窗口管理器不使用_MOTIF_WM_HINTS(例如Motif之前的那些)。如果你有其中一个,你不能用这个方法检查或设置装饰。

别忘了XFree(hints)

最新更新