Added workable QScreen API on top of QPlatformScreen.
authorSamuel Rødal <samuel.rodal@nokia.com>
Thu, 21 Jul 2011 11:50:28 +0000 (13:50 +0200)
committerJørgen Lind <jorgen.lind@nokia.com>
Mon, 25 Jul 2011 11:52:09 +0000 (13:52 +0200)
QPlatformIntegration::screens() no longer has to be implemented,
implementations should call QPlatformIntegration::screenAdded() for each
screen instead. This is for being able to support adding screens at
run-time later on, by connecting it to a signal in QGuiApplication.

The QGuiGLContext API has changed a bit, by not sending in all the
parameters in the constructor but instead having a create() function.
The createPlatformGLContext() factory in QPlatformIntegration takes a
QGuiGLContext * instead of a QSurfaceFormat and a share context, similar
to how the window and backing store factory functions work.

The XCB plugin has experimental support for connecting to multiple X
displays simultaneously, creating one or more QScreen for each.

Change-Id: I248a22a4fd3481280710110272c04a30a8021e8f
Reviewed-on: http://codereview.qt.nokia.com/2103
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Jørgen Lind <jorgen.lind@nokia.com>
50 files changed:
examples/opengl/hellowindow/hellowindow.cpp
examples/qpa/windows/main.cpp
examples/qpa/windows/window.cpp
examples/qpa/windows/window.h
src/gui/image/qbitmap.cpp
src/gui/image/qnativeimage.cpp
src/gui/image/qpixmap_blitter.cpp
src/gui/image/qpixmap_qpa.cpp
src/gui/kernel/kernel.pri
src/gui/kernel/qdnd_p.h
src/gui/kernel/qguiapplication.cpp
src/gui/kernel/qguiapplication.h
src/gui/kernel/qguiapplication_p.h
src/gui/kernel/qguiglcontext_qpa.cpp
src/gui/kernel/qguiglcontext_qpa.h
src/gui/kernel/qplatformintegration_qpa.cpp
src/gui/kernel/qplatformintegration_qpa.h
src/gui/kernel/qplatformscreen_qpa.cpp
src/gui/kernel/qplatformscreen_qpa.h
src/gui/kernel/qscreen.h [new file with mode: 0644]
src/gui/kernel/qwindow.cpp
src/gui/kernel/qwindow.h
src/gui/kernel/qwindow_p.h
src/gui/painting/qbackingstore.cpp
src/gui/painting/qcolormap_qpa.cpp
src/gui/text/qfont.cpp
src/opengl/qgl_qpa.cpp
src/platformsupport/eventdispatchers/qeventdispatcher_qpa.cpp
src/plugins/platforms/cocoa/qcocoaintegration.h
src/plugins/platforms/cocoa/qcocoaintegration.mm
src/plugins/platforms/minimal/qminimalbackingstore.cpp
src/plugins/platforms/minimal/qminimalintegration.cpp
src/plugins/platforms/minimal/qminimalintegration.h
src/plugins/platforms/wayland/qwaylandintegration.cpp
src/plugins/platforms/wayland/qwaylandintegration.h
src/plugins/platforms/wayland/qwaylandnativeinterface.cpp
src/plugins/platforms/wayland/qwaylandscreen.cpp
src/plugins/platforms/xcb/main.cpp
src/plugins/platforms/xcb/qxcbbackingstore.cpp
src/plugins/platforms/xcb/qxcbconnection.cpp
src/plugins/platforms/xcb/qxcbintegration.cpp
src/plugins/platforms/xcb/qxcbintegration.h
src/plugins/platforms/xcb/qxcbnativeinterface.cpp
src/plugins/platforms/xcb/qxcbscreen.cpp
src/plugins/platforms/xcb/qxcbscreen.h
src/plugins/platforms/xcb/qxcbwindow.cpp
src/widgets/kernel/qapplication_qpa.cpp
src/widgets/kernel/qdesktopwidget_qpa.cpp
src/widgets/kernel/qwidget.cpp
src/widgets/kernel/qwidget_qpa.cpp

index 9575d3e..5a232e6 100644 (file)
@@ -12,7 +12,9 @@ Renderer::Renderer()
     m_format.setDepthBufferSize(16);
     m_format.setSamples(4);
 
-    m_context = new QGuiGLContext(m_format);
+    m_context = new QGuiGLContext;
+    m_context->setFormat(m_format);
+    m_context->create();
 }
 
 QSurfaceFormat Renderer::format() const
index 99c24fa..e4cd143 100644 (file)
@@ -1,4 +1,5 @@
 #include <QGuiApplication>
+#include <QScreen>
 
 #include "window.h"
 
@@ -15,5 +16,16 @@ int main(int argc, char **argv)
     Window child(&b);
     child.setVisible(true);
 
+    // create one window on each additional screen as well
+
+    QList<QScreen *> screens = app.screens();
+    foreach (QScreen *screen, screens) {
+        if (screen == app.primaryScreen())
+            continue;
+        Window *window = new Window(screen);
+        window->setVisible(true);
+        window->setWindowTitle(screen->name());
+    }
+
     return app.exec();
 }
index bbfc6a3..fecc220 100644 (file)
@@ -14,13 +14,23 @@ QColor colorTable[] =
     QColor("#c0ef8f")
 };
 
+Window::Window(QScreen *screen)
+    : QWindow(screen)
+    , m_backgroundColorIndex(colorIndexId++)
+{
+    initialize();
+}
+
 Window::Window(QWindow *parent)
     : QWindow(parent)
     , m_backgroundColorIndex(colorIndexId++)
 {
-    setWindowTitle(QLatin1String("Window"));
+    initialize();
+}
 
-    if (parent)
+void Window::initialize()
+{
+    if (parent())
         setGeometry(QRect(160, 120, 320, 240));
     else {
         setGeometry(QRect(10, 10, 640, 480));
@@ -38,6 +48,7 @@ Window::Window(QWindow *parent)
     m_image.fill(colorTable[m_backgroundColorIndex % (sizeof(colorTable) / sizeof(colorTable[0]))].rgba());
 
     m_lastPos = QPoint(-1, -1);
+    m_renderTimer = 0;
 }
 
 void Window::mousePressEvent(QMouseEvent *event)
@@ -54,7 +65,7 @@ void Window::mouseMoveEvent(QMouseEvent *event)
         m_lastPos = event->pos();
     }
 
-    render();
+    scheduleRender();
 }
 
 void Window::mouseReleaseEvent(QMouseEvent *event)
@@ -66,12 +77,12 @@ void Window::mouseReleaseEvent(QMouseEvent *event)
         m_lastPos = QPoint(-1, -1);
     }
 
-    render();
+    scheduleRender();
 }
 
 void Window::exposeEvent(QExposeEvent *)
 {
-    render();
+    scheduleRender();
 }
 
 void Window::resizeEvent(QResizeEvent *)
@@ -106,7 +117,20 @@ void Window::keyPressEvent(QKeyEvent *event)
         m_text.append(event->text());
         break;
     }
+    scheduleRender();
+}
+
+void Window::scheduleRender()
+{
+    if (!m_renderTimer)
+        m_renderTimer = startTimer(1);
+}
+
+void Window::timerEvent(QTimerEvent *)
+{
     render();
+    killTimer(m_renderTimer);
+    m_renderTimer = 0;
 }
 
 void Window::render()
index 546cf67..bf664d1 100644 (file)
@@ -5,6 +5,7 @@ class Window : public QWindow
 {
 public:
     Window(QWindow *parent = 0);
+    Window(QScreen *screen);
 
 protected:
     void mousePressEvent(QMouseEvent *);
@@ -16,12 +17,17 @@ protected:
     void exposeEvent(QExposeEvent *);
     void resizeEvent(QResizeEvent *);
 
+    void timerEvent(QTimerEvent *);
+
 private:
     void render();
+    void scheduleRender();
+    void initialize();
 
     QString m_text;
     QImage m_image;
     QPoint m_lastPos;
     int m_backgroundColorIndex;
     QBackingStore *m_backingStore;
+    int m_renderTimer;
 };
index c614ba1..f32c517 100644 (file)
@@ -42,6 +42,7 @@
 #include "qbitmap.h"
 #include "qplatformpixmap_qpa.h"
 #include "qimage.h"
+#include "qscreen.h"
 #include "qvariant.h"
 #include <qpainter.h>
 #include <private/qguiapplication_p.h>
index 64104a6..d0f6c4c 100644 (file)
@@ -42,6 +42,7 @@
 #include <qdebug.h>
 #include "qnativeimage_p.h"
 #include "qcolormap.h"
+#include "qscreen.h"
 
 #include "private/qpaintengine_raster_p.h"
 
@@ -207,7 +208,7 @@ QNativeImage::~QNativeImage()
 
 QImage::Format QNativeImage::systemFormat()
 {
-    return QGuiApplicationPrivate::platformIntegration()->screens().at(0)->format();
+    return QGuiApplication::primaryScreen()->handle()->format();
 }
 
 #endif // platforms
index 4387641..dc0f03a 100644 (file)
@@ -43,6 +43,7 @@
 
 #include <qpainter.h>
 #include <qimage.h>
+#include <qscreen.h>
 
 #include <private/qguiapplication_p.h>
 #include <private/qblittable_p.h>
@@ -98,7 +99,7 @@ void QBlittablePlatformPixmap::resize(int width, int height)
     delete m_engine;
     m_engine = 0;
 #ifdef Q_WS_QPA
-    d = QGuiApplicationPrivate::platformIntegration()->screens().at(0)->depth();
+    d = QGuiApplication::primaryScreen()->depth();
 #endif
     w = width;
     h = height;
index 724647f..9c69dde 100644 (file)
 ****************************************************************************/
 
 #include <qpixmap.h>
+#include <qscreen.h>
 #include <private/qguiapplication_p.h>
 
 QPixmap QPixmap::grabWindow(WId window, int x, int y, int w, int h)
 {
-    return QGuiApplicationPrivate::platformIntegration()->grabWindow(window, x, y, w, h);
+    return QGuiApplication::primaryScreen()->handle()->grabWindow(window, x, y, w, h);
 }
index 7f9434e..58291f5 100644 (file)
@@ -20,6 +20,7 @@ HEADERS += \
         kernel/qpalette.h \
         kernel/qsessionmanager.h \
         kernel/qwindowdefs.h \
+        kernel/qscreen.h
 
 SOURCES += \
         kernel/qclipboard.cpp \
@@ -33,6 +34,7 @@ SOURCES += \
         kernel/qmime.cpp \
         kernel/qpalette.cpp \
         kernel/qguivariant.cpp \
+        kernel/qscreen.cpp
 
 qpa {
        HEADERS += \
index 2eebcf6..7159acf 100644 (file)
@@ -113,7 +113,7 @@ class QShapedPixmapWindow : public QWindow {
     QPixmap pixmap;
 public:
     QShapedPixmapWindow() :
-        QWindow(0)
+        QWindow()
     {
         setWindowFlags(Qt::Tool | Qt::FramelessWindowHint | Qt::X11BypassWindowManagerHint);
         // ### Should we set the surface type to raster?
index ad01a72..a54dab6 100644 (file)
@@ -52,6 +52,7 @@
 #include <QtCore/qmutex.h>
 #include <QtDebug>
 #include <qpalette.h>
+#include <qscreen.h>
 
 #include <QtGui/QPlatformIntegration>
 #include <QtGui/QGenericPluginFactory>
@@ -103,6 +104,8 @@ QGuiApplicationPrivate *QGuiApplicationPrivate::self = 0;
 QClipboard *QGuiApplicationPrivate::qt_clipboard = 0;
 #endif
 
+QList<QScreen *> QGuiApplicationPrivate::screen_list;
+
 QWindowList QGuiApplicationPrivate::window_list;
 QWindow *QGuiApplicationPrivate::active_window = 0;
 
@@ -179,21 +182,27 @@ QWindowList QGuiApplication::topLevelWindows()
     return QGuiApplicationPrivate::window_list;
 }
 
-QWindow *QGuiApplication::topLevelAt(const QPoint &pos)
+QScreen *QGuiApplication::primaryScreen()
 {
-    QPlatformIntegration *pi = QGuiApplicationPrivate::platformIntegration();
+    if (QGuiApplicationPrivate::screen_list.isEmpty())
+        return 0;
+    return QGuiApplicationPrivate::screen_list.at(0);
+}
 
-    QList<QPlatformScreen *> screens = pi->screens();
-    QList<QPlatformScreen *>::const_iterator screen = screens.constBegin();
-    QList<QPlatformScreen *>::const_iterator end = screens.constEnd();
+QList<QScreen *> QGuiApplication::screens()
+{
+    return QGuiApplicationPrivate::screen_list;
+}
 
-    // The first screen in a virtual environment should know about all top levels
-    if (pi->isVirtualDesktop())
-        return (*screen)->topLevelAt(pos);
+QWindow *QGuiApplication::topLevelAt(const QPoint &pos)
+{
+    QList<QScreen *> screens = QGuiApplication::screens();
+    QList<QScreen *>::const_iterator screen = screens.constBegin();
+    QList<QScreen *>::const_iterator end = screens.constEnd();
 
     while (screen != end) {
         if ((*screen)->geometry().contains(pos))
-            return (*screen)->topLevelAt(pos);
+            return (*screen)->handle()->topLevelAt(pos);
         ++screen;
     }
     return 0;
index 4557b94..8338fa1 100644 (file)
@@ -57,6 +57,7 @@ QT_MODULE(Gui)
 class QGuiApplicationPrivate;
 class QPlatformNativeInterface;
 class QPalette;
+class QScreen;
 
 #if defined(qApp)
 #undef qApp
@@ -83,6 +84,8 @@ public:
     static QWindow *topLevelAt(const QPoint &pos);
 
     static QWindow *activeWindow();
+    static QScreen *primaryScreen();
+    static QList<QScreen *> screens();
 
 #ifndef QT_NO_CURSOR
     static QCursor *overrideCursor();
@@ -125,6 +128,7 @@ public:
 
 Q_SIGNALS:
     void fontDatabaseChanged();
+    void screenAdded(QScreen *screen);
 
 protected:
     bool event(QEvent *);
@@ -140,6 +144,7 @@ private:
     friend class QGestureManager;
 #endif
     friend class QFontDatabasePrivate;
+    friend class QPlatformIntegration;
 };
 
 QT_END_NAMESPACE
index 6d44caa..8391662 100644 (file)
@@ -162,6 +162,7 @@ public:
 #ifndef QT_NO_CURSOR
     QList<QCursor> cursor_list;
 #endif
+    static QList<QScreen *> screen_list;
 
     static QFont *app_font;
 private:
index fd82796..61a0479 100644 (file)
@@ -47,6 +47,7 @@
 #include <QtCore/QThread>
 
 #include <QtGui/private/qguiapplication_p.h>
+#include <QtGui/QScreen>
 
 #include <QDebug>
 
@@ -69,6 +70,7 @@ public:
         : qGLContextHandle(0)
         , platformGLContext(0)
         , shareContext(0)
+        , screen(0)
     {
     }
 
@@ -79,8 +81,11 @@ public:
     }
     void *qGLContextHandle;
     void (*qGLContextDeleteFunction)(void *handle);
+
+    QSurfaceFormat requestedFormat;
     QPlatformGLContext *platformGLContext;
     QGuiGLContext *shareContext;
+    QScreen *screen;
 
     static void setCurrentContext(QGuiGLContext *context);
 };
@@ -117,29 +122,87 @@ QPlatformGLContext *QGuiGLContext::handle() const
     return d->platformGLContext;
 }
 
+QPlatformGLContext *QGuiGLContext::shareHandle() const
+{
+    Q_D(const QGuiGLContext);
+    if (d->shareContext)
+        return d->shareContext->handle();
+    return 0;
+}
+
 /*!
-  Creates a new GL context with the given format and shared context.
+  Creates a new GL context instance, you need to call create() before it can be used.
 */
-QGuiGLContext::QGuiGLContext(const QSurfaceFormat &format, QGuiGLContext *shareContext)
+QGuiGLContext::QGuiGLContext()
     : d_ptr(new QGuiGLContextPrivate())
 {
     Q_D(QGuiGLContext);
-    QPlatformGLContext *share = shareContext ? shareContext->handle() : 0;
+    d->screen = QGuiApplication::primaryScreen();
+}
+
+/*!
+  Sets the format the GL context should be compatible with. You need to call create() before it takes effect.
+*/
+void QGuiGLContext::setFormat(const QSurfaceFormat &format)
+{
+    Q_D(QGuiGLContext);
+    d->requestedFormat = format;
+}
+
+/*!
+  Sets the context to share textures, shaders, and other GL resources with. You need to call create() before it takes effect.
+*/
+void QGuiGLContext::setShareContext(QGuiGLContext *shareContext)
+{
+    Q_D(QGuiGLContext);
     d->shareContext = shareContext;
-    d->platformGLContext = QGuiApplicationPrivate::platformIntegration()->createPlatformGLContext(format, share);
 }
 
 /*!
-  If this is the current context for the thread, doneCurrent is called
+  Sets the screen the GL context should be valid for. You need to call create() before it takes effect.
 */
-QGuiGLContext::~QGuiGLContext()
+void QGuiGLContext::setScreen(QScreen *screen)
+{
+    Q_D(QGuiGLContext);
+    d->screen = screen;
+    if (!d->screen)
+        d->screen = QGuiApplication::primaryScreen();
+}
+
+/*!
+  Attempts to create the GL context with the desired parameters.
+
+  Returns true if the native context was successfully created and is ready to be used.d
+*/
+bool QGuiGLContext::create()
+{
+    destroy();
+
+    Q_D(QGuiGLContext);
+    d->platformGLContext = QGuiApplicationPrivate::platformIntegration()->createPlatformGLContext(this);
+    return d->platformGLContext;
+}
+
+void QGuiGLContext::destroy()
 {
     Q_D(QGuiGLContext);
     if (QGuiGLContext::currentContext() == this)
         doneCurrent();
     delete d->platformGLContext;
+    d->platformGLContext = 0;
+}
+
+/*!
+  If this is the current context for the thread, doneCurrent is called
+*/
+QGuiGLContext::~QGuiGLContext()
+{
+    destroy();
 }
 
+/*!
+  Returns if this context is valid, i.e. has been successfully created.
+*/
 bool QGuiGLContext::isValid() const
 {
     Q_D(const QGuiGLContext);
@@ -210,18 +273,22 @@ QSurfaceFormat QGuiGLContext::format() const
 {
     Q_D(const QGuiGLContext);
     if (!d->platformGLContext)
-        return QSurfaceFormat();
+        return d->requestedFormat;
     return d->platformGLContext->format();
 }
 
 QGuiGLContext *QGuiGLContext::shareContext() const
 {
     Q_D(const QGuiGLContext);
-    if (!d->platformGLContext)
-        return 0;
     return d->shareContext;
 }
 
+QScreen *QGuiGLContext::screen() const
+{
+    Q_D(const QGuiGLContext);
+    return d->screen;
+}
+
 /*
   internal: Needs to have a pointer to qGLContext. But since this is in QtGui we cant
   have any type information.
index 9e62905..db3d6f2 100644 (file)
@@ -61,24 +61,30 @@ class Q_GUI_EXPORT QGuiGLContext
 {
 Q_DECLARE_PRIVATE(QGuiGLContext);
 public:
-    QGuiGLContext(const QSurfaceFormat &format = QSurfaceFormat(), QGuiGLContext *shareContext = 0);
+    QGuiGLContext();
     ~QGuiGLContext();
 
+    void setFormat(const QSurfaceFormat &format);
+    void setShareContext(QGuiGLContext *shareContext);
+    void setScreen(QScreen *screen);
+
+    bool create();
     bool isValid() const;
 
+    QSurfaceFormat format() const;
+    QGuiGLContext *shareContext() const;
+    QScreen *screen() const;
+
     bool makeCurrent(QSurface *surface);
     void doneCurrent();
 
     void swapBuffers(QSurface *surface);
     void (*getProcAddress(const QByteArray &procName)) ();
 
-    QSurfaceFormat format() const;
-
-    QGuiGLContext *shareContext() const;
-
     static QGuiGLContext *currentContext();
 
     QPlatformGLContext *handle() const;
+    QPlatformGLContext *shareHandle() const;
 
 private:
     QScopedPointer<QGuiGLContextPrivate> d_ptr;
@@ -91,6 +97,8 @@ private:
     void setQGLContextHandle(void *handle,void (*qGLContextDeleteFunction)(void *));
     void deleteQGLContext();
 
+    void destroy();
+
     Q_DISABLE_COPY(QGuiGLContext);
 };
 
index ab0d510..c190c4f 100644 (file)
 #include <QtGui/QPlatformFontDatabase>
 #include <QtGui/QPlatformClipboard>
 #include <QtGui/QPlatformPrinterSupport>
+#include <QtGui/private/qguiapplication_p.h>
+#include <QtGui/private/qpixmap_raster_p.h>
 #include <private/qdnd_p.h>
 
 QT_BEGIN_NAMESPACE
 
-QPixmap QPlatformIntegration::grabWindow(WId window, int x, int y, int width, int height) const
-{
-    Q_UNUSED(window);
-    Q_UNUSED(x);
-    Q_UNUSED(y);
-    Q_UNUSED(width);
-    Q_UNUSED(height);
-    return QPixmap();
-}
-
-
 /*!
     Accessor for the platform integrations fontdatabase.
 
@@ -177,12 +168,6 @@ QPlatformNativeInterface * QPlatformIntegration::nativeInterface() const
 */
 
 
-QPlatformGLContext *QPlatformIntegration::createPlatformGLContext(const QSurfaceFormat &, QPlatformGLContext *) const
-{
-    qWarning("This plugin does not support createPlatformGLContext!");
-    return 0;
-}
-
 /*!
     \fn void QPlatformIntegration::moveToScreen(QWindow *window, int screen)
 
@@ -212,15 +197,6 @@ QPlatformGLContext *QPlatformIntegration::createPlatformGLContext(const QSurface
 */
 
 /*!
-    \fn QPixmap QPlatformIntegration::grabWindow(WId window, int x, int y, int width, int height) const
-
-    This function is called when Qt needs to be able to grab the content of a window.
-
-    Returnes the content of the window specified with the WId handle within the boundaries of
-    QRect(x,y,width,height).
-*/
-
-/*!
     \fn QAbstractEventDispatcher *createEventDispatcher() const
 
     Factory function for the event dispatcher. The platform plugin
@@ -234,6 +210,17 @@ bool QPlatformIntegration::hasCapability(Capability cap) const
     return false;
 }
 
+QPlatformPixmap *QPlatformIntegration::createPlatformPixmap(QPlatformPixmap::PixelType type) const
+{
+    return new QRasterPlatformPixmap(type);
+}
+
+QPlatformGLContext *QPlatformIntegration::createPlatformGLContext(QGuiGLContext *context) const
+{
+    qWarning("This plugin does not support createPlatformGLContext!");
+    return 0;
+}
+
 /*!
 
     Returns the platform's printing support.
@@ -261,4 +248,24 @@ QPlatformInputContext *QPlatformIntegration::inputContext() const
     return 0;
 }
 
+/*!
+  Should be called by the implementation whenever a new screen is added.
+
+  The first screen added will be the primary screen, used for default-created
+  windows, GL contexts, and other resources unless otherwise specified.
+
+  This adds the screen to QGuiApplication::screens(), and emits the
+  QGuiApplication::screenAdded() signal.
+
+  The screen is automatically removed when the QPlatformScreen is destroyed.
+*/
+void QPlatformIntegration::screenAdded(QPlatformScreen *ps)
+{
+    QScreen *screen = ps ? ps->screen() : 0;
+    if (screen && !QGuiApplicationPrivate::screen_list.contains(screen)) {
+        QGuiApplicationPrivate::screen_list << screen;
+        emit qGuiApp->screenAdded(screen);
+    }
+}
+
 QT_END_NAMESPACE
index 092186c..35dfe07 100644 (file)
@@ -43,7 +43,6 @@
 #define QPLATFORMINTEGRATION_H
 
 #include <QtGui/qwindowdefs.h>
-#include <QtGui/qplatformpixmap_qpa.h>
 #include <QtGui/qplatformscreen_qpa.h>
 #include <QtGui/qsurfaceformat.h>
 
@@ -78,17 +77,10 @@ public:
 
     virtual bool hasCapability(Capability cap) const;
 
-// GraphicsSystem functions
-    virtual QPlatformPixmap *createPlatformPixmap(QPlatformPixmap::PixelType type) const = 0;
+    virtual QPlatformPixmap *createPlatformPixmap(QPlatformPixmap::PixelType type) const;
     virtual QPlatformWindow *createPlatformWindow(QWindow *window) const = 0;
     virtual QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const = 0;
-    virtual QPlatformGLContext *createPlatformGLContext(const QSurfaceFormat &format, QPlatformGLContext *share) const;
-
-// Window System functions
-    virtual QList<QPlatformScreen *> screens() const = 0;
-    virtual void moveToScreen(QWindow *window, int screen) {Q_UNUSED(window); Q_UNUSED(screen);}
-    virtual bool isVirtualDesktop() { return false; }
-    virtual QPixmap grabWindow(WId window, int x, int y, int width, int height) const;
+    virtual QPlatformGLContext *createPlatformGLContext(QGuiGLContext *context) const;
 
 // Event dispatcher:
     virtual QAbstractEventDispatcher *createEventDispatcher() const = 0;
@@ -107,6 +99,9 @@ public:
     virtual QPlatformNativeInterface *nativeInterface() const;
 
     virtual QPlatformPrinterSupport *printerSupport() const;
+
+protected:
+    void screenAdded(QPlatformScreen *screen);
 };
 
 QT_END_NAMESPACE
index 16b2557..ae1c6dc 100644 (file)
 #include <QtGui/qguiapplication.h>
 #include <QtGui/private/qguiapplication_p.h>
 #include <QtGui/qplatformintegration_qpa.h>
+#include <QtGui/qscreen.h>
 #include <QtGui/qwindow.h>
 
+struct QPlatformScreenPrivate
+{
+    QScreen *screen;
+};
+
+QPlatformScreen::QPlatformScreen()
+    : d_ptr(new QPlatformScreenPrivate)
+{
+    Q_D(QPlatformScreen);
+    d->screen = new QScreen(this);
+}
+
+QPlatformScreen::~QPlatformScreen()
+{
+    Q_D(QPlatformScreen);
+
+    QGuiApplicationPrivate::screen_list.removeOne(d->screen);
+    delete d->screen;
+}
+
+/*!
+    \fn QPixmap QPlatformScreen::grabWindow(WId window, int x, int y, int width, int height) const
+
+    This function is called when Qt needs to be able to grab the content of a window.
+
+    Returnes the content of the window specified with the WId handle within the boundaries of
+    QRect(x,y,width,height).
+*/
+QPixmap QPlatformScreen::grabWindow(WId window, int x, int y, int width, int height) const
+{
+    Q_UNUSED(window);
+    Q_UNUSED(x);
+    Q_UNUSED(y);
+    Q_UNUSED(width);
+    Q_UNUSED(height);
+    return QPixmap();
+}
+
 /*!
     Return the given top level window for a given position.
 
@@ -64,6 +103,26 @@ QWindow *QPlatformScreen::topLevelAt(const QPoint & pos) const
 }
 
 /*!
+    Returns a list of all the platform screens that are part of the same
+    virtual desktop.
+
+    Screens part of the same virtual desktop share a common coordinate system,
+    and windows can be freely moved between them.
+*/
+QList<QPlatformScreen *> QPlatformScreen::virtualSiblings() const
+{
+    QList<QPlatformScreen *> list;
+    list << const_cast<QPlatformScreen *>(this);
+    return list;
+}
+
+QScreen *QPlatformScreen::screen() const
+{
+    Q_D(const QPlatformScreen);
+    return d->screen;
+}
+
+/*!
     Reimplement this function in subclass to return the physical size of the
     screen. This function is used by QFont to convert point sizes to pixel
     sizes.
@@ -81,9 +140,9 @@ QSize QPlatformScreen::physicalSize() const
     return QSize(width,height);
 }
 
-QPlatformScreen * QPlatformScreen::platformScreenForWindow(const QWindow *)
+QPlatformScreen * QPlatformScreen::platformScreenForWindow(const QWindow *window)
 {
-    return QGuiApplicationPrivate::platformIntegration()->screens().at(0);
+    return window->screen()->handle();
 }
 
 /*!
index 16e62dd..8d3dd4c 100644 (file)
@@ -52,6 +52,7 @@
 #include <QtGui/qcursor.h>
 #include <QtGui/qimage.h>
 #include <QtGui/qwindowdefs.h>
+#include <QtGui/qplatformpixmap_qpa.h>
 
 QT_BEGIN_HEADER
 
@@ -59,24 +60,46 @@ QT_BEGIN_NAMESPACE
 
 QT_MODULE(Gui)
 
-class Q_GUI_EXPORT QPlatformScreen : public QObject
+class QPlatformBackingStore;
+class QPlatformGLContext;
+class QPlatformScreenPrivate;
+class QPlatformWindow;
+class QScreen;
+class QSurfaceFormat;
+
+class Q_GUI_EXPORT QPlatformScreen
 {
-    Q_OBJECT
+    Q_DECLARE_PRIVATE(QPlatformScreen)
+
 public:
-    virtual ~QPlatformScreen() { }
+    QPlatformScreen();
+    virtual ~QPlatformScreen();
+
+    virtual QPixmap grabWindow(WId window, int x, int y, int width, int height) const;
 
     virtual QRect geometry() const = 0;
     virtual QRect availableGeometry() const {return geometry();}
+
     virtual int depth() const = 0;
     virtual QImage::Format format() const = 0;
     virtual QSize physicalSize() const;
-    //jl: should setDirty be removed.
-    virtual void setDirty(const QRect &) {}
+
     virtual QWindow *topLevelAt(const QPoint &point) const;
+    virtual QList<QPlatformScreen *> virtualSiblings() const;
+
+    QScreen *screen() const;
 
     //jl: should this function be in QPlatformIntegration
     //jl: maybe screenForWindow is a better name?
     static QPlatformScreen *platformScreenForWindow(const QWindow *window);
+
+    virtual QString name() const { return QString(); }
+
+protected:
+    QScopedPointer<QPlatformScreenPrivate> d_ptr;
+
+private:
+    Q_DISABLE_COPY(QPlatformScreen)
 };
 
 QT_END_NAMESPACE
diff --git a/src/gui/kernel/qscreen.h b/src/gui/kernel/qscreen.h
new file mode 100644 (file)
index 0000000..f96056e
--- /dev/null
@@ -0,0 +1,95 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSCREEN_H
+#define QSCREEN_H
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Gui)
+
+#include <QList>
+
+class QPlatformScreen;
+class QScreenPrivate;
+class QWindow;
+
+class Q_GUI_EXPORT QScreen : public QObject
+{
+    Q_OBJECT
+    Q_DECLARE_PRIVATE(QScreen)
+
+public:
+    QPlatformScreen *handle() const;
+
+    QString name() const;
+
+    int depth() const;
+
+    QSize size() const;
+    QRect geometry() const;
+
+    QSize availableSize() const;
+    QRect availableGeometry() const;
+
+    QList<QScreen *> virtualSiblings() const;
+
+    QSize virtualSize() const;
+    QRect virtualGeometry() const;
+
+    QSize availableVirtualSize() const;
+    QRect availableVirtualGeometry() const;
+
+private:
+    QScreen(QPlatformScreen *screen);
+
+    Q_DISABLE_COPY(QScreen)
+    friend class QPlatformScreen;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QSCREEN_H
+
index 7fa9316..018474a 100644 (file)
@@ -45,6 +45,7 @@
 #include "qsurfaceformat.h"
 #include "qplatformglcontext_qpa.h"
 #include "qguiglcontext_qpa.h"
+#include "qscreen.h"
 
 #include "qwindow_p.h"
 #include "qguiapplication_p.h"
 
 QT_BEGIN_NAMESPACE
 
+QWindow::QWindow(QScreen *targetScreen)
+    : QObject(*new QWindowPrivate(), 0)
+    , QSurface(QSurface::Window)
+{
+    Q_D(QWindow);
+    d->screen = targetScreen;
+    if (!d->screen)
+        d->screen = QGuiApplication::primaryScreen();
+    QGuiApplicationPrivate::window_list.prepend(this);
+}
+
 QWindow::QWindow(QWindow *parent)
     : QObject(*new QWindowPrivate(), parent)
     , QSurface(QSurface::Window)
 {
     Q_D(QWindow);
     d->parentWindow = parent;
+    if (parent)
+        d->screen = parent->screen();
+    if (!d->screen)
+        d->screen = QGuiApplication::primaryScreen();
     QGuiApplicationPrivate::window_list.prepend(this);
 }
 
@@ -439,6 +455,23 @@ bool QWindow::setMouseGrabEnabled(bool grab)
     return false;
 }
 
+QScreen *QWindow::screen() const
+{
+    Q_D(const QWindow);
+    return d->screen;
+}
+
+void QWindow::setScreen(QScreen *newScreen)
+{
+    Q_D(QWindow);
+    bool wasCreated = d->platformWindow != 0;
+    if (wasCreated)
+        destroy();
+    d->screen = newScreen ? newScreen : QGuiApplication::primaryScreen();
+    if (wasCreated)
+        create();
+}
+
 void QWindow::showMinimized()
 {
     qDebug() << "unimplemented:" << __FILE__ << __LINE__;
@@ -486,7 +519,6 @@ void QWindow::hideEvent(QHideEvent *)
 
 bool QWindow::event(QEvent *event)
 {
-    Q_D(QWindow);
     switch (event->type()) {
     case QEvent::MouseMove:
         mouseMoveEvent(static_cast<QMouseEvent*>(event));
index 67330e5..adf948b 100644 (file)
@@ -71,6 +71,7 @@ class QWheelEvent;
 class QPlatformSurface;
 class QPlatformWindow;
 class QBackingStore;
+class QScreen;
 
 class Q_GUI_EXPORT QSurface
 {
@@ -102,7 +103,8 @@ class Q_GUI_EXPORT QWindow : public QObject, public QSurface
 public:
     enum SurfaceType { RasterSurface, OpenGLSurface };
 
-    QWindow(QWindow *parent = 0);
+    QWindow(QScreen *screen = 0);
+    QWindow(QWindow *parent);
     virtual ~QWindow();
 
     void setSurfaceType(SurfaceType surfaceType);
@@ -166,6 +168,9 @@ public:
     bool setKeyboardGrabEnabled(bool grab);
     bool setMouseGrabEnabled(bool grab);
 
+    QScreen *screen() const;
+    void setScreen(QScreen *screen);
+
 public Q_SLOTS:
     inline void show() { setVisible(true); }
     inline void hide() { setVisible(false); }
index cca20bc..2016c42 100644 (file)
@@ -68,6 +68,7 @@ public:
         , maximumSize(QWINDOWSIZE_MAX, QWINDOWSIZE_MAX)
         , modality(Qt::NonModal)
         , transientParent(0)
+        , screen(0)
     {
         isWindow = true;
     }
@@ -93,6 +94,7 @@ public:
 
     Qt::WindowModality modality;
     QPointer<QWindow> transientParent;
+    QScreen *screen;
 };
 
 
index 68dbb7d..f69a2e4 100644 (file)
@@ -43,6 +43,7 @@
 #include <qwindow.h>
 #include <qpixmap.h>
 #include <qplatformbackingstore_qpa.h>
+#include <qscreen.h>
 
 #include <private/qguiapplication_p.h>
 #include <private/qwindow_p.h>
index 31fc41b..282841a 100644 (file)
@@ -42,7 +42,7 @@
 #include "qcolormap.h"
 #include "qcolor.h"
 #include "qpaintdevice.h"
-#include "private/qguiapplication_p.h"
+#include "qscreen.h"
 
 QT_BEGIN_NAMESPACE
 
@@ -66,10 +66,7 @@ void QColormap::initialize()
 {
     screenMap = new QColormapPrivate;
 
-    QPlatformIntegration *pi = QGuiApplicationPrivate::platformIntegration();
-    QList<QPlatformScreen*> screens = pi->screens();
-
-    screenMap->depth = screens.at(0)->depth();
+    screenMap->depth = QGuiApplication::primaryScreen()->depth();
     if (screenMap->depth < 8) {
         screenMap->mode = QColormap::Indexed;
         screenMap->numcolors = 256;
index b85c045..e8308db 100644 (file)
@@ -50,6 +50,7 @@
 #include "qdatastream.h"
 #include "qguiapplication.h"
 #include "qstringlist.h"
+#include "qscreen.h"
 
 #include "qthread.h"
 #include "qthreadstorage.h"
@@ -167,11 +168,10 @@ Q_GUI_EXPORT int qt_defaultDpiX()
     extern float qt_mac_defaultDpi_x(); //qpaintdevice_mac.cpp
     dpi = qt_mac_defaultDpi_x();
 #elif defined(Q_WS_QPA)
-    QPlatformIntegration *pi = QGuiApplicationPrivate::platformIntegration();
-    if (pi) {
-        QPlatformScreen *screen = pi->screens().at(0);
+    QScreen *screen = QGuiApplication::primaryScreen();
+    if (screen) {
         const QSize screenSize = screen->geometry().size();
-        const QSize physicalSize = screen->physicalSize();
+        const QSize physicalSize = screen->handle()->physicalSize();
         dpi = qRound(screenSize.width() / (physicalSize.width() / qreal(25.4)));
     } else {
         //PI has not been initialised, or it is being initialised. Give a default dpi
@@ -198,11 +198,10 @@ Q_GUI_EXPORT int qt_defaultDpiY()
     extern float qt_mac_defaultDpi_y(); //qpaintdevice_mac.cpp
     dpi = qt_mac_defaultDpi_y();
 #elif defined(Q_WS_QPA)
-    QPlatformIntegration *pi = QGuiApplicationPrivate::platformIntegration();
-    if (pi) {
-        QPlatformScreen *screen = pi->screens().at(0);
+    QScreen *screen = QGuiApplication::primaryScreen();
+    if (screen) {
         const QSize screenSize = screen->geometry().size();
-        const QSize physicalSize = screen->physicalSize();
+        const QSize physicalSize = screen->handle()->physicalSize();
         dpi = qRound(screenSize.height() / (physicalSize.height() / qreal(25.4)));
     } else {
         //PI has not been initialised, or it is being initialised. Give a default dpi
index cfd651e..e6c135b 100644 (file)
@@ -150,13 +150,15 @@ bool QGLContext::chooseContext(const QGLContext* shareContext)
 
         delete d->guiGlContext;
         QGuiGLContext *shareGlContext = shareContext ? shareContext->d_func()->guiGlContext : 0;
-        d->guiGlContext = new QGuiGLContext(winFormat, shareGlContext);
+        d->guiGlContext = new QGuiGLContext;
+        d->guiGlContext->setFormat(winFormat);
+        d->guiGlContext->setShareContext(shareGlContext);
+        d->valid = d->guiGlContext->create();
 
-        d->glFormat = QGLFormat::fromSurfaceFormat(d->guiGlContext->format());
-        d->valid = d->guiGlContext->isValid();
-        if (d->valid) {
+        if (d->valid)
             d->guiGlContext->setQGLContextHandle(this,qDeleteQGLContext);
-        }
+
+        d->glFormat = QGLFormat::fromSurfaceFormat(d->guiGlContext->format());
         d->setupSharing();
     }
 
@@ -300,6 +302,7 @@ QGLTemporaryContext::QGLTemporaryContext(bool, QWidget *)
     d->window->create();
 
     d->context = new QGuiGLContext;
+    d->context->create();
     d->context->makeCurrent(d->window);
 }
 
index bfadd8b..d39aae7 100644 (file)
@@ -67,8 +67,6 @@ QEventDispatcherQPA::~QEventDispatcherQPA()
 
 bool QEventDispatcherQPA::processEvents(QEventLoop::ProcessEventsFlags flags)
 {
-    Q_D(QEventDispatcherQPA);
-
     bool didSendEvents = QWindowSystemInterface::sendWindowSystemEvents(this, flags);
 
     if (QEventDispatcherUNIX::processEvents(flags)) {
index a3895d0..5a30de6 100644 (file)
@@ -76,19 +76,15 @@ public:
     ~QCocoaIntegration();
 
     bool hasCapability(QPlatformIntegration::Capability cap) const;
-    QPlatformPixmap *createPlatformPixmap(QPlatformPixmap::PixelType type) const;
     QPlatformWindow *createPlatformWindow(QWindow *window) const;
-    QPlatformGLContext *createPlatformGLContext(const QSurfaceFormat &glFormat, QPlatformGLContext *share) const;
+    QPlatformGLContext *createPlatformGLContext(QGuiGLContext *context) const;
     QPlatformBackingStore *createPlatformBackingStore(QWindow *widget) const;
     QAbstractEventDispatcher *createEventDispatcher() const;
 
-    QList<QPlatformScreen *> screens() const { return mScreens; }
-
     QPlatformFontDatabase *fontDatabase() const;
 
     QPlatformNativeInterface *nativeInterface() const;
 private:
-    QList<QPlatformScreen *> mScreens;
     QPlatformFontDatabase *mFontDb;
 
     QCocoaAutoReleasePool *mPool;
index 95794cf..2311058 100644 (file)
@@ -47,7 +47,6 @@
 
 #include "qcocoaeventdispatcher.h"
 #include <QtPlatformSupport/private/qbasicunixfontdatabase_p.h>
-#include <private/qpixmap_raster_p.h>
 
 QT_BEGIN_NAMESPACE
 
@@ -83,7 +82,7 @@ QCocoaIntegration::QCocoaIntegration()
     NSArray *screens = [NSScreen screens];
     for (uint i = 0; i < [screens count]; i++) {
         QCocoaScreen *screen = new QCocoaScreen(i);
-        mScreens.append(screen);
+        screenAdded(screen);
     }
 }
 
@@ -103,19 +102,14 @@ bool QCocoaIntegration::hasCapability(QPlatformIntegration::Capability cap) cons
 
 
 
-QPlatformPixmap *QCocoaIntegration::createPlatformPixmap(QPlatformPixmap::PixelType type) const
-{
-    return new QRasterPlatformPixmap(type);
-}
-
 QPlatformWindow *QCocoaIntegration::createPlatformWindow(QWindow *window) const
 {
     return new QCocoaWindow(window);
 }
 
-QPlatformGLContext *QCocoaIntegration::createPlatformGLContext(const QSurfaceFormat &glFormat, QPlatformGLContext *share) const
+QPlatformGLContext *QCocoaIntegration::createPlatformGLContext(QGuiGLContext *context) const
 {
-    return new QCocoaGLContext(glFormat, share);
+    return new QCocoaGLContext(context->format(), context->shareHandle());
 }
 
 QPlatformBackingStore *QCocoaIntegration::createPlatformBackingStore(QWindow *window) const
index bd4f04d..0828140 100644 (file)
@@ -41,6 +41,7 @@
 
 
 #include "qminimalbackingstore.h"
+#include "qscreen.h"
 #include <QtCore/qdebug.h>
 #include <private/qguiapplication_p.h>
 
@@ -77,7 +78,7 @@ void QMinimalBackingStore::flush(QWindow *window, const QRegion &region, const Q
 void QMinimalBackingStore::resize(const QSize &size, const QRegion &)
 {
     //qDebug() << "QMinimalBackingStore::setGeometry:" << (long)this << rect;
-    QImage::Format format = QGuiApplicationPrivate::platformIntegration()->screens().first()->format();
+    QImage::Format format = QGuiApplication::primaryScreen()->handle()->format();
     if (mImage.size() != size)
         mImage = QImage(size, format);
 }
index 71bdda7..8d8e5e7 100644 (file)
@@ -58,7 +58,7 @@ QMinimalIntegration::QMinimalIntegration()
     mPrimaryScreen->mDepth = 32;
     mPrimaryScreen->mFormat = QImage::Format_ARGB32_Premultiplied;
 
-    mScreens.append(mPrimaryScreen);
+    screenAdded(mPrimaryScreen);
 }
 
 bool QMinimalIntegration::hasCapability(QPlatformIntegration::Capability cap) const
@@ -69,11 +69,6 @@ bool QMinimalIntegration::hasCapability(QPlatformIntegration::Capability cap) co
     }
 }
 
-QPlatformPixmap *QMinimalIntegration::createPlatformPixmap(QPlatformPixmap::PixelType type) const
-{
-    return new QRasterPlatformPixmap(type);
-}
-
 QPlatformWindow *QMinimalIntegration::createPlatformWindow(QWindow *window) const
 {
     Q_UNUSED(window);
index 52e4c0a..d64932c 100644 (file)
@@ -71,15 +71,10 @@ public:
 
     bool hasCapability(QPlatformIntegration::Capability cap) const;
 
-    QPlatformPixmap *createPlatformPixmap(QPlatformPixmap::PixelType type) const;
     QPlatformWindow *createPlatformWindow(QWindow *window) const;
-     QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const;
-    QAbstractEventDispatcher *createEventDispatcher() const;
-
-    QList<QPlatformScreen *> screens() const { return mScreens; }
+    QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const;
 
-private:
-    QList<QPlatformScreen *> mScreens;
+    QAbstractEventDispatcher *createEventDispatcher() const;
 };
 
 QT_END_NAMESPACE
index 800f1fc..5405a85 100644 (file)
@@ -54,8 +54,6 @@
 #include <QtGui/QPlatformCursor>
 #include <QtGui/QSurfaceFormat>
 
-#include <QtGui/private/qpixmap_raster_p.h>
-
 #ifdef QT_WAYLAND_GL_SUPPORT
 #include "gl_integration/qwaylandglintegration.h"
 #endif
@@ -92,11 +90,6 @@ bool QWaylandIntegration::hasCapability(QPlatformIntegration::Capability cap) co
     }
 }
 
-QPlatformPixmap *QWaylandIntegration::createPlatformPixmap(QPlatformPixmap::PixelType type) const
-{
-    return new QRasterPlatformPixmap(type);
-}
-
 QPlatformWindow *QWaylandIntegration::createPlatformWindow(QWindow *window) const
 {
 #ifdef QT_WAYLAND_GL_SUPPORT
index b9a01da..0dc3b61 100644 (file)
@@ -56,7 +56,6 @@ public:
     QWaylandIntegration();
 
     bool hasCapability(QPlatformIntegration::Capability cap) const;
-    QPlatformPixmap *createPlatformPixmap(QPlatformPixmap::PixelType type) const;
     QPlatformWindow *createPlatformWindow(QWindow *window) const;
     QPlatformGLContext *createPlatformGLContext(const QSurfaceFormat &glFormat, QPlatformGLContext *share) const;
     QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const;
index f6028f6..3158c73 100644 (file)
@@ -44,6 +44,7 @@
 #include "qwaylanddisplay.h"
 #include "qwaylandwindow.h"
 #include <QtGui/private/qguiapplication_p.h>
+#include <QtGui/QScreen>
 
 void *QWaylandNativeInterface::nativeResourceForWindow(const QByteArray &resourceString, QWindow *window)
 {
@@ -64,9 +65,9 @@ QWaylandScreen * QWaylandNativeInterface::qPlatformScreenForWindow(QWindow *wind
     QWaylandScreen *screen;
 
     if (window) {
-        screen = static_cast<QWaylandScreen *>(QPlatformScreen::platformScreenForWindow(window));
+        screen = static_cast<QWaylandScreen *>(window->screen()->handle());
     } else {
-        screen = static_cast<QWaylandScreen *>(QGuiApplicationPrivate::platformIntegration()->screens()[0]);
+        screen = static_cast<QWaylandScreen *>(QGuiApplication::primaryScreen()->handle());
     }
     return screen;
 }
index 3a63e78..7b064ba 100644 (file)
@@ -53,7 +53,6 @@ QWaylandScreen::QWaylandScreen(QWaylandDisplay *waylandDisplay, struct wl_output
     , mFormat(QImage::Format_ARGB32_Premultiplied)
     , mWaylandCursor(new QWaylandCursor(this))
 {
-    moveToThread(waylandDisplay->thread());
 }
 
 QWaylandScreen::~QWaylandScreen()
index 7fee745..c544f70 100644 (file)
@@ -58,11 +58,10 @@ QStringList QXcbIntegrationPlugin::keys() const
     return list;
 }
 
-QPlatformIntegration* QXcbIntegrationPlugin::create(const QString& system, const QStringList& paramList)
+QPlatformIntegration* QXcbIntegrationPlugin::create(const QString& system, const QStringList& parameters)
 {
-    Q_UNUSED(paramList);
     if (system.toLower() == "xcb")
-        return new QXcbIntegration;
+        return new QXcbIntegration(parameters);
 
     return 0;
 }
index 50407f7..fadcb4d 100644 (file)
@@ -56,6 +56,7 @@
 
 #include <qdebug.h>
 #include <qpainter.h>
+#include <qscreen.h>
 
 class QXcbShmImage : public QXcbObject
 {
@@ -213,7 +214,7 @@ QXcbBackingStore::QXcbBackingStore(QWindow *window)
     , m_image(0)
     , m_syncingResize(false)
 {
-    QXcbScreen *screen = static_cast<QXcbScreen *>(QPlatformScreen::platformScreenForWindow(window));
+    QXcbScreen *screen = static_cast<QXcbScreen *>(window->screen()->handle());
     setConnection(screen->connection());
 }
 
@@ -280,7 +281,7 @@ void QXcbBackingStore::resize(const QSize &size, const QRegion &)
 
     Q_XCB_NOOP(connection());
 
-    QXcbScreen *screen = static_cast<QXcbScreen *>(QPlatformScreen::platformScreenForWindow(window()));
+    QXcbScreen *screen = static_cast<QXcbScreen *>(window()->screen()->handle());
     QXcbWindow* win = static_cast<QXcbWindow *>(window()->handle());
 
     delete m_image;
index 1e18077..7803b3a 100644 (file)
@@ -109,8 +109,11 @@ QXcbConnection::QXcbConnection(const char *displayName)
 #endif //XCB_USE_EGL
 #else
     m_connection = xcb_connect(m_displayName.constData(), &m_primaryScreen);
-
 #endif //XCB_USE_XLIB
+
+    if (m_connection)
+        printf("Successfully connected to display %s\n", m_displayName.constData());
+
     xcb_prefetch_extension_data (m_connection, &xcb_xfixes_id);
 
     m_setup = xcb_get_setup(xcb_connection());
index 924077f..313a773 100644 (file)
 #include "qxcbnativeinterface.h"
 #include "qxcbclipboard.h"
 #include "qxcbdrag.h"
-#include "qxcbimage.h"
 
 #include <QtPlatformSupport/private/qgenericunixprintersupport_p.h>
 
 #include <xcb/xcb.h>
 
-#include <private/qpixmap_raster_p.h>
-
 #include <QtPlatformSupport/private/qgenericunixeventdispatcher_p.h>
 #include <QtPlatformSupport/private/qgenericunixfontdatabase_p.h>
 
 #include <EGL/egl.h>
 #endif
 
+#define XCB_USE_IBUS
+#if defined(XCB_USE_IBUS)
+#include "QtPlatformSupport/qibusplatforminputcontext.h"
+#endif
+
 #if defined(XCB_USE_GLX)
 #include "qglxintegration.h"
 #elif defined(XCB_USE_EGL)
 #include <QtPlatformSupport/private/qeglplatformcontext_p.h>
 #endif
 
-#define XCB_USE_IBUS
-#if defined(XCB_USE_IBUS)
-#include "QtPlatformSupport/qibusplatforminputcontext.h"
-#endif
+#include <QtGui/QGuiGLContext>
+#include <QtGui/QScreen>
 
-QXcbIntegration::QXcbIntegration()
-    : m_connection(new QXcbConnection), m_printerSupport(new QGenericUnixPrinterSupport)
+QXcbIntegration::QXcbIntegration(const QStringList &parameters)
+    : m_printerSupport(new QGenericUnixPrinterSupport)
 {
-    foreach (QXcbScreen *screen, m_connection->screens())
-        m_screens << screen;
+    m_connections << new QXcbConnection;
+
+    for (int i = 0; i < parameters.size() - 1; i += 2) {
+        qDebug() << parameters.at(i) << parameters.at(i+1);
+        QString display = parameters.at(i) + ':' + parameters.at(i+1);
+        m_connections << new QXcbConnection(display.toAscii().constData());
+    }
+
+    foreach (QXcbConnection *connection, m_connections)
+        foreach (QXcbScreen *screen, connection->screens())
+            screenAdded(screen);
 
     m_fontDatabase = new QGenericUnixFontDatabase();
     m_nativeInterface = new QXcbNativeInterface;
@@ -90,21 +99,7 @@ QXcbIntegration::QXcbIntegration()
 
 QXcbIntegration::~QXcbIntegration()
 {
-    delete m_connection;
-}
-
-bool QXcbIntegration::hasCapability(QPlatformIntegration::Capability cap) const
-{
-    switch (cap) {
-    case ThreadedPixmaps: return true;
-    case OpenGL: return hasOpenGL();
-    default: return QPlatformIntegration::hasCapability(cap);
-    }
-}
-
-QPlatformPixmap *QXcbIntegration::createPlatformPixmap(QPlatformPixmap::PixelType type) const
-{
-    return new QRasterPlatformPixmap(type);
+    qDeleteAll(m_connections);
 }
 
 QPlatformWindow *QXcbIntegration::createPlatformWindow(QWindow *window) const
@@ -128,14 +123,15 @@ public:
 };
 #endif
 
-QPlatformGLContext *QXcbIntegration::createPlatformGLContext(const QSurfaceFormat &glFormat, QPlatformGLContext *share) const
+QPlatformGLContext *QXcbIntegration::createPlatformGLContext(QGuiGLContext *context) const
 {
+    QXcbScreen *screen = static_cast<QXcbScreen *>(context->screen()->handle());
 #if defined(XCB_USE_GLX)
-    return new QGLXContext(static_cast<QXcbScreen *>(m_screens.at(0)), glFormat, share);
+    return new QGLXContext(screen, context->format(), context->shareHandle());
 #elif defined(XCB_USE_EGL)
-    return new QEGLXcbPlatformContext(glFormat, share, m_connection->egl_display());
+    return new QEGLXcbPlatformContext(context->format(), context->shareHandle(), screen->connection()->egl_display());
 #elif defined(XCB_USE_DRI2)
-    return new QDri2Context(glFormat, share);
+    return new QDri2Context(context->format(), context->shareHandle());
 #endif
 }
 
@@ -144,10 +140,21 @@ QPlatformBackingStore *QXcbIntegration::createPlatformBackingStore(QWindow *wind
     return new QXcbBackingStore(window);
 }
 
+bool QXcbIntegration::hasCapability(QPlatformIntegration::Capability cap) const
+{
+    switch (cap) {
+    case ThreadedPixmaps: return true;
+    case OpenGL: return true;
+    default: return QPlatformIntegration::hasCapability(cap);
+    }
+}
+
 QAbstractEventDispatcher *QXcbIntegration::createEventDispatcher() const
 {
     QAbstractEventDispatcher *eventDispatcher = createUnixEventDispatcher();
-    m_connection->setEventDispatcher(eventDispatcher);
+
+    foreach (QXcbConnection *connection, m_connections)
+        connection->setEventDispatcher(eventDispatcher);
 #ifdef XCB_USE_IBUS
     // A bit hacky to do this here, but we need an eventloop before we can instantiate
     // the input context.
@@ -156,161 +163,17 @@ QAbstractEventDispatcher *QXcbIntegration::createEventDispatcher() const
     return eventDispatcher;
 }
 
-QList<QPlatformScreen *> QXcbIntegration::screens() const
-{
-    return m_screens;
-}
-
 void QXcbIntegration::moveToScreen(QWindow *window, int screen)
 {
     Q_UNUSED(window);
     Q_UNUSED(screen);
 }
 
-bool QXcbIntegration::isVirtualDesktop()
-{
-    return false;
-}
-
 QPlatformFontDatabase *QXcbIntegration::fontDatabase() const
 {
     return m_fontDatabase;
 }
 
-QPixmap QXcbIntegration::grabWindow(WId window, int x, int y, int width, int height) const
-{
-    if (width == 0 || height == 0)
-        return QPixmap();
-
-    xcb_connection_t *connection = m_connection->xcb_connection();
-
-    xcb_get_geometry_cookie_t geometry_cookie = xcb_get_geometry(connection, window);
-
-    xcb_generic_error_t *error;
-    xcb_get_geometry_reply_t *reply =
-        xcb_get_geometry_reply(connection, geometry_cookie, &error);
-
-    if (!reply) {
-        if (error) {
-            m_connection->handleXcbError(error);
-            free(error);
-        }
-        return QPixmap();
-    }
-
-    if (width < 0)
-        width = reply->width - x;
-    if (height < 0)
-        height = reply->height - y;
-
-    // TODO: handle multiple screens
-    QXcbScreen *screen = m_connection->screens().at(0);
-    xcb_window_t root = screen->root();
-    geometry_cookie = xcb_get_geometry(connection, root);
-    xcb_get_geometry_reply_t *root_reply =
-        xcb_get_geometry_reply(connection, geometry_cookie, &error);
-
-    if (!root_reply) {
-        if (error) {
-            m_connection->handleXcbError(error);
-            free(error);
-        }
-        free(reply);
-        return QPixmap();
-    }
-
-    if (reply->depth == root_reply->depth) {
-        // if the depth of the specified window and the root window are the
-        // same, grab pixels from the root window (so that we get the any
-        // overlapping windows and window manager frames)
-
-        // map x and y to the root window
-        xcb_translate_coordinates_cookie_t translate_cookie =
-            xcb_translate_coordinates(connection, window, root, x, y);
-
-        xcb_translate_coordinates_reply_t *translate_reply =
-            xcb_translate_coordinates_reply(connection, translate_cookie, &error);
-
-        if (!translate_reply) {
-            if (error) {
-                m_connection->handleXcbError(error);
-                free(error);
-            }
-            free(reply);
-            free(root_reply);
-            return QPixmap();
-        }
-
-        x = translate_reply->dst_x;
-        y = translate_reply->dst_y;
-
-        window = root;
-
-        free(translate_reply);
-        free(reply);
-        reply = root_reply;
-    } else {
-        free(root_reply);
-        root_reply = 0;
-    }
-
-    xcb_get_window_attributes_reply_t *attributes_reply =
-        xcb_get_window_attributes_reply(connection, xcb_get_window_attributes(connection, window), &error);
-
-    if (!attributes_reply) {
-        if (error) {
-            m_connection->handleXcbError(error);
-            free(error);
-        }
-        free(reply);
-        return QPixmap();
-    }
-
-    const xcb_visualtype_t *visual = screen->visualForId(attributes_reply->visual);
-    free(attributes_reply);
-
-    xcb_pixmap_t pixmap = xcb_generate_id(connection);
-    error = xcb_request_check(connection, xcb_create_pixmap_checked(connection, reply->depth, pixmap, window, width, height));
-    if (error) {
-        m_connection->handleXcbError(error);
-        free(error);
-    }
-
-    uint32_t gc_value_mask = XCB_GC_SUBWINDOW_MODE;
-    uint32_t gc_value_list[] = { XCB_SUBWINDOW_MODE_INCLUDE_INFERIORS };
-
-    xcb_gcontext_t gc = xcb_generate_id(connection);
-    xcb_create_gc(connection, gc, pixmap, gc_value_mask, gc_value_list);
-
-    error = xcb_request_check(connection, xcb_copy_area_checked(connection, window, pixmap, gc, x, y, 0, 0, width, height));
-    if (error) {
-        m_connection->handleXcbError(error);
-        free(error);
-    }
-
-    QPixmap result = qt_xcb_pixmapFromXPixmap(m_connection, pixmap, width, height, reply->depth, visual);
-
-    free(reply);
-    xcb_free_gc(connection, gc);
-    xcb_free_pixmap(connection, pixmap);
-
-    return result;
-}
-
-bool QXcbIntegration::hasOpenGL() const
-{
-#if defined(XCB_USE_GLX)
-    return true;
-#elif defined(XCB_USE_EGL)
-    return m_connection->hasEgl();
-#elif defined(XCB_USE_DRI2)
-    if (m_connection->hasSupportForDri2()) {
-        return true;
-    }
-#endif
-    return false;
-}
-
 QPlatformNativeInterface * QXcbIntegration::nativeInterface() const
 {
     return m_nativeInterface;
@@ -323,12 +186,12 @@ QPlatformPrinterSupport *QXcbIntegration::printerSupport() const
 
 QPlatformClipboard *QXcbIntegration::clipboard() const
 {
-    return m_connection->clipboard();
+    return m_connections.at(0)->clipboard();
 }
 
 QPlatformDrag *QXcbIntegration::drag() const
 {
-    return m_connection->drag();
+    return m_connections.at(0)->drag();
 }
 
 QPlatformInputContext *QXcbIntegration::inputContext() const
index 725db7a..d62878c 100644 (file)
@@ -53,20 +53,17 @@ class QAbstractEventDispatcher;
 class QXcbIntegration : public QPlatformIntegration
 {
 public:
-    QXcbIntegration();
+    QXcbIntegration(const QStringList &parameters);
     ~QXcbIntegration();
 
-    bool hasCapability(Capability cap) const;
-    QPlatformPixmap *createPlatformPixmap(QPlatformPixmap::PixelType type) const;
     QPlatformWindow *createPlatformWindow(QWindow *window) const;
-    QPlatformGLContext *createPlatformGLContext(const QSurfaceFormat &glFormat, QPlatformGLContext *share) const;
+    QPlatformGLContext *createPlatformGLContext(QGuiGLContext *context) const;
     QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const;
+
+    bool hasCapability(Capability cap) const;
     QAbstractEventDispatcher *createEventDispatcher() const;
 
-    QList<QPlatformScreen *> screens() const;
     void moveToScreen(QWindow *window, int screen);
-    bool isVirtualDesktop();
-    QPixmap grabWindow(WId window, int x, int y, int width, int height) const;
 
     QPlatformFontDatabase *fontDatabase() const;
 
@@ -79,9 +76,7 @@ public:
     QPlatformInputContext *inputContext() const;
 
 private:
-    bool hasOpenGL() const;
-    QList<QPlatformScreen *> m_screens;
-    QXcbConnection *m_connection;
+    QList<QXcbConnection *> m_connections;
 
     QPlatformFontDatabase *m_fontDatabase;
     QPlatformNativeInterface *m_nativeInterface;
index 28b62b3..217dae6 100644 (file)
@@ -49,6 +49,7 @@
 #include <QtCore/QDebug>
 
 #include <QtGui/qguiglcontext_qpa.h>
+#include <QtGui/qscreen.h>
 
 #if defined(XCB_USE_EGL)
 #include "QtPlatformSupport/private/qeglplatformcontext_p.h"
@@ -119,9 +120,9 @@ QXcbScreen *QXcbNativeInterface::qPlatformScreenForWindow(QWindow *window)
 {
     QXcbScreen *screen;
     if (window) {
-        screen = static_cast<QXcbScreen *>(QPlatformScreen::platformScreenForWindow(window));
-    }else {
-        screen = static_cast<QXcbScreen *>(QGuiApplicationPrivate::platformIntegration()->screens()[0]);
+        screen = static_cast<QXcbScreen *>(window->screen()->handle());
+    } else {
+        screen = static_cast<QXcbScreen *>(QGuiApplication::primaryScreen()->handle());
     }
     return screen;
 }
index 6c3d181..42259fe 100644 (file)
@@ -42,6 +42,7 @@
 #include "qxcbscreen.h"
 #include "qxcbwindow.h"
 #include "qxcbcursor.h"
+#include "qxcbimage.h"
 
 #include <stdio.h>
 
@@ -150,6 +151,7 @@ QXcbScreen::~QXcbScreen()
     delete m_cursor;
 }
 
+
 QWindow *QXcbScreen::topLevelAt(const QPoint &p) const
 {
     xcb_window_t root = m_screen->root;
@@ -227,3 +229,126 @@ int QXcbScreen::screenNumber() const
 {
     return m_number;
 }
+
+QPixmap QXcbScreen::grabWindow(WId window, int x, int y, int width, int height) const
+{
+    if (width == 0 || height == 0)
+        return QPixmap();
+
+    xcb_get_geometry_cookie_t geometry_cookie = xcb_get_geometry(xcb_connection(), window);
+
+    xcb_generic_error_t *error;
+    xcb_get_geometry_reply_t *reply =
+        xcb_get_geometry_reply(xcb_connection(), geometry_cookie, &error);
+
+    if (!reply) {
+        if (error) {
+            connection()->handleXcbError(error);
+            free(error);
+        }
+        return QPixmap();
+    }
+
+    if (width < 0)
+        width = reply->width - x;
+    if (height < 0)
+        height = reply->height - y;
+
+    // TODO: handle multiple screens
+    QXcbScreen *screen = const_cast<QXcbScreen *>(this);
+    xcb_window_t root = screen->root();
+    geometry_cookie = xcb_get_geometry(xcb_connection(), root);
+    xcb_get_geometry_reply_t *root_reply =
+        xcb_get_geometry_reply(xcb_connection(), geometry_cookie, &error);
+
+    if (!root_reply) {
+        if (error) {
+            connection()->handleXcbError(error);
+            free(error);
+        }
+        free(reply);
+        return QPixmap();
+    }
+
+    if (reply->depth == root_reply->depth) {
+        // if the depth of the specified window and the root window are the
+        // same, grab pixels from the root window (so that we get the any
+        // overlapping windows and window manager frames)
+
+        // map x and y to the root window
+        xcb_translate_coordinates_cookie_t translate_cookie =
+            xcb_translate_coordinates(xcb_connection(), window, root, x, y);
+
+        xcb_translate_coordinates_reply_t *translate_reply =
+            xcb_translate_coordinates_reply(xcb_connection(), translate_cookie, &error);
+
+        if (!translate_reply) {
+            if (error) {
+                connection()->handleXcbError(error);
+                free(error);
+            }
+            free(reply);
+            free(root_reply);
+            return QPixmap();
+        }
+
+        x = translate_reply->dst_x;
+        y = translate_reply->dst_y;
+
+        window = root;
+
+        free(translate_reply);
+        free(reply);
+        reply = root_reply;
+    } else {
+        free(root_reply);
+        root_reply = 0;
+    }
+
+    xcb_get_window_attributes_reply_t *attributes_reply =
+        xcb_get_window_attributes_reply(xcb_connection(), xcb_get_window_attributes(xcb_connection(), window), &error);
+
+    if (!attributes_reply) {
+        if (error) {
+            connection()->handleXcbError(error);
+            free(error);
+        }
+        free(reply);
+        return QPixmap();
+    }
+
+    const xcb_visualtype_t *visual = screen->visualForId(attributes_reply->visual);
+    free(attributes_reply);
+
+    xcb_pixmap_t pixmap = xcb_generate_id(xcb_connection());
+    error = xcb_request_check(xcb_connection(), xcb_create_pixmap_checked(xcb_connection(), reply->depth, pixmap, window, width, height));
+    if (error) {
+        connection()->handleXcbError(error);
+        free(error);
+    }
+
+    uint32_t gc_value_mask = XCB_GC_SUBWINDOW_MODE;
+    uint32_t gc_value_list[] = { XCB_SUBWINDOW_MODE_INCLUDE_INFERIORS };
+
+    xcb_gcontext_t gc = xcb_generate_id(xcb_connection());
+    xcb_create_gc(xcb_connection(), gc, pixmap, gc_value_mask, gc_value_list);
+
+    error = xcb_request_check(xcb_connection(), xcb_copy_area_checked(xcb_connection(), window, pixmap, gc, x, y, 0, 0, width, height));
+    if (error) {
+        connection()->handleXcbError(error);
+        free(error);
+    }
+
+    QPixmap result = qt_xcb_pixmapFromXPixmap(connection(), pixmap, width, height, reply->depth, visual);
+
+    free(reply);
+    xcb_free_gc(xcb_connection(), gc);
+    xcb_free_pixmap(xcb_connection(), pixmap);
+
+    return result;
+}
+
+QString QXcbScreen::name() const
+{
+    return connection()->displayName() + QLatin1String(".") + QString::number(screenNumber());
+}
index 5b8492f..07d855b 100644 (file)
@@ -58,6 +58,8 @@ public:
     QXcbScreen(QXcbConnection *connection, xcb_screen_t *screen, int number);
     ~QXcbScreen();
 
+    QPixmap grabWindow(WId window, int x, int y, int width, int height) const;
+
     QWindow *topLevelAt(const QPoint &point) const;
 
     QRect geometry() const;
@@ -77,6 +79,8 @@ public:
 
     const xcb_visualtype_t *visualForId(xcb_visualid_t) const;
 
+    QString name() const;
+
 private:
     xcb_screen_t *m_screen;
     int m_number;
index f63cbe2..14ac0e6 100644 (file)
@@ -42,6 +42,7 @@
 #include "qxcbwindow.h"
 
 #include <QtDebug>
+#include <QScreen>
 
 #include "qxcbconnection.h"
 #include "qxcbscreen.h"
@@ -102,7 +103,7 @@ QXcbWindow::QXcbWindow(QWindow *window)
     , m_eglSurface(0)
 #endif
 {
-    m_screen = static_cast<QXcbScreen *>(QGuiApplicationPrivate::platformIntegration()->screens().at(0));
+    m_screen = static_cast<QXcbScreen *>(window->screen()->handle());
 
     setConnection(m_screen->connection());
 
index 1b37ddf..3c0575b 100644 (file)
@@ -45,6 +45,7 @@
 #ifndef QT_NO_CURSOR
 #include "private/qcursor_p.h"
 #endif
+#include "qscreen.h"
 
 #include "private/qwidget_p.h"
 #include "private/qevent_p.h"
@@ -384,21 +385,13 @@ bool QApplication::isEffectEnabled(Qt::UIEffect effect)
 
 QWidget *QApplication::topLevelAt(const QPoint &pos)
 {
-    QPlatformIntegration *pi = QGuiApplicationPrivate::platformIntegration();
-
-    QList<QPlatformScreen *> screens = pi->screens();
-    QList<QPlatformScreen *>::const_iterator screen = screens.constBegin();
-    QList<QPlatformScreen *>::const_iterator end = screens.constEnd();
-
-    // The first screen in a virtual environment should know about all top levels
-    if (pi->isVirtualDesktop()) {
-        QWidgetWindow *w = qobject_cast<QWidgetWindow *>((*screen)->topLevelAt(pos));
-        return w ? w->widget() : 0;
-    }
+    QList<QScreen *> screens = QGuiApplication::screens();
+    QList<QScreen *>::const_iterator screen = screens.constBegin();
+    QList<QScreen *>::const_iterator end = screens.constEnd();
 
     while (screen != end) {
         if ((*screen)->geometry().contains(pos)) {
-            QWidgetWindow *w = qobject_cast<QWidgetWindow *>((*screen)->topLevelAt(pos));
+            QWidgetWindow *w = qobject_cast<QWidgetWindow *>((*screen)->handle()->topLevelAt(pos));
             return w ? w->widget() : 0;
         }
         ++screen;
index 5e4dffb..380daee 100644 (file)
@@ -40,6 +40,7 @@
 ****************************************************************************/
 
 #include "qdesktopwidget.h"
+#include "qscreen.h"
 #include "private/qapplication_p.h"
 #include <QWidget>
 #include "private/qwidget_p.h"
@@ -51,7 +52,7 @@ QT_USE_NAMESPACE
 void QDesktopWidgetPrivate::updateScreenList()
 {
     Q_Q(QDesktopWidget);
-    QList<QPlatformScreen *> screenList = QGuiApplicationPrivate::platformIntegration()->screens();
+    QList<QScreen *> screenList = QGuiApplication::screens();
     int targetLength = screenList.length();
     int currentLength = screens.length();
 
@@ -97,7 +98,7 @@ QDesktopWidget::~QDesktopWidget()
 
 bool QDesktopWidget::isVirtualDesktop() const
 {
-    return QGuiApplicationPrivate::platformIntegration()->isVirtualDesktop();
+    return QGuiApplication::primaryScreen()->virtualSiblings().size() > 1;
 }
 
 int QDesktopWidget::primaryScreen() const
@@ -107,8 +108,7 @@ int QDesktopWidget::primaryScreen() const
 
 int QDesktopWidget::numScreens() const
 {
-    QPlatformIntegration *pi = QGuiApplicationPrivate::platformIntegration();
-    return qMax(pi->screens().size(), 1);
+    return qMax(QGuiApplication::screens().size(), 1);
 }
 
 QWidget *QDesktopWidget::screen(int screen)
@@ -121,26 +121,24 @@ QWidget *QDesktopWidget::screen(int screen)
 
 const QRect QDesktopWidget::availableGeometry(int screenNo) const
 {
-    QPlatformIntegration *pi = QGuiApplicationPrivate::platformIntegration();
-    QList<QPlatformScreen *> screens = pi->screens();
+    QList<QScreen *> screens = QGuiApplication::screens();
     if (screenNo == -1)
         screenNo = 0;
     if (screenNo < 0 || screenNo >= screens.size())
         return QRect();
     else
-        return screens[screenNo]->availableGeometry();
+        return screens.at(screenNo)->availableGeometry();
 }
 
 const QRect QDesktopWidget::screenGeometry(int screenNo) const
 {
-    QPlatformIntegration *pi = QGuiApplicationPrivate::platformIntegration();
-    QList<QPlatformScreen *> screens = pi->screens();
+    QList<QScreen *> screens = QGuiApplication::screens();
     if (screenNo == -1)
         screenNo = 0;
     if (screenNo < 0 || screenNo >= screens.size())
         return QRect();
     else
-        return screens[screenNo]->geometry();
+        return screens.at(screenNo)->geometry();
 }
 
 int QDesktopWidget::screenNumber(const QWidget *w) const
@@ -157,11 +155,10 @@ int QDesktopWidget::screenNumber(const QWidget *w) const
 
 int QDesktopWidget::screenNumber(const QPoint &p) const
 {
-    QPlatformIntegration *pi = QGuiApplicationPrivate::platformIntegration();
-    QList<QPlatformScreen *> screens = pi->screens();
+    QList<QScreen *> screens = QGuiApplication::screens();
 
     for (int i = 0; i < screens.size(); ++i)
-        if (screens[i]->geometry().contains(p))
+        if (screens.at(i)->geometry().contains(p))
             return i;
 
     return primaryScreen(); //even better would be closest screen
index a29a265..76218a9 100644 (file)
@@ -1266,8 +1266,7 @@ void QWidgetPrivate::init(QWidget *parentWidget, Qt::WindowFlags f)
 #elif defined(Q_WS_QPA)
     if (desktopWidget) {
         int screen = desktopWidget->d_func()->topData()->screenIndex;
-        QPlatformIntegration *platform = QGuiApplicationPrivate::platformIntegration();
-        platform->moveToScreen(q->windowHandle(), screen);
+        q->windowHandle()->setScreen(QGuiApplication::screens().value(screen, 0));
     }
 #else
     Q_UNUSED(desktopWidget);
index 5051b38..b8f1f4e 100644 (file)
@@ -104,6 +104,7 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO
 
     win->setWindowFlags(data.window_flags);
     win->setGeometry(q->geometry());
+    win->setScreen(QGuiApplication::screens().value(topData()->screenIndex, 0));
 
     if (q->testAttribute(Qt::WA_TranslucentBackground)) {
         QSurfaceFormat format;
@@ -141,7 +142,6 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO
 //    first check children. and create them if necessary
 //    q_createNativeChildrenAndSetParent(q->windowHandle(),q);
 
-    QGuiApplicationPrivate::platformIntegration()->moveToScreen(win, topData()->screenIndex);
 //    qDebug() << "create_sys" << q << q->internalWinId();
 }
 
@@ -261,8 +261,7 @@ void QWidgetPrivate::setParent_sys(QWidget *newparent, Qt::WindowFlags f)
             maybeTopData()->screenIndex = targetScreen;
         // only if it is already created
         if (q->testAttribute(Qt::WA_WState_Created)) {
-            QPlatformIntegration *platform = QGuiApplicationPrivate::platformIntegration();
-            platform->moveToScreen(q->windowHandle(), targetScreen);
+            q->windowHandle()->setScreen(QGuiApplication::screens().value(targetScreen, 0));
         }
     }
 }