summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorJørgen Lind <jorgen.lind@nokia.com>2010-06-11 09:54:24 (GMT)
committerJørgen Lind <jorgen.lind@nokia.com>2010-06-11 11:23:50 (GMT)
commit7497ae0504a4186103c835c3c0cfca5133f2d50e (patch)
tree5b7828d2afab72354030030bc09fb1fd1e0fd347 /src/plugins
parenta498db43a02972e90df5f1cdd73e90260471f5f8 (diff)
downloadQt-7497ae0504a4186103c835c3c0cfca5133f2d50e.zip
Qt-7497ae0504a4186103c835c3c0cfca5133f2d50e.tar.gz
Qt-7497ae0504a4186103c835c3c0cfca5133f2d50e.tar.bz2
Added QPlatformGLContext to QPlatformWindow
and removed the the creator function. Child QGLWidgets don't work
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/platforms/testlite/qglxintegration.cpp157
-rw-r--r--src/plugins/platforms/testlite/qglxintegration.h25
-rw-r--r--src/plugins/platforms/testlite/qtestliteintegration.cpp18
-rw-r--r--src/plugins/platforms/testlite/qtestliteintegration.h6
-rw-r--r--src/plugins/platforms/testlite/qtestlitewindow.cpp27
-rw-r--r--src/plugins/platforms/testlite/qtestlitewindow.h4
6 files changed, 37 insertions, 200 deletions
diff --git a/src/plugins/platforms/testlite/qglxintegration.cpp b/src/plugins/platforms/testlite/qglxintegration.cpp
index 79596f5..ba89dbd 100644
--- a/src/plugins/platforms/testlite/qglxintegration.cpp
+++ b/src/plugins/platforms/testlite/qglxintegration.cpp
@@ -128,106 +128,24 @@ GLXFBConfig qt_glx_integration_choose_config(MyDisplay* xd, QGLFormat& format, i
return chosenConfig;
}
-
-QGLXGLWidgetSurface::QGLXGLWidgetSurface(MyDisplay* xd)
- : QPlatformGLWidgetSurface()
+QGLXGLContext::QGLXGLContext(WId winId, MyDisplay *xd, QGLFormat& format, QPlatformGLContext* shareContext)
+ : QPlatformGLContext()
, m_xd(xd)
+ , m_drawable((Drawable)winId)
, m_config(0)
- , m_winId(0)
- , m_widget(0)
-{
-}
-
-QGLXGLWidgetSurface::~QGLXGLWidgetSurface()
-{
-}
-
-static Colormap qt_glx_integration_colormap = 0;
-
-
-bool QGLXGLWidgetSurface::create(QGLWidget *widget, QGLFormat& format)
+ , m_context(0)
{
- m_widget = widget;
+ GLXContext shareGlxContext = 0;
+ if (shareContext)
+ shareGlxContext = static_cast<QGLXGLContext*>(shareContext)->glxContext();
m_config = qt_glx_integration_choose_config(m_xd, format, GLX_WINDOW_BIT);
- Window parentWindow = widget->window()->winId();
-
- XVisualInfo* visualInfo;
- visualInfo = glXGetVisualFromFBConfig(m_xd->display, m_config);
-
- // ### This will leak the colormap, but we need a colormap for each visual
-// if (!qt_glx_integration_colormap) {
- qt_glx_integration_colormap = XCreateColormap(m_xd->display, parentWindow,
- visualInfo->visual, AllocNone);
-// }
-
- XSetWindowAttributes windowAttribs;
- windowAttribs.background_pixel = m_xd->whitePixel();
- windowAttribs.border_pixel = m_xd->blackPixel();
- windowAttribs.colormap = qt_glx_integration_colormap;
-
- m_winId = XCreateWindow(m_xd->display, parentWindow,
- widget->x(), widget->y(), widget->width(), widget->height(),
- 0, visualInfo->depth, InputOutput, visualInfo->visual,
- CWBackPixel|CWBorderPixel|CWColormap, &windowAttribs);
+ m_context = glXCreateNewContext(m_xd->display, m_config, GLX_RGBA_TYPE, shareGlxContext, True);
#ifdef MYX11_DEBUG
- qDebug() << "QGLXGLWidgetSurface::create" << hex << "parent" << parentWindow << "win:" << m_winId << widget;
+ qDebug() << "QGLXGLContext::create context" << m_context;
#endif
- XSetWindowBackgroundPixmap(m_xd->display, m_winId, XNone);
- XMapWindow(m_xd->display, m_winId);
-
- XFree(visualInfo);
- return true;
-}
-
-void QGLXGLWidgetSurface::setGeometry(const QRect& rect)
-{
-#ifdef MYX11_DEBUG
- qDebug() << "QGLXGLWidgetSurface::setGeometry" << rect << hex << m_xd->display << m_winId << "toplevel?" << m_widget->isWindow();
-#endif
- //### toplevel QGLWidgets do have a separate X window owned by the surface, but it has a
- // local geometry
- if (m_widget->isWindow())
- XMoveResizeWindow(m_xd->display, m_winId, 0, 0, rect.width(), rect.height());
- else
- 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);
-#ifdef MYX11_DEBUG
- qDebug() << "filterEvent unmap" << hex << m_winId;
-#endif
- }
-
- 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);
-#ifdef MYX11_DEBUG
- qDebug() << "filterEvent reparent" << hex << m_winId << "to:" << m_widget->window()->winId();
-#endif
- }
-
- return false; // Allow the event to pass through to QGLWidget
-}
-
-
-QGLXGLContext::QGLXGLContext(MyDisplay *xd)
- : QPlatformGLContext()
- , m_xd(xd)
- , m_drawable(0)
- , m_config(0)
- , m_context(0)
-{
}
QGLXGLContext::~QGLXGLContext()
@@ -238,63 +156,6 @@ QGLXGLContext::~QGLXGLContext()
}
}
-bool QGLXGLContext::create(QPaintDevice* device, QGLFormat& format, QPlatformGLContext* shareContext)
-{
- Q_UNUSED(format);
-
- if (device->devType() != QInternal::Widget) {
- qWarning("Creating a GL context is only supported on QWidgets");
- return false;
- }
-
- GLXContext shareGlxContext = 0;
- if (shareContext)
- shareGlxContext = static_cast<QGLXGLContext*>(shareContext)->glxContext();
-
-
- QWidget* widget = static_cast<QWidget*>(device);
- QGLWidget* glWidget = qobject_cast<QGLWidget*>(widget);
- if (glWidget) {
- // Take the config from the QGLWidget's glx surface:
- QGLXGLWidgetSurface* surface = static_cast<QGLXGLWidgetSurface*>(glWidget->platformSurface());
- m_config = surface->config();
- m_drawable = (Drawable)surface->winId();
-#ifdef MYX11_DEBUG
- qDebug() << "QGLXGLContext::create" << hex << m_config << m_drawable;
-#endif
- }
- else {
- if (!widget->isTopLevel()) {
- qWarning("Creating a GL context is only supported on top-level QWidgets");
- return false;
- }
- m_drawable = (Drawable)widget->platformWindow()->winId();
-
- // ### This might choose a config with a visual that isn't compatable with the native window:
- m_config = qt_glx_integration_choose_config(m_xd, format, GLX_WINDOW_BIT);
- }
-
- m_context = glXCreateNewContext(m_xd->display, m_config, GLX_RGBA_TYPE, shareGlxContext, True);
-#ifdef MYX11_DEBUG
- qDebug() << "QGLXGLContext::create context" << m_context;
-#endif
-
- // Get the XVisualInfo for the window:
-// XWindowAttributes windowAttribs;
-// XGetWindowAttributes(m_display, m_widget->winId(), &windowAttribs);
-// XVisualInfo visualInfoTemplate;
-// visualInfoTemplate.visualid = 33; //XVisualIDFromVisual(windowAttribs.visual);
-// XVisualInfo *visualInfo;
-// int matchingCount = 0;
-// visualInfo = XGetVisualInfo(m_xd->display, VisualIDMask, &visualInfoTemplate, &matchingCount);
-
-// m_context = glXCreateContext(m_xd->display, visualInfo, 0, True);
-
-// qDebug("Created GLX context 0x%x for visual ID %d", m_context, visualInfoTemplate.visualid);
-
- return true;
-}
-
void QGLXGLContext::makeCurrent()
{
#ifdef MYX11_DEBUG
diff --git a/src/plugins/platforms/testlite/qglxintegration.h b/src/plugins/platforms/testlite/qglxintegration.h
index 0302950..6d9a216 100644
--- a/src/plugins/platforms/testlite/qglxintegration.h
+++ b/src/plugins/platforms/testlite/qglxintegration.h
@@ -42,40 +42,19 @@
#ifndef Q_GLX_CONTEXT_H
#define Q_GLX_CONTEXT_H
-#include <QtOpenGL/qglplatformintegration_lite.h>
+#include <QtGui/QPlatformGLContext>
#include <GL/glx.h>
QT_BEGIN_NAMESPACE
class MyDisplay;
-class QGLXGLWidgetSurface : public QPlatformGLWidgetSurface
-{
-public:
- QGLXGLWidgetSurface(MyDisplay* xd);
- virtual ~QGLXGLWidgetSurface();
-
- virtual bool create(QGLWidget*, QGLFormat&);
- virtual void setGeometry(const QRect&);
- virtual bool filterEvent(QEvent*);
-
- GLXFBConfig config() {return m_config;}
- Window winId() {return m_winId;}
-
-private:
- MyDisplay *m_xd;
- GLXFBConfig m_config;
- Window m_winId;
- QGLWidget* m_widget;
-};
-
class QGLXGLContext : public QPlatformGLContext
{
public:
- QGLXGLContext(MyDisplay* xd);
+ QGLXGLContext(WId winId, MyDisplay *xd, QGLFormat& format, QPlatformGLContext* shareContext);
~QGLXGLContext();
- virtual bool create(QPaintDevice* device, QGLFormat& format, QPlatformGLContext* shareContext);
virtual void makeCurrent();
virtual void doneCurrent();
virtual void swapBuffers();
diff --git a/src/plugins/platforms/testlite/qtestliteintegration.cpp b/src/plugins/platforms/testlite/qtestliteintegration.cpp
index 3fa3495..3ce9b7c 100644
--- a/src/plugins/platforms/testlite/qtestliteintegration.cpp
+++ b/src/plugins/platforms/testlite/qtestliteintegration.cpp
@@ -109,19 +109,15 @@ QTestLiteIntegration::QTestLiteIntegration(bool useOpenGL)
QPixmapData *QTestLiteIntegration::createPixmapData(QPixmapData::PixelType type) const
{
-#ifndef QT_NO_OPENGL
if (mUseOpenGL)
return new QGLPixmapData(type);
-#endif
return new QRasterPixmapData(type);
}
QWindowSurface *QTestLiteIntegration::createWindowSurface(QWidget *widget, WId) const
{
-#ifndef QT_NO_OPENGL
if (mUseOpenGL)
return new QGLWindowSurface(widget);
-#endif
return new QTestLiteWindowSurface(mPrimaryScreen, widget);
}
@@ -140,23 +136,9 @@ QPixmap QTestLiteIntegration::grabWindow(WId window, int x, int y, int width, in
return QPixmap::fromImage(img);
}
-#ifndef QT_NO_OPENGL
bool QTestLiteIntegration::hasOpenGL() const
{
return glXQueryExtension(xd->display, 0, 0) != 0;
}
-QPlatformGLContext *QTestLiteIntegration::createGLContext()
-{
- return new QGLXGLContext(xd);
-}
-
-QPlatformGLWidgetSurface *QTestLiteIntegration::createGLWidgetSurface()
-{
- return new QGLXGLWidgetSurface(xd);
-}
-
-#endif // QT_NO_OPENGL
-
-
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/testlite/qtestliteintegration.h b/src/plugins/platforms/testlite/qtestliteintegration.h
index 8289a5c..01d428c 100644
--- a/src/plugins/platforms/testlite/qtestliteintegration.h
+++ b/src/plugins/platforms/testlite/qtestliteintegration.h
@@ -81,18 +81,12 @@ public:
QList<QPlatformScreen *> screens() const { return mScreens; }
-#ifndef QT_NO_OPENGL
bool hasOpenGL() const;
- QPlatformGLContext * createGLContext();
- QPlatformGLWidgetSurface * createGLWidgetSurface();
-#endif
MyDisplay *xd;
private:
-#ifndef QT_NO_OPENGL
bool mUseOpenGL;
-#endif
QTestLiteScreen *mPrimaryScreen;
QList<QPlatformScreen *> mScreens;
};
diff --git a/src/plugins/platforms/testlite/qtestlitewindow.cpp b/src/plugins/platforms/testlite/qtestlitewindow.cpp
index b5ae4fc..4ddb7ca 100644
--- a/src/plugins/platforms/testlite/qtestlitewindow.cpp
+++ b/src/plugins/platforms/testlite/qtestlitewindow.cpp
@@ -55,6 +55,9 @@
#include <QTimer>
#include <QApplication>
+#include <QtOpenGL/QGLFormat>
+#include "qglxintegration.h"
+
#include <stdio.h>
#include <stdlib.h>
@@ -146,7 +149,7 @@ private:
QTestLiteWindow::QTestLiteWindow(const QTestLiteIntegration *platformIntegration,
QTestLiteScreen */*screen*/, QWidget *window)
- :QPlatformWindow(window)
+ :QPlatformWindow(window), mGLContext(0)
{
xd = platformIntegration->xd;
xd->windowList.append(this);
@@ -191,6 +194,7 @@ QTestLiteWindow::QTestLiteWindow(const QTestLiteIntegration *platformIntegration
setWindowFlags(window->windowFlags()); //##### This should not be the plugin's responsibility
+
//xw->windowTL = this;
}
@@ -661,8 +665,6 @@ void QTestLiteWindow::setWindowTitle(const QString &title)
XSetWMName(xd->display, x_window, &windowName);
}
-
-
GC QTestLiteWindow::createGC()
{
GC gc;
@@ -674,14 +676,14 @@ GC QTestLiteWindow::createGC()
return gc;
}
-
void QTestLiteWindow::paintEvent()
{
#ifdef MYX11_DEBUG
// qDebug() << "QTestLiteWindow::paintEvent" << shm_img.size() << painted;
#endif
- widget()->windowSurface()->flush(widget(), QRect(xpos,ypos,width, height), QPoint());
+ if (QWindowSurface *surface = widget()->windowSurface())
+ surface->flush(widget(), QRect(xpos,ypos,width, height), QPoint());
}
@@ -1005,6 +1007,21 @@ void QTestLiteWindow::setCursor(QCursor * cursor)
XFlush(xd->display);
}
+QPlatformGLContext *QTestLiteWindow::glContext()
+{
+ if (!mGLContext) {
+ mGLContext = createGLContext();
+ }
+ return mGLContext;
+}
+
+QPlatformGLContext *QTestLiteWindow::createGLContext()
+{
+ QGLFormat format;
+ QPlatformGLContext *context = new QGLXGLContext(x_window, xd, format, 0);
+ return context;
+}
+
Cursor QTestLiteWindow::createCursorBitmap(QCursor * cursor)
{
XColor bg, fg;
diff --git a/src/plugins/platforms/testlite/qtestlitewindow.h b/src/plugins/platforms/testlite/qtestlitewindow.h
index 28e49be..5d27f3a 100644
--- a/src/plugins/platforms/testlite/qtestlitewindow.h
+++ b/src/plugins/platforms/testlite/qtestlitewindow.h
@@ -126,6 +126,8 @@ public:
void setCursor(QCursor * cursor);
+ QPlatformGLContext *glContext();
+
private:
int xpos, ypos;
int width, height;
@@ -135,6 +137,7 @@ private:
GC createGC();
Cursor createCursorShape(int cshape);
Cursor createCursorBitmap(QCursor * cursor);
+ QPlatformGLContext *createGLContext();
int currentCursor;
@@ -142,6 +145,7 @@ private:
QTestLiteScreen *mScreen;
Qt::WindowFlags window_flags;
+ QPlatformGLContext *mGLContext;
friend class QTestLiteWindowSurface; // x_window, gc and windowSurface
};