一尘不染

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

linux

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

//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”的来源。谁能为我解释所有这些代码?预先感谢,ell。


阅读 506

收藏
2020-06-03

共1个答案

一尘不染

很难通过某种看起来“正式”的标准来实现,但是_MOTIF_WM_HINTS属性似乎确实来自…
Motif工具包(好吧,您猜到了:-))。请参阅MotifZone网站

警告:以下内容尚不完整,但我希望可以有所启发。

工具箱的XmNmwmDecorations,XmNmwmFunctions和XmNmwmInputMode函数的文档指出,该属性是用于控制窗口管理器应提供/提供给外观,功能(调整大小,移动,…)和输入模式的各种值的位掩码。窗户。请参阅man
vendorshell
Oreilly
Motif参考书,Vol6a第16章

属性是整个X11事物的一部分。窗口可以在其上定义任何数量的属性。属性有一个名称,但是设置/获取属性是通过“原子”(排序的标识符)完成的,以避免每次获取/设置调用都在电线上发送整个字符串。查看属性和原子

当前的窗口管理器(如果有)可以通过设置适当的事件过滤器并作用于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上查看了Extended Window
Manager提示规范
和其他信息/标准/草稿?我敢打赌,大多数“现代”窗口管理器/桌面环境/厨房水槽将倾向于遵守该规范,而不是保持与Motif的向后兼容性。我猜这一切都取决于您要编码的内容。

谢谢阅读 :-)

2020-06-03