Added multi-screen support to hellowindow example.
authorSamuel Rødal <samuel.rodal@nokia.com>
Tue, 6 Dec 2011 11:54:16 +0000 (12:54 +0100)
committerQt by Nokia <qt-info@nokia.com>
Tue, 6 Dec 2011 19:14:10 +0000 (20:14 +0100)
Change-Id: I025de342952bffeffa0705eb4cfcf869f32241cc
Reviewed-by: Jørgen Lind <jorgen.lind@nokia.com>
examples/opengl/hellowindow/hellowindow.cpp
examples/opengl/hellowindow/hellowindow.h
examples/opengl/hellowindow/main.cpp

index 2903ddd..742de25 100644 (file)
 
 #include <qmath.h>
 
-Renderer::Renderer(const QSurfaceFormat &format, Renderer *share)
+Renderer::Renderer(const QSurfaceFormat &format, Renderer *share, QScreen *screen)
     : m_initialized(false)
     , m_format(format)
 {
     m_context = new QOpenGLContext(this);
+    if (screen)
+        m_context->setScreen(screen);
     m_context->setFormat(format);
     if (share)
         m_context->setShareContext(share->m_context);
index 82d275a..b257cef 100644 (file)
@@ -54,7 +54,7 @@ class Renderer : public QObject
 {
     Q_OBJECT
 public:
-    Renderer(const QSurfaceFormat &format, Renderer *share = 0);
+    Renderer(const QSurfaceFormat &format, Renderer *share = 0, QScreen *screen = 0);
 
     QSurfaceFormat format() const { return m_format; }
 
index 4a11aa1..36cbc41 100644 (file)
@@ -72,15 +72,13 @@ int main(int argc, char **argv)
     windowA->setWindowTitle(QLatin1String("Thread A - Context A"));
     windowA->setVisible(true);
 
-    QThread *renderThread = 0;
+    QList<QThread *> renderThreads;
     if (multipleWindows) {
         Renderer *rendererB = new Renderer(format, rendererA);
 
-        renderThread = new QThread;
+        QThread *renderThread = new QThread;
         rendererB->moveToThread(renderThread);
-        renderThread->start();
-
-        QObject::connect(qGuiApp, SIGNAL(lastWindowClosed()), renderThread, SLOT(quit()));
+        renderThreads << renderThread;
 
         HelloWindow *windowB = new HelloWindow(rendererA);
         windowB->setGeometry(QRect(center, windowSize).translated(delta / 2, 0));
@@ -91,10 +89,37 @@ int main(int argc, char **argv)
         windowC->setGeometry(QRect(center, windowSize).translated(-windowSize.width() / 2, windowSize.height() + delta));
         windowC->setWindowTitle(QLatin1String("Thread B - Context B"));
         windowC->setVisible(true);
+
+        for (int i = 1; i < QGuiApplication::screens().size(); ++i) {
+            QScreen *screen = QGuiApplication::screens().at(i);
+            Renderer *renderer = new Renderer(format, rendererA, screen);
+
+            renderThread = new QThread;
+            renderer->moveToThread(renderThread);
+            renderThreads << renderThread;
+
+            QRect screenGeometry = screen->availableGeometry();
+            QPoint center = screenGeometry.center();
+
+            QSize windowSize = screenGeometry.size() * 0.8;
+
+            HelloWindow *window = new HelloWindow(renderer);
+            window->setScreen(screen);
+            window->setGeometry(QRect(center, windowSize).translated(-windowSize.width() / 2, -windowSize.height() / 2));
+
+            QChar id = QChar('B' + i);
+            window->setWindowTitle(QLatin1String("Thread ") + id + QLatin1String(" - Context ") + id);
+            window->setVisible(true);
+        }
+    }
+
+    for (int i = 0; i < renderThreads.size(); ++i) {
+        QObject::connect(qGuiApp, SIGNAL(lastWindowClosed()), renderThreads.at(i), SLOT(quit()));
+        renderThreads.at(i)->start();
     }
 
     app.exec();
 
-    if (multipleWindows)
-        renderThread->wait();
+    for (int i = 0; i < renderThreads.size(); ++i)
+        renderThreads.at(i)->wait();
 }