From 9e424adbdddc172ed63ee22995ba4bcc56bef0ce Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Tue, 29 May 2012 16:18:02 +0200 Subject: directfb: Allow a window subclass to allocate a different kind of surface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A subclass of QDirectFbWindow might need to allocate a window with different surface flags. This is the case for the DirectFB EGL plugin and QSurface::OpenGLSurface type of surfaces. Add createDirectFBWindow, make it virtual and call it from the platform integration classes. Add an assert to verify that this method is only called once. Remove the pre DirectFb 1.1 code as it was never really tested. Change-Id: Icf3d262f40bca70e376043935eeb292958f6df5d Reviewed-by: Jørgen Lind --- src/plugins/platforms/directfb/qdirectfb_egl.cpp | 4 +++- .../platforms/directfb/qdirectfbintegration.cpp | 4 +++- src/plugins/platforms/directfb/qdirectfbwindow.cpp | 28 +++++++++++----------- src/plugins/platforms/directfb/qdirectfbwindow.h | 1 + 4 files changed, 21 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/plugins/platforms/directfb/qdirectfb_egl.cpp b/src/plugins/platforms/directfb/qdirectfb_egl.cpp index f595cc4286..65112a4ccd 100644 --- a/src/plugins/platforms/directfb/qdirectfb_egl.cpp +++ b/src/plugins/platforms/directfb/qdirectfb_egl.cpp @@ -203,7 +203,9 @@ EGLSurface QDirectFbEGLContext::eglSurfaceForPlatformSurface(QPlatformSurface *s QPlatformWindow *QDirectFbIntegrationEGL::createPlatformWindow(QWindow *window) const { - return new QDirectFbWindowEGL(window, m_input.data()); + QDirectFbWindow *dfbWindow = new QDirectFbWindowEGL(window, m_input.data()); + dfbWindow->createDirectFBWindow(); + return dfbWindow; } QPlatformOpenGLContext *QDirectFbIntegrationEGL::createPlatformOpenGLContext(QOpenGLContext *context) const diff --git a/src/plugins/platforms/directfb/qdirectfbintegration.cpp b/src/plugins/platforms/directfb/qdirectfbintegration.cpp index 834e7dace7..167fc7acfa 100644 --- a/src/plugins/platforms/directfb/qdirectfbintegration.cpp +++ b/src/plugins/platforms/directfb/qdirectfbintegration.cpp @@ -124,7 +124,9 @@ QPlatformPixmap *QDirectFbIntegration::createPlatformPixmap(QPlatformPixmap::Pix QPlatformWindow *QDirectFbIntegration::createPlatformWindow(QWindow *window) const { - return new QDirectFbWindow(window,m_input.data()); + QDirectFbWindow *dfbWindow = new QDirectFbWindow(window, m_input.data()); + dfbWindow->createDirectFBWindow(); + return dfbWindow; } QAbstractEventDispatcher *QDirectFbIntegration::guiThreadEventDispatcher() const diff --git a/src/plugins/platforms/directfb/qdirectfbwindow.cpp b/src/plugins/platforms/directfb/qdirectfbwindow.cpp index e853b81f6f..4283cb9167 100644 --- a/src/plugins/platforms/directfb/qdirectfbwindow.cpp +++ b/src/plugins/platforms/directfb/qdirectfbwindow.cpp @@ -53,41 +53,41 @@ QT_BEGIN_NAMESPACE QDirectFbWindow::QDirectFbWindow(QWindow *tlw, QDirectFbInput *inputhandler) : QPlatformWindow(tlw), m_inputHandler(inputhandler) { +} + +void QDirectFbWindow::createDirectFBWindow() +{ + Q_ASSERT(!m_dfbWindow.data()); + DFBDisplayLayerConfig layerConfig; IDirectFBDisplayLayer *layer; - layer = toDfbScreen(tlw)->dfbLayer(); - toDfbScreen(tlw)->dfbLayer()->GetConfiguration(layer, &layerConfig); + layer = toDfbScreen(window())->dfbLayer(); + layer->GetConfiguration(layer, &layerConfig); DFBWindowDescription description; memset(&description,0,sizeof(DFBWindowDescription)); description.flags = DFBWindowDescriptionFlags(DWDESC_WIDTH|DWDESC_HEIGHT|DWDESC_POSX|DWDESC_POSY|DWDESC_SURFACE_CAPS -#if DIRECTFB_MINOR_VERSION >= 1 |DWDESC_OPTIONS -#endif |DWDESC_CAPS); - description.width = qMax(1, tlw->width()); - description.height = qMax(1, tlw->height()); - description.posx = tlw->x(); - description.posy = tlw->y(); + description.width = qMax(1, window()->width()); + description.height = qMax(1, window()->height()); + description.posx = window()->x(); + description.posy = window()->y(); if (layerConfig.surface_caps & DSCAPS_PREMULTIPLIED) description.surface_caps = DSCAPS_PREMULTIPLIED; description.pixelformat = layerConfig.pixelformat; -#if DIRECTFB_MINOR_VERSION >= 1 description.options = DFBWindowOptions(DWOP_ALPHACHANNEL); -#endif description.caps = DFBWindowCapabilities(DWCAPS_DOUBLEBUFFER|DWCAPS_ALPHACHANNEL); DFBResult result = layer->CreateWindow(layer, &description, m_dfbWindow.outPtr()); - if (result != DFB_OK) { + if (result != DFB_OK) DirectFBError("QDirectFbWindow: failed to create window", result); - } m_dfbWindow->SetOpacity(m_dfbWindow.data(), 0xff); - - m_inputHandler->addWindow(m_dfbWindow.data(), tlw); + m_inputHandler->addWindow(m_dfbWindow.data(), window()); } QDirectFbWindow::~QDirectFbWindow() diff --git a/src/plugins/platforms/directfb/qdirectfbwindow.h b/src/plugins/platforms/directfb/qdirectfbwindow.h index bc9e4d9c4e..f02f937462 100644 --- a/src/plugins/platforms/directfb/qdirectfbwindow.h +++ b/src/plugins/platforms/directfb/qdirectfbwindow.h @@ -67,6 +67,7 @@ public: void lower(); WId winId() const; + virtual void createDirectFBWindow(); IDirectFBWindow *dfbWindow() const; // helper to get access to DirectFB types -- cgit v1.2.3