当前位置: 首页 > 面试题库 >

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

郁光熙
2023-03-14
问题内容

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

//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。


问题答案:

很难通过某种看起来“正式”的标准来实现,但是_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()之后html" target="_blank">执行此操作是否可行)
,这可能取决于您的窗口管理器)。

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

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

附带说明一下,使用_MOTIF_WM_HINTS可能不是当前的最佳选择。您是否在freedesktop上查看了Extended Window
Manager提示规范和其他信息/标准/草稿?我敢打赌,大多数“现代”窗口管理器/桌面环境/厨房水槽将倾向于遵守该规范,而不是保持与Motif的向后兼容性。我猜这一切都取决于您要编码的内容。

谢谢阅读 :-)



 类似资料:
  • 有更多像牛奶一样的装饰工..大豆..还有像室内混合咖啡一样的咖啡。等等。 突然顾客想用鞭子代替摩卡。

  • 我有一扇没有装饰的窗户: 我想知道我怎样才能把它做成一扇可拖动的未装饰窗户?我想在用户用鼠标右键选择窗口时更改其位置,然后在按住鼠标键的同时移动鼠标。 附言:我测试了这个解决方案,但它不起作用:

  • 如何删除这个/dev/sdc5 ?

  • 问题内容: 我有一个要动态更改的小部件列表。 如何从窗口中删除小部件? 问题答案: 您可以调用以删除小部件(如果用于将其添加到窗口中)。 例: 如果使用,稍后可以再次显示该小部件,再次调用。如果您想永久删除它,请调用该小部件(这样您将无法重新添加它)。 如果你使用的方法,你可以使用或以 隐藏 的窗口小部件。

  • 问题内容: 我想了解内置功能的工作原理。令我感到困惑的是,它还可以用作装饰器,但是仅当用作内置函数时才接受参数,而不能用作装饰器。 这个例子来自文档: 的论点是和文档字符串。 在下面的代码中用作装饰器。它的对象是函数,但是在上面的代码中,参数中没有对象函数的位置。 并且,和装饰器是如何创建的?我很困惑。 问题答案: 该函数返回一个特殊的描述符对象: 正是这种对象有额外的方法: 这些充当装饰过。他们

  • 我遇到了第三方工具蝗虫群。因此,我继续安装它使用命令pip安装蝗虫群。在文档中,它被指定运行命令swam-h,但是当我运行它时,命令提示符说该命令不被识别。我从安装群文件的地方打开了cmd。对此有什么解决办法吗?