检测X11窗口是否有装饰

时间:2012-12-09 12:59:10

标签: x11 motif

此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一起使用,但我不确定如何解释输出。

1 个答案:

答案 0 :(得分:2)

您解释从XGetWindowProperty获取的数据的方式与解释发送到XChangeProperty的数据的方式相同。

_MOTIF_WM_HINTS的情况下,它是5个long s的数组,或者struct MwmHints(同义词MotifWmHints)。它是5 long个字段的结构,加上几个#define d位标志。它继承自Motif窗口管理器,但我们现在通常不会保留Motif包含和库,因此结构被复制到各个地方(不好的做法,但每个人都在这样做)。您可以在Gnome的xprops.h和其他几个地方找到它的定义。在'网上查找并复制到您的代码,或者在您已经依赖的包含文件中找到它,或者只是查看定义并继续使用您选择的5 long数组。

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

否则,如果窗口根本没有属性(XGetWindowPropertytype设置为None),您可以认为它已经过装饰。

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

当然,有些窗口管理员不使用_MOTIF_WM_HINTS(例如在Motif之前出现的窗口管理器)。如果您有其中一种,则无法使用此方法检查或设置装饰。

不要忘记XFree(hints)