X11窗口调整口吃

我在X11中创build一个openGL窗口,并使用glxswapbuffers进行双缓冲。

问题是:渲染看起来很好,但我得到的OpenGL内容弹跳和窗口边框在resize时口吃。

我尝试过滤ConfigureNotify事件,延迟它们,使用glXSwapInterval设置glXSwapIntervalclosures…没有任何工作。

这是我使用的代码

 void Window::redraw() { // Called by any control which needs redrawing XEvent event; memset(&event, 0, sizeof(event)); event.type = Expose; event.xexpose.display = display; XSendEvent(display, window, False, ExposureMask, &event); } void Window::resize(int width, int height) { this->Width = width; this->Height = height; } bool Window::wndProc(XEvent *evt) { switch (evt->type) { case Expose: { if (evt->xexpose.count == 0) { // handle last one only while (XCheckTypedWindowEvent(display, window, Expose, evt)); if (Width != oldWidth || Height != oldHeight) resizeViewportAndUpdateDimensions(); Renderer.drawGLStuff(); this->redraw(); } return true; } break; case ConfigureNotify: { this->resize(evt->xconfigure.width, evt->xconfigure.height); this->redraw(); return true; } break; } } 

注意,这是一个不同的问题(严格链接到resize)比我以前通过XCheckTypedWindowEvent解决的XCheckTypedWindowEvent

https://tronche.com/gui/x/xlib/events/window-state-change/configure.html

https://tronche.com/gui/x/xlib/events/structure-control/resize.html

从我能从这两个链接中读取的信息,ConfigureNotify在更改完成时发生。 ResizeRequest发生在尝试调整大小时。 特别:

X服务器可以向客户端报告ResizeRequest事件,这些客户端想要了解另一个客户端尝试更改窗口大小的信息。

我不喜欢“CAN报告”的声音,但我想你应该试试看。 不要忘记按照链接指示设置适当的事件位。 至于捕捉事件我应该怎么做,我不太清楚…我会清除前台缓冲区,并等待调整大小来完成。