x11 - 检测 X11 窗口是否有装饰

标签 x11 motif

此 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);
    }
}

我想实现“切换模式”。所以我的问题是,有没有办法检测 window 是否有装饰? 我尝试将 XGetWindowProperty 与 _MOTIF_WM_HINTS 一起使用,但我不确定如何解释输出。

最佳答案

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

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

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

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

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

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

不要忘记XFree(提示)

关于x11 - 检测 X11 窗口是否有装饰,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13787553/

相关文章:

pdf - 如何在没有 X11 的情况下从 Octave 音程绘制到 pdf

virtual - ubuntu服务器的虚拟显示器

c - 没有定义实现类过程

c++ - 将 VkMainWindow 保持在底部

c - MOTIF 编译错误/X11/intrinsic.h 丢失

linux - python 3.3 中的 BadIDChoice RENDER 和在 X 上显示的 tk/tcl

c - XmMULTIBYTE_TEXT 或 XmWIDECHAR_TEXT 模式下的 XmStringGenerate()

linux - 将 X11 键盘映射导出到 linux 内核

c - 更改文本字体时标签标题被剪切(Open Motif 2.3.1)

linux - 从 OSF/Motif & Xt 迁移到 GTK+