我正在尝试一些基本的Xlib东西。我正在创建一个基本窗口,并为其创建一个OpenGL上下文。

我试图防止用户能够调整窗口大小或手动全屏显示窗口。我添加了代码:

XSizeHints hints;
hints.min_width = hints.max_width = setup.w;
hints.min_height = hints.max_height = setup.h;
XSetWMNormalHints(dpy, win, &hints);


起初是可行的。但是,在尝试了它之后,我发现它有时会神秘地停止工作。这不是异常的窗口管理器之类的问题,我使用的是随Ubuntu一起安装的默认Windows管理器。导致它发生变化的原因很奇怪,就是我是否在main中包含以下行:

XWindowAttributes atts;


我放在哪里都没关系。在开始时,或在循环中,甚至返回之后。只要我将其放在主要位置的提示就可以防止调整大小(为清楚起见,该变量的任何名称都可以使用)。无论是否使用它都没有关系,它最初是在这里调用XGetWindowAttributes的。当我尝试将其移动到单独的函数调用中时,我发现了问题。如果将其取出,则该窗口将具有全屏按钮,并且可以缩小它。我尝试将变量声明为其他位置,例如在包含Window和GLXContext的结构中。

这里发生了什么?我的看法是,我的虚拟机中有一个非常微妙且异常的错误,或者是类似的怪事,或者我错过了一些明显的信息。谁能对此有所启发?

最佳答案

好吧,我没有解释为什么在main中声明XWindowAttributes实例能使其正常工作,但是我确实弄清楚了我的代码出了什么问题,并且在进行以下更改时能够使其表现出预期的效果:


请勿如上所述直接创建XSizeHints。如下创建:

XSizeHints *hints = XAllocSizeHints();

在对象中设置标志以指定使用哪些变量:

hints->flags = PMinSize|PMaxSize;

使用XSetWMNormalHints和XSetWMSizeHints:

XSetWMNormalHints(dpy, win, hints);
XSetWMSizeHints(dpy, win, hints, PMinSize|PMaxSize);



我还将一个指针指向结构中包含有关窗口数据的提示。上面的代码加在一起变成:

XSizeHints *hints = wind->hints = XAllocSizeHints();
hints->flags = PMinSize|PMaxSize;
hints->min_width = hints->max_width = setup.w;
hints->min_height = hints->max_height = setup.h;
XSetWMNormalHints(dpy, win, hints);
XSetWMSizeHints(dpy, win, hints, PMinSize|PMaxSize);

关于c++ - XLib-在主函数中构造XWindowAttributes时,窗口提示的行为有所不同吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26580637/

10-11 22:57
查看更多