C++ `XSetWMNormalHints`和XSetWMSizeHints`
我对C++ `XSetWMNormalHints`和XSetWMSizeHints`,c++,c,x11,xlib,C++,C,X11,Xlib,我对XSetWMNormalHints和xsetwmizehints感到困惑。我想将窗口设置为不可调整大小,对XSetWMNormalHints的调用可以正确地执行此操作。但是如果我调用xsetwmsizehits,实际上什么都不会发生;窗口仍然可以调整大小。这两个函数是如何用于我的目的的,以及XSetWMSizeHints到底做了什么?我已经阅读了很多次文档,但是我仍然感到困惑,所以在这里问一个问题 sh = XAllocSizeHints(); sh->flags = PMinSize
XSetWMNormalHints
和xsetwmizehints
感到困惑。我想将窗口设置为不可调整大小,对XSetWMNormalHints
的调用可以正确地执行此操作。但是如果我调用xsetwmsizehits
,实际上什么都不会发生;窗口仍然可以调整大小。这两个函数是如何用于我的目的的,以及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);
根据报告:
XSetWMNormalHints函数替换指定窗口上的WM_NORMAL_hints属性的大小提示。如果该属性不存在,XSetWMNormalHints将为指定窗口上的WM_NORMAL_hints属性设置大小提示。该属性以WM_SIZE_提示类型和32格式存储
当
XSetwmSizeHitts函数将替换命名窗口上指定属性的大小提示。如果指定的属性不存在,XSetwMsizeHights将为命名窗口上的指定属性设置大小提示。该属性以WM_SIZE_提示类型和32格式存储。要设置窗口的正常大小提示,可以使用XSetWMNormalHints函数
一开始,它显示了
void XSetWMSizeHints(Display *display, Window w, XSizeHints *hints, Atom property);
在注释掉的片段中,它不使用属性(似乎不起作用)。X11原子(请参阅)是与C指针类似的标识符(但实际上不是地址),而PMinSize | pmaxize
则完全不同:设置了特定位的值。编译器接受它,因为两者都是无符号值,但在运行时,该值可能与任何Atom标识符都不匹配
XSetWMNormalHints
是更有用的函数,因为它更新了您通常会使用的属性:WM\u NORMAL\u HINTS
。xsetwmsizehits
更为通用,允许您使用任何属性,但您可能不需要通用性。这个问题已经提出了将近4年,但这可能会为其他类似问题的人澄清
使用WM_NORMAL_HINTS属性调用XSetWMSizeHints与XSetWMNormalHints执行相同的操作。调用xsetwmsizehits的问题在于“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);
#包括//XA_WM_NORMAL_提示
...
sh=XAllocSizeHints();
sh->flags=pmensize | pmaxize;
sh->最小宽度=sh->最大宽度=100;
sh->最小高度=sh->最大高度=100;
//XSetWMNormalHints(d、w、sh);
XSetwmSizeTipts(d、w、sh、XA_WM_NORMAL_提示);
XFree(sh);
我将pmansize | PMaxSize
作为注释行中的属性
参数传递。我做错了什么?欢迎来到堆栈溢出!请格式化您的答案,使其可读。