【问题标题】:Detect if a X11 window has decorations检测 X11 窗口是否有装饰
【发布时间】:2012-12-09 12:59:10
【问题描述】:

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

【问题讨论】:

    标签: x11 motif


    【解决方案1】:

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

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

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

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

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

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

    别忘了XFree(hints)

    【讨论】:

      猜你喜欢
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 2012-09-14
      • 1970-01-01
      相关资源
      最近更新 更多