2

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

4

1 回答 1

4

您以与XGetWindowProperty解释发送到的数据相同的方式解释获得的数据XChangeProperty

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

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

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

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

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

别忘了XFree(hints)

于 2012-12-09T15:49:17.163 回答