summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gui/kernel/kernel.pri7
-rw-r--r--src/gui/kernel/qapplication_qpa.cpp8
-rw-r--r--src/gui/kernel/qeventdispatcher_blackberry_qpa.cpp116
-rw-r--r--src/gui/kernel/qeventdispatcher_blackberry_qpa_p.h76
-rw-r--r--src/plugins/platforms/blackberry/blackberry.pro6
-rw-r--r--src/plugins/platforms/blackberry/qbbbpseventfilter.cpp107
-rw-r--r--src/plugins/platforms/blackberry/qbbbpseventfilter.h67
-rw-r--r--src/plugins/platforms/blackberry/qbbintegration.cpp12
-rw-r--r--src/plugins/platforms/blackberry/qbbintegration.h2
9 files changed, 399 insertions, 2 deletions
diff --git a/src/gui/kernel/kernel.pri b/src/gui/kernel/kernel.pri
index 3c57368bab..d9d67e79d9 100644
--- a/src/gui/kernel/kernel.pri
+++ b/src/gui/kernel/kernel.pri
@@ -261,6 +261,13 @@ qpa {
QMAKE_CXXFLAGS += $$QT_CFLAGS_GLIB
LIBS_PRIVATE +=$$QT_LIBS_GLIB
}
+
+ blackberry {
+ SOURCES += \
+ kernel/qeventdispatcher_blackberry_qpa.cpp
+ HEADERS += \
+ kernel/qeventdispatcher_blackberry_qpa_p.h
+ }
}
!embedded:!qpa:!x11:mac {
diff --git a/src/gui/kernel/qapplication_qpa.cpp b/src/gui/kernel/qapplication_qpa.cpp
index 242b5ef5e2..b777e38506 100644
--- a/src/gui/kernel/qapplication_qpa.cpp
+++ b/src/gui/kernel/qapplication_qpa.cpp
@@ -42,10 +42,14 @@
#include "qapplication_p.h"
#include "qcolormap.h"
#include "qpixmapcache.h"
+#if defined(Q_OS_BLACKBERRY)
+#include "qeventdispatcher_blackberry_qpa_p.h"
+#else
#if !defined(QT_NO_GLIB)
#include "qeventdispatcher_glib_qpa_p.h"
#endif
#include "qeventdispatcher_qpa_p.h"
+#endif
#ifndef QT_NO_CURSOR
#include "private/qcursor_p.h"
#endif
@@ -147,12 +151,16 @@ QString QApplicationPrivate::appName() const
void QApplicationPrivate::createEventDispatcher()
{
Q_Q(QApplication);
+#if defined(Q_OS_BLACKBERRY)
+ eventDispatcher = new QEventDispatcherBlackberryQPA(q);
+#else
#if !defined(QT_NO_GLIB)
if (qgetenv("QT_NO_GLIB").isEmpty() && QEventDispatcherGlib::versionSupported())
eventDispatcher = new QPAEventDispatcherGlib(q);
else
#endif
eventDispatcher = new QEventDispatcherQPA(q);
+#endif
}
static bool qt_try_modal(QWidget *widget, QEvent::Type type)
diff --git a/src/gui/kernel/qeventdispatcher_blackberry_qpa.cpp b/src/gui/kernel/qeventdispatcher_blackberry_qpa.cpp
new file mode 100644
index 0000000000..a7aa9a883f
--- /dev/null
+++ b/src/gui/kernel/qeventdispatcher_blackberry_qpa.cpp
@@ -0,0 +1,116 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Research In Motion
+** Contact: Research In Motion <blackberry-qt@qnx.com>
+**
+** Copyright (C) 2012 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$
+** 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 "qeventdispatcher_blackberry_qpa_p.h"
+
+#include "qapplication_p.h"
+
+#include <QWindowSystemInterface>
+
+QT_BEGIN_NAMESPACE
+
+static bool sendWindowSystemEvents(QAbstractEventDispatcher *eventDispatcher, QEventLoop::ProcessEventsFlags flags)
+{
+ int nevents = 0;
+
+ // handle gui and posted events
+ QCoreApplication::sendPostedEvents();
+
+ while (true) {
+ QWindowSystemInterfacePrivate::WindowSystemEvent *event;
+ if (!(flags & QEventLoop::ExcludeUserInputEvents)
+ && QWindowSystemInterfacePrivate::windowSystemEventsQueued() > 0) {
+ // process a pending user input event
+ event = QWindowSystemInterfacePrivate::getWindowSystemEvent();
+ if (!event)
+ break;
+ } else {
+ break;
+ }
+
+ if (eventDispatcher->filterEvent(event)) {
+ delete event;
+ continue;
+ }
+
+ nevents++;
+
+ QApplicationPrivate::processWindowSystemEvent(event);
+ delete event;
+ }
+
+ return (nevents > 0);
+}
+
+QEventDispatcherBlackberryQPA::QEventDispatcherBlackberryQPA(QObject *parent)
+ : QEventDispatcherBlackberry(parent)
+{
+}
+
+QEventDispatcherBlackberryQPA::~QEventDispatcherBlackberryQPA()
+{
+}
+
+bool QEventDispatcherBlackberryQPA::processEvents(QEventLoop::ProcessEventsFlags flags)
+{
+ bool didSendEvents = sendWindowSystemEvents(this, flags);
+
+ if (QEventDispatcherBlackberry::processEvents(flags))
+ return true;
+
+ return didSendEvents;
+}
+
+bool QEventDispatcherBlackberryQPA::hasPendingEvents()
+{
+ return QEventDispatcherBlackberry::hasPendingEvents() || QWindowSystemInterfacePrivate::windowSystemEventsQueued();
+}
+
+void QEventDispatcherBlackberryQPA::flush()
+{
+ if (qApp)
+ qApp->sendPostedEvents();
+}
+
+QT_END_NAMESPACE
diff --git a/src/gui/kernel/qeventdispatcher_blackberry_qpa_p.h b/src/gui/kernel/qeventdispatcher_blackberry_qpa_p.h
new file mode 100644
index 0000000000..7c5b5a1022
--- /dev/null
+++ b/src/gui/kernel/qeventdispatcher_blackberry_qpa_p.h
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Research In Motion
+**
+** Contact: Research In Motion <blackberry-qt@qnx.com>
+**
+** This file is part of the QtGui module 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$
+**
+****************************************************************************/
+
+#ifndef QEVENTDISPATCHER_BLACKBERRY_QPA_P_H
+#define QEVENTDISPATCHER_BLACkBERRY_QPA_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/private/qeventdispatcher_blackberry_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QEventDispatcherBlackberryQPA : public QEventDispatcherBlackberry
+{
+ Q_OBJECT
+
+public:
+ explicit QEventDispatcherBlackberryQPA(QObject *parent = 0);
+ ~QEventDispatcherBlackberryQPA();
+
+ bool processEvents(QEventLoop::ProcessEventsFlags flags);
+ bool hasPendingEvents();
+
+ void flush();
+};
+
+QT_END_NAMESPACE
+
+#endif // QEVENTDISPATCHER_BLACKBERRY_QPA_P_H
diff --git a/src/plugins/platforms/blackberry/blackberry.pro b/src/plugins/platforms/blackberry/blackberry.pro
index cded59c562..2b0f0abb75 100644
--- a/src/plugins/platforms/blackberry/blackberry.pro
+++ b/src/plugins/platforms/blackberry/blackberry.pro
@@ -43,6 +43,12 @@ HEADERS = qbbbuffer.h \
qbbabstractvirtualkeyboard.h \
qbbnativeinterface.h
+blackberry {
+ SOURCES += qbbbpseventfilter.cpp
+
+ HEADERS += qbbbpseventfilter.h
+}
+
QMAKE_CXXFLAGS += -I./private
LIBS += -lpps -lscreen -lEGL -lclipboard
diff --git a/src/plugins/platforms/blackberry/qbbbpseventfilter.cpp b/src/plugins/platforms/blackberry/qbbbpseventfilter.cpp
new file mode 100644
index 0000000000..97ed89c12d
--- /dev/null
+++ b/src/plugins/platforms/blackberry/qbbbpseventfilter.cpp
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Research In Motion
+**
+** Contact: Research In Motion <blackberry-qt@qnx.com>
+** Contact: Klarälvdalens Datakonsult AB <info@kdab.com>
+**
+** This file is part of the QtCore module 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.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//#define QBBBPSEVENTFILTER_DEBUG
+
+#include "qbbbpseventfilter.h"
+
+#include <QAbstractEventDispatcher>
+#include <QDebug>
+
+#include <bps/event.h>
+
+QT_BEGIN_NAMESPACE
+
+static QBBBpsEventFilter *sInstance;
+
+QBBBpsEventFilter::QBBBpsEventFilter(QObject *parent)
+ : QObject(parent)
+{
+ Q_ASSERT(sInstance == 0);
+
+ sInstance = this;
+}
+
+QBBBpsEventFilter::~QBBBpsEventFilter()
+{
+ Q_ASSERT(sInstance == this);
+
+ sInstance = 0;
+}
+
+void QBBBpsEventFilter::installOnEventDispatcher(QAbstractEventDispatcher *dispatcher)
+{
+#if defined(QBBBPSEVENTFILTER_DEBUG)
+ qDebug() << Q_FUNC_INFO << "dispatcher=" << dispatcher;
+#endif
+
+ QAbstractEventDispatcher::EventFilter previousEventFilter = dispatcher->setEventFilter(dispatcherEventFilter);
+
+ // the QPA plugin in created in the QApplication constructor which indirectly also creates
+ // the event dispatcher so we are the first event filter.
+ // assert on that just in case somebody adds another event filter
+ // in the QBBIntegration constructor instead of adding a new section in here
+ Q_ASSERT(previousEventFilter == 0);
+ Q_UNUSED(previousEventFilter);
+}
+
+bool QBBBpsEventFilter::dispatcherEventFilter(void *message)
+{
+#if defined(QBBBPSEVENTFILTER_DEBUG)
+ qDebug() << Q_FUNC_INFO;
+#endif
+ if (sInstance == 0)
+ return false;
+
+ bps_event_t *event = static_cast<bps_event_t *>(message);
+ return sInstance->bpsEventFilter(event);
+}
+
+bool QBBBpsEventFilter::bpsEventFilter(bps_event_t *event)
+{
+#if defined(QBBBPSEVENTFILTER_DEBUG)
+ qDebug() << Q_FUNC_INFO << "event=" << event << "domain=" << bps_event_get_domain(event);
+#else
+ Q_UNUSED(event);
+#endif
+
+ return false;
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/blackberry/qbbbpseventfilter.h b/src/plugins/platforms/blackberry/qbbbpseventfilter.h
new file mode 100644
index 0000000000..3466577324
--- /dev/null
+++ b/src/plugins/platforms/blackberry/qbbbpseventfilter.h
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Research In Motion
+**
+** Contact: Research In Motion <blackberry-qt@qnx.com>
+** Contact: Klarälvdalens Datakonsult AB <info@kdab.com>
+**
+** This file is part of the QtCore module 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.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QBBBPSEVENTFILTER_H
+#define QBBBPSEVENTFILTER_H
+
+#include <QObject>
+
+struct bps_event_t;
+
+QT_BEGIN_NAMESPACE
+
+class QAbstractEventDispatcher;
+
+class QBBBpsEventFilter : public QObject
+{
+ Q_OBJECT
+public:
+ explicit QBBBpsEventFilter(QObject *parent = 0);
+ ~QBBBpsEventFilter();
+
+ void installOnEventDispatcher(QAbstractEventDispatcher *dispatcher);
+
+private:
+ static bool dispatcherEventFilter(void *message);
+ bool bpsEventFilter(bps_event_t *event);
+};
+
+QT_END_NAMESPACE
+
+#endif // QBBBPSEVENTFILTER_H
diff --git a/src/plugins/platforms/blackberry/qbbintegration.cpp b/src/plugins/platforms/blackberry/qbbintegration.cpp
index 32c795bbfc..ee06c31927 100644
--- a/src/plugins/platforms/blackberry/qbbintegration.cpp
+++ b/src/plugins/platforms/blackberry/qbbintegration.cpp
@@ -56,8 +56,12 @@
#include "qbbglcontext.h"
#include "qbblocalethread.h"
#include "qbbnativeinterface.h"
+#if defined(Q_OS_BLACKBERRY)
+#include "qbbbpseventfilter.h"
+#endif
-#include "qapplication.h"
+#include <QtCore/QAbstractEventDispatcher>
+#include <QtGui/QApplication>
#include <QtGui/private/qpixmap_raster_p.h>
#include <QtGui/QPlatformWindow>
#include <QtGui/QWindowSystemInterface>
@@ -80,7 +84,8 @@ QBBIntegration::QBBIntegration() :
mScreenEventHandler(new QBBScreenEventHandler()),
mPaintUsingOpenGL(getenv("QBB_USE_OPENGL") != NULL),
mVirtualKeyboard(0),
- mNativeInterface(new QBBNativeInterface(this))
+ mNativeInterface(new QBBNativeInterface(this)),
+ mBpsEventFilter(0)
{
qRegisterMetaType<screen_window_t>();
@@ -123,6 +128,8 @@ QBBIntegration::QBBIntegration() :
#if defined(Q_OS_BLACKBERRY)
bps_initialize();
+ mBpsEventFilter = new QBBBpsEventFilter;
+ mBpsEventFilter->installOnEventDispatcher(QAbstractEventDispatcher::instance());
#endif
// create/start the keyboard class.
@@ -176,6 +183,7 @@ QBBIntegration::~QBBIntegration()
QBBGLContext::shutdown();
#if defined(Q_OS_BLACKBERRY)
+ delete mBpsEventFilter;
bps_shutdown();
#endif
diff --git a/src/plugins/platforms/blackberry/qbbintegration.h b/src/plugins/platforms/blackberry/qbbintegration.h
index ac51f0f1a3..eaf3876bba 100644
--- a/src/plugins/platforms/blackberry/qbbintegration.h
+++ b/src/plugins/platforms/blackberry/qbbintegration.h
@@ -54,6 +54,7 @@ class QBBAbstractVirtualKeyboard;
class QBBScreen;
class QBBScreenEventHandler;
class QBBNativeInterface;
+class QBBBpsEventFilter;
class QBBIntegration : public QPlatformIntegration
{
@@ -98,6 +99,7 @@ private:
bool mPaintUsingOpenGL;
QBBAbstractVirtualKeyboard *mVirtualKeyboard;
QBBNativeInterface *mNativeInterface;
+ QBBBpsEventFilter *mBpsEventFilter;
};
QT_END_NAMESPACE