我和XSetWMNormalHints
和XSetWMSizeHints
混淆了。我想设置我的窗口不可调整大小,并且调用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);
根据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_HINTS
。 XSetWMSizeHints
更通用 - 允许您使用任何属性 - 但您可能不需要通用性。
这个问题已经快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);