diff options
author | Tom Cooksey <thomas.cooksey@nokia.com> | 2010-04-29 14:42:19 (GMT) |
---|---|---|
committer | Tom Cooksey <thomas.cooksey@nokia.com> | 2010-04-29 14:51:28 (GMT) |
commit | c5d7513159feeda384d1c3f97906f7086cb38db8 (patch) | |
tree | fb041591a49753981a83d334c81edf1d8be53e69 /src/plugins/platforms/testlite | |
parent | 702c0546d7d0c39b436bc4a3ec00e24ef454a9b9 (diff) | |
download | Qt-c5d7513159feeda384d1c3f97906f7086cb38db8.zip Qt-c5d7513159feeda384d1c3f97906f7086cb38db8.tar.gz Qt-c5d7513159feeda384d1c3f97906f7086cb38db8.tar.bz2 |
Fix re-parenting of QGLWidgets in testlite
Diffstat (limited to 'src/plugins/platforms/testlite')
-rw-r--r-- | src/plugins/platforms/testlite/qglxintegration.cpp | 22 | ||||
-rw-r--r-- | src/plugins/platforms/testlite/qglxintegration.h | 2 |
2 files changed, 24 insertions, 0 deletions
diff --git a/src/plugins/platforms/testlite/qglxintegration.cpp b/src/plugins/platforms/testlite/qglxintegration.cpp index 9e83f85..c21c3aa 100644 --- a/src/plugins/platforms/testlite/qglxintegration.cpp +++ b/src/plugins/platforms/testlite/qglxintegration.cpp @@ -123,6 +123,7 @@ QGLXGLWidgetSurface::QGLXGLWidgetSurface(MyDisplay* xd) , m_xd(xd) , m_config(0) , m_winId(0) + , m_widget(0) { } @@ -135,6 +136,8 @@ static Colormap qt_glx_integration_colormap = 0; bool QGLXGLWidgetSurface::create(QGLWidget *widget, QGLFormat& format) { + m_widget = widget; + m_config = qt_glx_integration_choose_config(m_xd, format, GLX_WINDOW_BIT); Window parentWindow = widget->window()->winId(); @@ -168,6 +171,25 @@ void QGLXGLWidgetSurface::setGeometry(const QRect& rect) XMoveResizeWindow(m_xd->display, m_winId, rect.x(), rect.y(), rect.width(), rect.height()); } +bool QGLXGLWidgetSurface::filterEvent(QEvent *e) +{ + if (e->type() == QEvent::ParentAboutToChange) { + // We temporarily hide the window and re-parent it with the root window + // as it's quite likely that the parent window is about to be deleted, + // which would otherwise destroy our window along with it. + XUnmapWindow(m_xd->display, m_winId); + XReparentWindow(m_xd->display, m_winId, m_xd->rootWindow(), 0, 0); + } + + if (e->type() == QEvent::ParentChange) { + // Once we've got a new parent, we need to reparent the window and show it again: + XReparentWindow(m_xd->display, m_winId, m_widget->window()->winId(), m_widget->x(), m_widget->y()); + XMapWindow(m_xd->display, m_winId); + } + + return false; // Allow the event to pass through to QGLWidget +} + QGLXGLContext::QGLXGLContext(MyDisplay *xd) : QPlatformGLContext() diff --git a/src/plugins/platforms/testlite/qglxintegration.h b/src/plugins/platforms/testlite/qglxintegration.h index c7cdc91..0302950 100644 --- a/src/plugins/platforms/testlite/qglxintegration.h +++ b/src/plugins/platforms/testlite/qglxintegration.h @@ -57,6 +57,7 @@ public: virtual bool create(QGLWidget*, QGLFormat&); virtual void setGeometry(const QRect&); + virtual bool filterEvent(QEvent*); GLXFBConfig config() {return m_config;} Window winId() {return m_winId;} @@ -65,6 +66,7 @@ private: MyDisplay *m_xd; GLXFBConfig m_config; Window m_winId; + QGLWidget* m_widget; }; class QGLXGLContext : public QPlatformGLContext |