summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/testlite
diff options
context:
space:
mode:
authorTom Cooksey <thomas.cooksey@nokia.com>2010-04-29 14:42:19 (GMT)
committerTom Cooksey <thomas.cooksey@nokia.com>2010-04-29 14:51:28 (GMT)
commitc5d7513159feeda384d1c3f97906f7086cb38db8 (patch)
treefb041591a49753981a83d334c81edf1d8be53e69 /src/plugins/platforms/testlite
parent702c0546d7d0c39b436bc4a3ec00e24ef454a9b9 (diff)
downloadQt-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.cpp22
-rw-r--r--src/plugins/platforms/testlite/qglxintegration.h2
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