Use main thread event loop for navigator event processing
Removes the need for an extra thread by creating the event handler's socket notifier in the context of the main thread. Change-Id: If8c7bb986074083b5b9a7b9c96734a970ba32f92 Reviewed-by: Sean Harmer <sh@theharmers.co.uk> Reviewed-by: Robin Burchell <robin+qt@viroteck.net>
This commit is contained in:
parent
3ed12e4b26
commit
9dc86ac0f2
@ -16,7 +16,7 @@ QT += opengl opengl-private platformsupport platformsupport-private widgets-priv
|
||||
#DEFINES += QQNXINPUTCONTEXT_DEBUG
|
||||
#DEFINES += QQNXINPUTCONTEXT_IMF_EVENT_DEBUG
|
||||
#DEFINES += QQNXINTEGRATION_DEBUG
|
||||
#DEFINES += QQNXNAVIGATORTHREAD_DEBUG
|
||||
#DEFINES += QQNXNAVIGATOREVENTHANDLER_DEBUG
|
||||
#DEFINES += QQNXRASTERBACKINGSTORE_DEBUG
|
||||
#DEFINES += QQNXROOTWINDOW_DEBUG
|
||||
#DEFINES += QQNXSCREEN_DEBUG
|
||||
@ -29,7 +29,7 @@ SOURCES = main.cpp \
|
||||
qqnxglcontext.cpp \
|
||||
qqnxglbackingstore.cpp \
|
||||
qqnxintegration.cpp \
|
||||
qqnxnavigatorthread.cpp \
|
||||
qqnxnavigatoreventhandler.cpp \
|
||||
qqnxscreen.cpp \
|
||||
qqnxwindow.cpp \
|
||||
qqnxrasterbackingstore.cpp \
|
||||
@ -41,7 +41,7 @@ HEADERS = qqnxbuffer.h \
|
||||
qqnxeventthread.h \
|
||||
qqnxkeytranslator.h \
|
||||
qqnxintegration.h \
|
||||
qqnxnavigatorthread.h \
|
||||
qqnxnavigatoreventhandler.h \
|
||||
qqnxglcontext.h \
|
||||
qqnxglbackingstore.h \
|
||||
qqnxscreen.h \
|
||||
|
@ -43,7 +43,7 @@
|
||||
#include "qqnxeventthread.h"
|
||||
#include "qqnxglbackingstore.h"
|
||||
#include "qqnxglcontext.h"
|
||||
#include "qqnxnavigatorthread.h"
|
||||
#include "qqnxnavigatoreventhandler.h"
|
||||
#include "qqnxrasterbackingstore.h"
|
||||
#include "qqnxscreen.h"
|
||||
#include "qqnxwindow.h"
|
||||
@ -77,7 +77,7 @@ QMutex QQnxIntegration::ms_windowMapperMutex;
|
||||
QQnxIntegration::QQnxIntegration()
|
||||
: QPlatformIntegration()
|
||||
, m_eventThread(0)
|
||||
, m_navigatorThread(0)
|
||||
, m_navigatorEventHandler(0)
|
||||
, m_inputContext(0)
|
||||
, m_fontDatabase(new QGenericUnixFontDatabase())
|
||||
, m_paintUsingOpenGL(false)
|
||||
@ -109,9 +109,15 @@ QQnxIntegration::QQnxIntegration()
|
||||
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 navigator event handler
|
||||
// Not on BlackBerry, it has specialised event dispatcher which also handles navigator events
|
||||
#ifndef Q_OS_BLACKBERRY
|
||||
m_navigatorEventHandler = new QQnxNavigatorEventHandler(*QQnxScreen::primaryDisplay());
|
||||
|
||||
// delay invocation of start() to the time the event loop is up and running
|
||||
// needed to have the QThread internals of the main thread properly initialized
|
||||
QMetaObject::invokeMethod(m_navigatorEventHandler, "start", Qt::QueuedConnection);
|
||||
#endif
|
||||
|
||||
// Create/start the keyboard class.
|
||||
QQnxVirtualKeyboard::instance();
|
||||
@ -137,7 +143,7 @@ QQnxIntegration::~QQnxIntegration()
|
||||
delete m_eventThread;
|
||||
|
||||
// Stop/destroy navigator thread
|
||||
delete m_navigatorThread;
|
||||
delete m_navigatorEventHandler;
|
||||
|
||||
// Destroy all displays
|
||||
QQnxScreen::destroyDisplays();
|
||||
|
@ -52,7 +52,7 @@ QT_BEGIN_NAMESPACE
|
||||
|
||||
class QQnxEventThread;
|
||||
class QQnxInputContext;
|
||||
class QQnxNavigatorThread;
|
||||
class QQnxNavigatorEventHandler;
|
||||
class QQnxWindow;
|
||||
|
||||
#ifndef QT_NO_CLIPBOARD
|
||||
@ -99,7 +99,7 @@ private:
|
||||
|
||||
screen_context_t m_screenContext;
|
||||
QQnxEventThread *m_eventThread;
|
||||
QQnxNavigatorThread *m_navigatorThread;
|
||||
QQnxNavigatorEventHandler *m_navigatorEventHandler;
|
||||
QQnxInputContext *m_inputContext;
|
||||
QPlatformFontDatabase *m_fontDatabase;
|
||||
bool m_paintUsingOpenGL;
|
||||
|
@ -39,7 +39,7 @@
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qqnxnavigatorthread.h"
|
||||
#include "qqnxnavigatoreventhandler.h"
|
||||
#include "qqnxscreen.h"
|
||||
|
||||
#include <QtGui/QGuiApplication>
|
||||
@ -61,25 +61,30 @@
|
||||
static const char *navigatorControlPath = "/pps/services/navigator/control";
|
||||
static const int ppsBufferSize = 4096;
|
||||
|
||||
QQnxNavigatorThread::QQnxNavigatorThread(QQnxScreen& primaryScreen)
|
||||
QQnxNavigatorEventHandler::QQnxNavigatorEventHandler(QQnxScreen& primaryScreen)
|
||||
: m_primaryScreen(primaryScreen),
|
||||
m_fd(-1),
|
||||
m_readNotifier(0)
|
||||
{
|
||||
}
|
||||
|
||||
QQnxNavigatorThread::~QQnxNavigatorThread()
|
||||
QQnxNavigatorEventHandler::~QQnxNavigatorEventHandler()
|
||||
{
|
||||
// block until thread terminates
|
||||
shutdown();
|
||||
|
||||
delete m_readNotifier;
|
||||
|
||||
// close connection to navigator
|
||||
if (m_fd != -1)
|
||||
close(m_fd);
|
||||
|
||||
#if defined(QQNXNAVIGATOREVENTHANDLER_DEBUG)
|
||||
qDebug() << "QQNX: navigator event handler stopped";
|
||||
#endif
|
||||
}
|
||||
|
||||
void QQnxNavigatorThread::run()
|
||||
void QQnxNavigatorEventHandler::start()
|
||||
{
|
||||
#if defined(QQNXNAVIGATORTHREAD_DEBUG)
|
||||
qDebug() << "QQNX: navigator thread started";
|
||||
#if defined(QQNXNAVIGATOREVENTHANDLER_DEBUG)
|
||||
qDebug() << "QQNX: navigator event handler started";
|
||||
#endif
|
||||
|
||||
// open connection to navigator
|
||||
@ -91,39 +96,12 @@ void QQnxNavigatorThread::run()
|
||||
}
|
||||
|
||||
m_readNotifier = new QSocketNotifier(m_fd, QSocketNotifier::Read);
|
||||
// using direct connection to get the slot called in this thread's context
|
||||
connect(m_readNotifier, SIGNAL(activated(int)), this, SLOT(readData()), Qt::DirectConnection);
|
||||
|
||||
exec();
|
||||
|
||||
// close connection to navigator
|
||||
close(m_fd);
|
||||
|
||||
#if defined(QQNXNAVIGATORTHREAD_DEBUG)
|
||||
qDebug() << "QQNX: navigator thread stopped";
|
||||
#endif
|
||||
connect(m_readNotifier, SIGNAL(activated(int)), this, SLOT(readData()));
|
||||
}
|
||||
|
||||
void QQnxNavigatorThread::shutdown()
|
||||
void QQnxNavigatorEventHandler::parsePPS(const QByteArray &ppsData, QByteArray &msg, QByteArray &dat, QByteArray &id)
|
||||
{
|
||||
#if defined(QQNXNAVIGATORTHREAD_DEBUG)
|
||||
qDebug() << "QQNX: navigator thread shutdown begin";
|
||||
#endif
|
||||
|
||||
// signal thread to terminate
|
||||
quit();
|
||||
|
||||
// block until thread terminates
|
||||
wait();
|
||||
|
||||
#if defined(QQNXNAVIGATORTHREAD_DEBUG)
|
||||
qDebug() << "QQNX: navigator thread shutdown end";
|
||||
#endif
|
||||
}
|
||||
|
||||
void QQnxNavigatorThread::parsePPS(const QByteArray &ppsData, QByteArray &msg, QByteArray &dat, QByteArray &id)
|
||||
{
|
||||
#if defined(QQNXNAVIGATORTHREAD_DEBUG)
|
||||
#if defined(QQNXNAVIGATOREVENTHANDLER_DEBUG)
|
||||
qDebug() << "PPS: data=" << ppsData;
|
||||
#endif
|
||||
|
||||
@ -141,7 +119,7 @@ void QQnxNavigatorThread::parsePPS(const QByteArray &ppsData, QByteArray &msg, Q
|
||||
// tokenize current attribute
|
||||
const QByteArray &attr = lines.at(i);
|
||||
|
||||
#if defined(QQNXNAVIGATORTHREAD_DEBUG)
|
||||
#if defined(QQNXNAVIGATOREVENTHANDLER_DEBUG)
|
||||
qDebug() << "PPS: attr=" << attr;
|
||||
#endif
|
||||
|
||||
@ -160,7 +138,7 @@ void QQnxNavigatorThread::parsePPS(const QByteArray &ppsData, QByteArray &msg, Q
|
||||
QByteArray key = attr.left(firstColon);
|
||||
QByteArray value = attr.mid(secondColon + 1);
|
||||
|
||||
#if defined(QQNXNAVIGATORTHREAD_DEBUG)
|
||||
#if defined(QQNXNAVIGATOREVENTHANDLER_DEBUG)
|
||||
qDebug() << "PPS: key=" << key;
|
||||
qDebug() << "PPS: val=" << value;
|
||||
#endif
|
||||
@ -178,7 +156,7 @@ void QQnxNavigatorThread::parsePPS(const QByteArray &ppsData, QByteArray &msg, Q
|
||||
}
|
||||
}
|
||||
|
||||
void QQnxNavigatorThread::replyPPS(const QByteArray &res, const QByteArray &id, const QByteArray &dat)
|
||||
void QQnxNavigatorEventHandler::replyPPS(const QByteArray &res, const QByteArray &id, const QByteArray &dat)
|
||||
{
|
||||
// construct pps message
|
||||
QByteArray ppsData = "res::";
|
||||
@ -191,7 +169,7 @@ void QQnxNavigatorThread::replyPPS(const QByteArray &res, const QByteArray &id,
|
||||
}
|
||||
ppsData += "\n";
|
||||
|
||||
#if defined(QQNXNAVIGATORTHREAD_DEBUG)
|
||||
#if defined(QQNXNAVIGATOREVENTHANDLER_DEBUG)
|
||||
qDebug() << "PPS reply=" << ppsData;
|
||||
#endif
|
||||
|
||||
@ -203,9 +181,9 @@ void QQnxNavigatorThread::replyPPS(const QByteArray &res, const QByteArray &id,
|
||||
}
|
||||
}
|
||||
|
||||
void QQnxNavigatorThread::handleMessage(const QByteArray &msg, const QByteArray &dat, const QByteArray &id)
|
||||
void QQnxNavigatorEventHandler::handleMessage(const QByteArray &msg, const QByteArray &dat, const QByteArray &id)
|
||||
{
|
||||
#if defined(QQNXNAVIGATORTHREAD_DEBUG)
|
||||
#if defined(QQNXNAVIGATOREVENTHANDLER_DEBUG)
|
||||
qDebug() << "PPS: msg=" << msg << ", dat=" << dat << ", id=" << id;
|
||||
#endif
|
||||
|
||||
@ -213,7 +191,7 @@ void QQnxNavigatorThread::handleMessage(const QByteArray &msg, const QByteArray
|
||||
if (msg == "orientationCheck") {
|
||||
|
||||
// reply to navigator that (any) orientation is acceptable
|
||||
#if defined(QQNXNAVIGATORTHREAD_DEBUG)
|
||||
#if defined(QQNXNAVIGATOREVENTHANDLER_DEBUG)
|
||||
qDebug() << "PPS: orientation check, o=" << dat;
|
||||
#endif
|
||||
replyPPS(msg, id, "true");
|
||||
@ -221,7 +199,7 @@ void QQnxNavigatorThread::handleMessage(const QByteArray &msg, const QByteArray
|
||||
} else if (msg == "orientation") {
|
||||
|
||||
// update screen geometry and reply to navigator that we're ready
|
||||
#if defined(QQNXNAVIGATORTHREAD_DEBUG)
|
||||
#if defined(QQNXNAVIGATOREVENTHANDLER_DEBUG)
|
||||
qDebug() << "PPS: orientation, o=" << dat;
|
||||
#endif
|
||||
m_primaryScreen.setRotation( dat.toInt() );
|
||||
@ -231,7 +209,7 @@ void QQnxNavigatorThread::handleMessage(const QByteArray &msg, const QByteArray
|
||||
} else if (msg == "SWIPE_DOWN") {
|
||||
|
||||
// simulate menu key press
|
||||
#if defined(QQNXNAVIGATORTHREAD_DEBUG)
|
||||
#if defined(QQNXNAVIGATOREVENTHANDLER_DEBUG)
|
||||
qDebug() << "PPS: menu";
|
||||
#endif
|
||||
QWindow *w = QGuiApplication::focusWindow();
|
||||
@ -241,16 +219,16 @@ void QQnxNavigatorThread::handleMessage(const QByteArray &msg, const QByteArray
|
||||
} else if (msg == "exit") {
|
||||
|
||||
// shutdown everything
|
||||
#if defined(QQNXNAVIGATORTHREAD_DEBUG)
|
||||
#if defined(QQNXNAVIGATOREVENTHANDLER_DEBUG)
|
||||
qDebug() << "PPS: exit";
|
||||
#endif
|
||||
QCoreApplication::quit();
|
||||
}
|
||||
}
|
||||
|
||||
void QQnxNavigatorThread::readData()
|
||||
void QQnxNavigatorEventHandler::readData()
|
||||
{
|
||||
#if defined(QQNXNAVIGATORTHREAD_DEBUG)
|
||||
#if defined(QQNXNAVIGATOREVENTHANDLER_DEBUG)
|
||||
qDebug() << "QQNX: reading navigator data";
|
||||
#endif
|
||||
// allocate buffer for pps data
|
@ -39,31 +39,30 @@
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QQNXNAVIGATORTHREAD_H
|
||||
#define QQNXNAVIGATORTHREAD_H
|
||||
#ifndef QQNXNAVIGATOREVENTHANDLER_H
|
||||
#define QQNXNAVIGATOREVENTHANDLER_H
|
||||
|
||||
#include <QThread>
|
||||
#include <QObject>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class QQnxScreen;
|
||||
class QSocketNotifier;
|
||||
|
||||
class QQnxNavigatorThread : public QThread
|
||||
class QQnxNavigatorEventHandler : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
QQnxNavigatorThread(QQnxScreen &primaryScreen);
|
||||
virtual ~QQnxNavigatorThread();
|
||||
QQnxNavigatorEventHandler(QQnxScreen &primaryScreen);
|
||||
virtual ~QQnxNavigatorEventHandler();
|
||||
|
||||
protected:
|
||||
virtual void run();
|
||||
public Q_SLOTS:
|
||||
void start();
|
||||
|
||||
private Q_SLOTS:
|
||||
void readData();
|
||||
|
||||
private:
|
||||
void shutdown();
|
||||
void parsePPS(const QByteArray &ppsData, QByteArray &msg, QByteArray &dat, QByteArray &id);
|
||||
void replyPPS(const QByteArray &res, const QByteArray &id, const QByteArray &dat);
|
||||
void handleMessage(const QByteArray &msg, const QByteArray &dat, const QByteArray &id);
|
||||
@ -75,4 +74,4 @@ private:
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QQNXNAVIGATORTHREAD_H
|
||||
#endif // QQNXNAVIGATOREVENTHANDLER_H
|
Loading…
Reference in New Issue
Block a user