`XSetWMNormalHints`和`XSetWMSizeHints`

问题描述 投票:1回答:2

我和XSetWMNormalHintsXSetWMSizeHints混淆了。我想设置我的窗口不可调整大小,并且调用XSetWMNormalHints正确地执行它。但如果我打电话给XSetWMSizeHints,没有什么事情真的发生;窗口仍可调整大小。 2个函数如何用于我的目的,以及XSetWMSizeHints究竟做了什么?我已多次阅读文档,但我仍然感到困惑,所以在这里提问。

sh = XAllocSizeHints();
sh->flags = PMinSize | PMaxSize;
sh->min_width = sh->max_width = 100;
sh->min_height = sh->max_height = 100;
XSetWMNormalHints(d, w, sh);
//XSetWMSizeHints(d, w, sh, PMinSize | PMaxSize);
XFree(sh);
c++ c x11 xlib
2个回答
1
投票

根据manual page

XSetWMNormalHints函数替换指定窗口上WM_NORMAL_HINTS属性的大小提示。如果该属性尚不存在,XSetWMNormalHints将在指定窗口上设置WM_NORMAL_HINTS属性的大小提示。该属性存储的类型为WM_SIZE_HINTS,格式为32。

XSetWMSizeHints函数替换指定窗口上指定属性的大小提示。如果指定的属性尚不存在,则XSetWMSizeHints将在命名窗口上设置指定属性的大小提示。该属性存储的类型为WM_SIZE_HINTS,格式为32.要设置窗口的正常大小提示,可以使用XSetWMNormalHints函数。

在一开始,它表明

void XSetWMSizeHints(Display *display, Window w, XSizeHints *hints, Atom property); 

在注释掉的片段中,它不使用属性(似乎不起作用)。 X11 Atoms(参见Xlib Programming Manual: Properties and Atoms)是C指针(但实际上不是地址)的标识符,而PMinSize | PMaxSize则完全不同:设置了特定位的值。编译器接受它,因为它们都是无符号值,但在运行时该值可能与任何Atom标识符都不匹配。

XSetWMNormalHints是函数中更有用的函数,因为它更新了您通常使用的属性:WM_NORMAL_HINTSXSetWMSizeHints更通用 - 允许您使用任何属性 - 但您可能不需要通用性。


0
投票

这个问题已经快4年了,但也许这会为其他有类似问题的人澄清。

使用WM_NORMAL_HINTS属性调用XSetWMSizeHints与XSetWMNormalHints的作用相同。调用XSetWMSizeHints的问题是“PminSize | PMaxSize”是一个值而不是属性。以下是修改为使用XSetWMSizeHints和属性的代码。

#include <X11/Xatom.h>  // XA_WM_NORMAL_HINTS
...
sh = XAllocSizeHints();
sh->flags = PMinSize | PMaxSize;
sh->min_width = sh->max_width = 100;
sh->min_height = sh->max_height = 100;
//XSetWMNormalHints(d, w, sh);
XSetWMSizeHints(d, w, sh, XA_WM_NORMAL_HINTS);
XFree(sh);
© www.soinside.com 2019 - 2024. All rights reserved.