Xlib这是如何(删除窗口装饰)工作?

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

//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工具包(好吧,你猜对了:-))。 查看MotifZone网站 。

警告:接下来的是不完整的,但是我希望能够抛开一些光。

工具包的XmNmwmDecorations,XmNmwmFunctions和XmNmwmInputMode函数的文档表明,该属性是用于控制窗口管理器应该提供/给予的外观,功能(调整大小,移动,…)和输入模式的各种值的位掩码窗户。 见男人卖壳 ,或奥雷利 Motif参考书,Vol6a第16章 。

属性是整个X11的一部分。 一个窗口可以有任何数量的属性定义在它上面。 属性有一个名称,但设置/获取属性是通过一个“原子”(排序的标识符)来完成的,以避免每个get / set调用发送整个字符串。 请参阅属性和原子

当前窗口管理器(如果有的话)可以通过设置适当的事件过滤器和对PropertyNotify事件进行操作,或者简单地检查窗口被映射(或移动,或其他)时的属性来对窗口属性进行更改。 如果窗口管理器知道_MOTIF_WM_HINT属性,它将解释这些和(希望)做你想做的。 (注意:我并不确定这个权限是否被转移到窗口管理器上,或者其他窗口是否可以听取那些“PropertyNotify”事件。不确定这与你的问题实际上是否相关。

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

您首先通过XInternAtom获取原子(标识符/快捷方式),然后在通过MapWindow()实际绘制窗口之前通过XChangeProperty()设置它的值(不知道如果在MapWindow()之后执行该操作, ,这可能取决于你的窗口管理器)。

[编辑:将.decorations部分设置为零会清除所有的装饰位,所以这就要求窗口管理器本质上离开你的边界。]

我不能拿出那个“官方”的定义那个结构的地方。 它在openmotif-2.3.3发行版的lib / X11 / MwmUtils.h中定义。 不知道如何使用.flags条目(找不到我的生活的代码: – /),但我怀疑它是用来表明你是{decoration,function,inputMode}“sub-properties”哪一个作用于。 (不要拿我的话)。

作为一个侧面说明,使用_MOTIF_WM_HINTS可能不是你现在最好的选择。 您是否在freedesktop上查看了扩展窗口管理器提示规范和其他信息/标准/草稿? 我敢打赌,大多数“现代”窗口管理者/桌面环境/厨房汇将倾向于坚持,而不是保持与Motif的向后兼容性。 所有这一切都取决于你想要编码的东西。

谢谢阅读 :-)