summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/qnx/qqnxintegration.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/platforms/qnx/qqnxintegration.cpp')
-rw-r--r--src/plugins/platforms/qnx/qqnxintegration.cpp293
1 files changed, 293 insertions, 0 deletions
diff --git a/src/plugins/platforms/qnx/qqnxintegration.cpp b/src/plugins/platforms/qnx/qqnxintegration.cpp
new file mode 100644
index 0000000000..2811661269
--- /dev/null
+++ b/src/plugins/platforms/qnx/qqnxintegration.cpp
@@ -0,0 +1,293 @@
+/***************************************************************************
+**
+** Copyright (C) 2011 - 2012 Research In Motion
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qqnxintegration.h"
+#include "qqnxeventthread.h"
+#include "qqnxglbackingstore.h"
+#include "qqnxglcontext.h"
+#include "qqnxnavigatorthread.h"
+#include "qqnxrasterbackingstore.h"
+#include "qqnxscreen.h"
+#include "qqnxwindow.h"
+#include "qqnxvirtualkeyboard.h"
+#include "qqnxclipboard.h"
+#include "qqnxglcontext.h"
+
+#if defined(QQnx_IMF)
+#include "qqnxinputcontext_imf.h"
+#else
+#include "qqnxinputcontext_noimf.h"
+#endif
+
+#include "private/qgenericunixfontdatabase_p.h"
+#include "private/qgenericunixeventdispatcher_p.h"
+
+#include <QtGui/QPlatformWindow>
+#include <QtGui/QWindowSystemInterface>
+#include <QtGui/QOpenGLContext>
+
+#include <QtCore/QDebug>
+#include <QtCore/QHash>
+
+#include <errno.h>
+
+QT_BEGIN_NAMESPACE
+
+QQnxWindowMapper QQnxIntegration::ms_windowMapper;
+QMutex QQnxIntegration::ms_windowMapperMutex;
+
+QQnxIntegration::QQnxIntegration()
+ : QPlatformIntegration()
+ , m_eventThread(0)
+ , m_navigatorThread(0)
+ , m_inputContext(0)
+ , m_fontDatabase(new QGenericUnixFontDatabase())
+ , m_paintUsingOpenGL(false)
+ , m_eventDispatcher(createUnixEventDispatcher())
+#ifndef QT_NO_CLIPBOARD
+ , m_clipboard(0)
+#endif
+{
+#if defined(QQNXINTEGRATION_DEBUG)
+ qDebug() << Q_FUNC_INFO;
+#endif
+ // Open connection to QNX composition manager
+ errno = 0;
+ int result = screen_create_context(&m_screenContext, SCREEN_APPLICATION_CONTEXT);
+ if (result != 0) {
+ qFatal("QQnx: failed to connect to composition manager, errno=%d", errno);
+ }
+
+ // Create displays for all possible screens (which may not be attached)
+ QQnxScreen::createDisplays(m_screenContext);
+ Q_FOREACH (QPlatformScreen *screen, QQnxScreen::screens()) {
+ screenAdded(screen);
+ }
+
+ // Initialize global OpenGL resources
+ QQnxGLContext::initialize();
+
+ // Create/start event thread
+ m_eventThread = new QQnxEventThread(m_screenContext, *QQnxScreen::primaryDisplay());
+ m_eventThread->start();
+
+ // Create/start navigator thread
+ m_navigatorThread = new QQnxNavigatorThread(*QQnxScreen::primaryDisplay());
+ m_navigatorThread->start();
+
+ // Create/start the keyboard class.
+ QQnxVirtualKeyboard::instance();
+
+ // Set up the input context
+ m_inputContext = new QQnxInputContext;
+}
+
+QQnxIntegration::~QQnxIntegration()
+{
+#if defined(QQNXINTEGRATION_DEBUG)
+ qDebug() << "QQnx: platform plugin shutdown begin";
+#endif
+ // Destroy the keyboard class.
+ QQnxVirtualKeyboard::destroy();
+
+#ifndef QT_NO_CLIPBOARD
+ // Delete the clipboard
+ delete m_clipboard;
+#endif
+
+ // Stop/destroy event thread
+ delete m_eventThread;
+
+ // Stop/destroy navigator thread
+ delete m_navigatorThread;
+
+ // Destroy all displays
+ QQnxScreen::destroyDisplays();
+
+ // Close connection to QNX composition manager
+ screen_destroy_context(m_screenContext);
+
+ // Cleanup global OpenGL resources
+ QQnxGLContext::shutdown();
+
+#if defined(QQNXINTEGRATION_DEBUG)
+ qDebug() << "QQnx: platform plugin shutdown end";
+#endif
+}
+
+bool QQnxIntegration::hasCapability(QPlatformIntegration::Capability cap) const
+{
+#if defined(QQNXINTEGRATION_DEBUG)
+ qDebug() << Q_FUNC_INFO;
+#endif
+ switch (cap) {
+ case ThreadedPixmaps: return true;
+#if defined(QT_OPENGL_ES)
+ case OpenGL:
+ return true;
+#endif
+ default: return QPlatformIntegration::hasCapability(cap);
+ }
+}
+
+QPlatformWindow *QQnxIntegration::createPlatformWindow(QWindow *window) const
+{
+#if defined(QQNXINTEGRATION_DEBUG)
+ qDebug() << Q_FUNC_INFO;
+#endif
+ // New windows are created on the primary display.
+ return new QQnxWindow(window, m_screenContext);
+}
+
+QPlatformBackingStore *QQnxIntegration::createPlatformBackingStore(QWindow *window) const
+{
+#if defined(QQNXINTEGRATION_DEBUG)
+ qDebug() << Q_FUNC_INFO;
+#endif
+ if (paintUsingOpenGL())
+ return new QQnxGLBackingStore(window);
+ else
+ return new QQnxRasterBackingStore(window);
+}
+
+QPlatformOpenGLContext *QQnxIntegration::createPlatformOpenGLContext(QOpenGLContext *context) const
+{
+#if defined(QQNXINTEGRATION_DEBUG)
+ qDebug() << Q_FUNC_INFO;
+#endif
+ return new QQnxGLContext(context);
+}
+
+QPlatformInputContext *QQnxIntegration::inputContext() const
+{
+#if defined(QQNXINTEGRATION_DEBUG)
+ qDebug() << Q_FUNC_INFO;
+#endif
+ return m_inputContext;
+}
+
+void QQnxIntegration::moveToScreen(QWindow *window, int screen)
+{
+#if defined(QQNXINTEGRATION_DEBUG)
+ qDebug() << "QQnxIntegration::moveToScreen - w=" << window << ", s=" << screen;
+#endif
+
+ // get platform window used by widget
+ QQnxWindow *platformWindow = static_cast<QQnxWindow *>(window->handle());
+
+ // lookup platform screen by index
+ QQnxScreen *platformScreen = static_cast<QQnxScreen*>(QQnxScreen::screens().at(screen));
+
+ // move the platform window to the platform screen
+ platformWindow->setScreen(platformScreen);
+}
+
+QList<QPlatformScreen *> QQnxIntegration::screens() const
+{
+#if defined(QQNXINTEGRATION_DEBUG)
+ qDebug() << Q_FUNC_INFO;
+#endif
+ return QQnxScreen::screens();
+}
+
+QAbstractEventDispatcher *QQnxIntegration::guiThreadEventDispatcher() const
+{
+#if defined(QQNXINTEGRATION_DEBUG)
+ qDebug() << Q_FUNC_INFO;
+#endif
+ return m_eventDispatcher;
+}
+
+#ifndef QT_NO_CLIPBOARD
+QPlatformClipboard *QQnxIntegration::clipboard() const
+{
+#if defined(QQNXINTEGRATION_DEBUG)
+ qDebug() << Q_FUNC_INFO;
+#endif
+ if (!m_clipboard) {
+ m_clipboard = new QQnxClipboard;
+ }
+ return m_clipboard;
+}
+#endif
+
+QVariant QQnxIntegration::styleHint(QPlatformIntegration::StyleHint hint) const
+{
+#if defined(QQNXINTEGRATION_DEBUG)
+ qDebug() << Q_FUNC_INFO;
+#endif
+ if (hint == ShowIsFullScreen)
+ return true;
+
+ return QPlatformIntegration::styleHint(hint);
+}
+
+QWindow *QQnxIntegration::window(screen_window_t qnxWindow)
+{
+#if defined(QQNXINTEGRATION_DEBUG)
+ qDebug() << Q_FUNC_INFO;
+#endif
+ QMutexLocker locker(&ms_windowMapperMutex);
+ Q_UNUSED(locker);
+ return ms_windowMapper.value(qnxWindow, 0);
+}
+
+void QQnxIntegration::addWindow(screen_window_t qnxWindow, QWindow *window)
+{
+#if defined(QQNXINTEGRATION_DEBUG)
+ qDebug() << Q_FUNC_INFO;
+#endif
+ QMutexLocker locker(&ms_windowMapperMutex);
+ Q_UNUSED(locker);
+ ms_windowMapper.insert(qnxWindow, window);
+}
+
+void QQnxIntegration::removeWindow(screen_window_t qnxWindow)
+{
+#if defined(QQNXINTEGRATION_DEBUG)
+ qDebug() << Q_FUNC_INFO;
+#endif
+ QMutexLocker locker(&ms_windowMapperMutex);
+ Q_UNUSED(locker);
+ ms_windowMapper.remove(qnxWindow);
+}
+
+QT_END_NAMESPACE