c++ - Xlib 这个(去掉窗饰)是怎么工作的?

标签 c++ linux xlib window-managers

以下代码如何去除窗口边框?

//note the struct is declared elsewhere, is here just for clarity.
//code is from [http://tonyobryan.com/index.php?article=9][1]
typedef struct Hints
{
    unsigned long   flags;
    unsigned long   functions;
    unsigned long   decorations;
    long            inputMode;
    unsigned long   status;
} Hints;

//code to remove decoration
Hints hints;
Atom property;
hints.flags = 2;
hints.decorations = 0;
property = XInternAtom(display, "_MOTIF_WM_HINTS", true);
XChangeProperty(display,window,property,property,32,PropModeReplace,(unsigned char *)&hints,5);
XMapWindow(display, window);

到目前为止,我了解到 Atom 是一种类似于 Window 和 Display 的标识符,但我无法弄清楚 Hints 结构或“_MOTIF_WM_HINTS”来自何处。谁能为我解释所有这些代码?提前致谢,嗯。

最佳答案

很难找到任何一种看起来像“官方”的标准,但是 _MOTIF_WM_HINTS 属性似乎确实来自... Motif 工具包(好吧,你 猜对了:-))。 参见 the MotifZone site .

警告:以下内容不完整,但我希望能说明一些问题。

XmNmwmDecorations、XmNmwmFunctions 和 XmNmwmInputMode 的文档 工具包的功能表明该属性是各种位掩码 用于控制外观、功能(调整大小、移动...)和输入的值 窗口管理器应该提供/给窗口的模式。 参见 man vendorshell , 或 Oreilly Motif reference books, Vol6a chapter 16 .

属性是整个 X11 事物的一部分。一个窗口可以有任意数量的 其上定义的属性。属性有名称,但设置/获取 属性是通过“原子”(各种标识符)完成的,以避免发送 每次 get/set 调用的整个字符串。 参见 Properties and Atoms

当前窗口管理器(如果有的话)可以对窗口属性使用react 通过设置适当的事件过滤器并作用于 PropertyNotify 来改变 事件,或者简单地检查窗口在被映射(或移动,或其他)时所具有的属性。如果窗口管理器知道 _MOTIF_WM_HINT 属性,它会 解释那些并(希望)做你想做的事。 (注意:我不确定该特权是否已下放到窗口 经理,或者其他窗口是否可以收听那些“PropertyNotify”事件。不是 确保这实际上与您的问题相关。)

所以只要您的窗口管理器知道,您的代码就可以正常工作 关于 _MOTIF_WM_HINTS 属性。

你从获取原子开始 (标识符/快捷方式)使用 XInternAtom,并通过 XChangeProperty() 设置它的值 在窗口实际通过 MapWindow() 绘制之前(不确定是否会 如果您在 MapWindow() 之后执行此操作,则可以工作,这可能取决于您的窗口 经理)。

[编辑:将 .decorations 部分设置为零会清除所有装饰位,因此这基本上要求窗口管理器让您的边界不受干扰。]

我无法在某处“官方”提出该结构的定义。它在 openmotif-2.3.3 发行版的 lib/X11/MwmUtils.h 中定义。不确定 .flags 条目是如何使用的(找不到我一生的代码 :-/)但我怀疑它用于指示您使用的是 {decoration, function, inputMode} “子属性”中的哪一个作用于。 (不要相信我的话。)

作为旁注,使用 _MOTIF_WM_HINTS 可能不是您的最佳选择,对吧 现在。你看过Extended Window Manager hints specification了吗?以及 freedesktop 上的其他信息/标准/草案?我敢打赌大多数“现代”窗口管理器/桌面环境/厨房水槽将倾向于遵守这一点,而不是保持与 Motif 的向后兼容性。我想这一切都取决于您要编写的代码。

感谢阅读:-)

关于c++ - Xlib 这个(去掉窗饰)是怎么工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5134297/

相关文章:

c++ - popen ("ps -fu $USER","r")不会给出所有原始输出结果限制为 81 个字符长

c++ - 使用 XCB 获取窗口标题

c++ - WinInet InternetReadFile 返回 0x8007007a(传递给系统调用的数据区域太小)

c++ - 访问堆栈中的数组会影响性能吗

c++ - 为什么定义常量表达式术语的规则必须如此困惑?

c++ - 自定义分配器仅在 VS 2015 中以 Release模式编译

c++ - 如何在 C++ 源文件中使用一些 Unix 头文件?

linux - 在 2 组/文件之间提取唯一值

python - 在 Python xlib 中绘制窗口边框

linux - xlib/egl 如何在 eglSwapBuffers 上获取 VSync/swapInterval