From 1565d4a6337a67fbc3e892664e02465230817c40 Mon Sep 17 00:00:00 2001 From: Kevin Krammer Date: Wed, 2 May 2012 12:29:26 +0200 Subject: Add implementation of virtual keyboard based on BPS events Backport of a818a1eb2f3d2c5ac61da7e1a8cf1b341e63aed1 Change-Id: I32bc78eb465890702cbf657b077fdf1f8e8e4a63 Reviewed-by: Sean Harmer Reviewed-by: Robin Burchell --- src/plugins/platforms/blackberry/blackberry.pro | 10 +- .../platforms/blackberry/qbbbpseventfilter.cpp | 8 +- .../platforms/blackberry/qbbbpseventfilter.h | 5 +- .../platforms/blackberry/qbbintegration.cpp | 20 +- .../platforms/blackberry/qbbvirtualkeyboard.cpp | 428 --------------------- .../platforms/blackberry/qbbvirtualkeyboard.h | 99 ----- .../platforms/blackberry/qbbvirtualkeyboardbps.cpp | 209 ++++++++++ .../platforms/blackberry/qbbvirtualkeyboardbps.h | 70 ++++ .../platforms/blackberry/qbbvirtualkeyboardpps.cpp | 428 +++++++++++++++++++++ .../platforms/blackberry/qbbvirtualkeyboardpps.h | 99 +++++ 10 files changed, 836 insertions(+), 540 deletions(-) delete mode 100644 src/plugins/platforms/blackberry/qbbvirtualkeyboard.cpp delete mode 100644 src/plugins/platforms/blackberry/qbbvirtualkeyboard.h create mode 100644 src/plugins/platforms/blackberry/qbbvirtualkeyboardbps.cpp create mode 100644 src/plugins/platforms/blackberry/qbbvirtualkeyboardbps.h create mode 100644 src/plugins/platforms/blackberry/qbbvirtualkeyboardpps.cpp create mode 100644 src/plugins/platforms/blackberry/qbbvirtualkeyboardpps.h diff --git a/src/plugins/platforms/blackberry/blackberry.pro b/src/plugins/platforms/blackberry/blackberry.pro index 4070237..6fcef85 100644 --- a/src/plugins/platforms/blackberry/blackberry.pro +++ b/src/plugins/platforms/blackberry/blackberry.pro @@ -16,7 +16,7 @@ SOURCES = main.cpp \ qbbscreen.cpp \ qbbwindow.cpp \ qbbrasterwindowsurface.cpp \ - qbbvirtualkeyboard.cpp \ + qbbvirtualkeyboardpps.cpp \ qbbclipboard.cpp \ qbblocalethread.cpp \ qbbrootwindow.cpp \ @@ -35,7 +35,7 @@ HEADERS = qbbbuffer.h \ qbbscreen.h \ qbbwindow.h \ qbbrasterwindowsurface.h \ - qbbvirtualkeyboard.h \ + qbbvirtualkeyboardpps.h \ qbbclipboard.h \ qbblocalethread.h \ qbbrootwindow.h \ @@ -44,9 +44,11 @@ HEADERS = qbbbuffer.h \ qbbnativeinterface.h blackberry { - SOURCES += qbbbpseventfilter.cpp + SOURCES += qbbbpseventfilter.cpp \ + qbbvirtualkeyboardbps.cpp - HEADERS += qbbbpseventfilter.h + HEADERS += qbbbpseventfilter.h \ + qbbvirtualkeyboardbps.h } QMAKE_CXXFLAGS += -I./private diff --git a/src/plugins/platforms/blackberry/qbbbpseventfilter.cpp b/src/plugins/platforms/blackberry/qbbbpseventfilter.cpp index 7d1701b..79a48f6 100644 --- a/src/plugins/platforms/blackberry/qbbbpseventfilter.cpp +++ b/src/plugins/platforms/blackberry/qbbbpseventfilter.cpp @@ -43,6 +43,7 @@ #include "qbbnavigatoreventhandler.h" #include "qbbscreen.h" #include "qbbscreeneventhandler.h" +#include "qbbvirtualkeyboardbps.h" #include #include @@ -56,10 +57,12 @@ QT_BEGIN_NAMESPACE static QBBBpsEventFilter *sInstance; QBBBpsEventFilter::QBBBpsEventFilter(QBBNavigatorEventHandler *navigatorEventHandler, - QBBScreenEventHandler *screenEventHandler, QObject *parent) + QBBScreenEventHandler *screenEventHandler, + QBBVirtualKeyboardBps *virtualKeyboard, QObject *parent) : QObject(parent) , mNavigatorEventHandler(navigatorEventHandler) , mScreenEventHandler(screenEventHandler) + , mVirtualKeyboard(virtualKeyboard) { Q_ASSERT(sInstance == 0); @@ -131,6 +134,9 @@ bool QBBBpsEventFilter::bpsEventFilter(bps_event_t *event) if (eventDomain == navigator_get_domain()) return handleNavigatorEvent(event); + if (mVirtualKeyboard->handleEvent(event)) + return true; + return false; } diff --git a/src/plugins/platforms/blackberry/qbbbpseventfilter.h b/src/plugins/platforms/blackberry/qbbbpseventfilter.h index 67e6e76..e47c756 100644 --- a/src/plugins/platforms/blackberry/qbbbpseventfilter.h +++ b/src/plugins/platforms/blackberry/qbbbpseventfilter.h @@ -50,13 +50,15 @@ class QAbstractEventDispatcher; class QBBNavigatorEventHandler; class QBBScreen; class QBBScreenEventHandler; +class QBBVirtualKeyboardBps; class QBBBpsEventFilter : public QObject { Q_OBJECT public: QBBBpsEventFilter(QBBNavigatorEventHandler *navigatorEventHandler, - QBBScreenEventHandler *screenEventHandler, QObject *parent = 0); + QBBScreenEventHandler *screenEventHandler, + QBBVirtualKeyboardBps *virtualKeyboard, QObject *parent = 0); ~QBBBpsEventFilter(); void installOnEventDispatcher(QAbstractEventDispatcher *dispatcher); @@ -73,6 +75,7 @@ private: private: QBBNavigatorEventHandler *mNavigatorEventHandler; QBBScreenEventHandler *mScreenEventHandler; + QBBVirtualKeyboardBps *mVirtualKeyboard; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/blackberry/qbbintegration.cpp b/src/plugins/platforms/blackberry/qbbintegration.cpp index 4767dcd..28484ba 100644 --- a/src/plugins/platforms/blackberry/qbbintegration.cpp +++ b/src/plugins/platforms/blackberry/qbbintegration.cpp @@ -50,7 +50,7 @@ #include "qbbscreen.h" #include "qbbscreeneventhandler.h" #include "qbbwindow.h" -#include "qbbvirtualkeyboard.h" +#include "qbbvirtualkeyboardpps.h" #include "qgenericunixfontdatabase.h" #include "qbbclipboard.h" #include "qbbglcontext.h" @@ -58,6 +58,7 @@ #include "qbbnativeinterface.h" #if defined(Q_OS_BLACKBERRY) #include "qbbbpseventfilter.h" +#include "qbbvirtualkeyboardbps.h" #endif #include @@ -134,21 +135,26 @@ QBBIntegration::QBBIntegration() : #if defined(Q_OS_BLACKBERRY) bps_initialize(); - mBpsEventFilter = new QBBBpsEventFilter(mNavigatorEventHandler, mScreenEventHandler); + + QBBVirtualKeyboardBps *virtualKeyboardBps = new QBBVirtualKeyboardBps; + + mBpsEventFilter = new QBBBpsEventFilter(mNavigatorEventHandler, mScreenEventHandler, virtualKeyboardBps); Q_FOREACH (QPlatformScreen *platformScreen, mScreens) { QBBScreen *screen = static_cast(platformScreen); mBpsEventFilter->registerForScreenEvents(screen); } mBpsEventFilter->installOnEventDispatcher(QAbstractEventDispatcher::instance()); -#endif + mVirtualKeyboard = virtualKeyboardBps; +#else // create/start the keyboard class. - mVirtualKeyboard = new QBBVirtualKeyboard(); + mVirtualKeyboard = new QBBVirtualKeyboardPps(); // 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(mVirtualKeyboard, "start", Qt::QueuedConnection); +#endif // TODO check if we need to do this for all screens or only the primary one QObject::connect(mVirtualKeyboard, SIGNAL(heightChanged(int)), @@ -167,9 +173,6 @@ QBBIntegration::~QBBIntegration() delete mNativeInterface; - // destroy the keyboard class. - delete mVirtualKeyboard; - #ifdef QBBLOCALETHREAD_ENABLED // stop/destroy the locale thread. delete mLocaleThread; @@ -190,6 +193,9 @@ QBBIntegration::~QBBIntegration() delete mBpsEventFilter; #endif + // destroy the keyboard class. + delete mVirtualKeyboard; + delete mNavigatorEventHandler; delete mScreenEventHandler; diff --git a/src/plugins/platforms/blackberry/qbbvirtualkeyboard.cpp b/src/plugins/platforms/blackberry/qbbvirtualkeyboard.cpp deleted file mode 100644 index a10b122..0000000 --- a/src/plugins/platforms/blackberry/qbbvirtualkeyboard.cpp +++ /dev/null @@ -1,428 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 - 2012 Research In Motion -** -** Contact: Research In Motion -** Contact: Klarälvdalens Datakonsult AB -** -** 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 QBBVIRTUALKEYBOARD_DEBUG - -#include "qbbvirtualkeyboard.h" - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -QT_BEGIN_NAMESPACE - -const char *QBBVirtualKeyboard::sPPSPath = "/pps/services/input/control"; -const size_t QBBVirtualKeyboard::sBufferSize = 2048; - -// Huge hack for keyboard shadow (see QNX PR 88400). Should be removed ASAP. -#define KEYBOARD_SHADOW_HEIGHT 8 - -QBBVirtualKeyboard::QBBVirtualKeyboard() - : mEncoder(0), - mDecoder(0), - mBuffer(0), - mFd(-1), - mReadNotifier(0) -{ -} - -QBBVirtualKeyboard::~QBBVirtualKeyboard() -{ - close(); -} - -void QBBVirtualKeyboard::start() -{ -#ifdef QBBVIRTUALKEYBOARD_DEBUG - qDebug() << "QBB: starting keyboard event processing"; -#endif - - if (!connect()) - return; -} - -void QBBVirtualKeyboard::applyKeyboardMode(KeyboardMode mode) -{ - applyKeyboardModeOptions(mode); -} - -void QBBVirtualKeyboard::close() -{ - delete mReadNotifier; - mReadNotifier = 0; - - if (mFd != -1) { - // any reads will fail after we close the fd, which is basically what we want. - ::close(mFd); - mFd = -1; - } - - if (mDecoder) { - pps_decoder_cleanup(mDecoder); - delete mDecoder; - mDecoder = 0; - } - - if (mEncoder) { - pps_encoder_cleanup(mEncoder); - delete mEncoder; - mEncoder = 0; - } - - delete [] mBuffer; - mBuffer = 0; -} - -bool QBBVirtualKeyboard::connect() -{ - close(); - - mEncoder = new pps_encoder_t; - mDecoder = new pps_decoder_t; - - pps_encoder_initialize(mEncoder, false); - pps_decoder_initialize(mDecoder, NULL); - - errno = 0; - mFd = ::open(sPPSPath, O_RDWR); - if (mFd == -1) { - qCritical("QBBVirtualKeyboard: Unable to open \"%s\" for keyboard: %s (%d).", - sPPSPath, strerror(errno), errno); - close(); - return false; - } - - mBuffer = new char[sBufferSize]; - if (!mBuffer) { - qCritical("QBBVirtualKeyboard: Unable to allocate buffer of %d bytes. Size is unavailable.", sBufferSize); - return false; - } - - if (!queryPPSInfo()) - return false; - - mReadNotifier = new QSocketNotifier(mFd, QSocketNotifier::Read); - QObject::connect(mReadNotifier, SIGNAL(activated(int)), this, SLOT(ppsDataReady())); - - return true; -} - -bool QBBVirtualKeyboard::queryPPSInfo() -{ - // Request info, requires id to regenerate res message. - pps_encoder_add_string(mEncoder, "msg", "info"); - pps_encoder_add_string(mEncoder, "id", "libWebView"); - - if (::write(mFd, pps_encoder_buffer(mEncoder), pps_encoder_length(mEncoder)) == -1) { - close(); - return false; - } - - pps_encoder_reset(mEncoder); - - return true; -} - -void QBBVirtualKeyboard::ppsDataReady() -{ - ssize_t nread = qt_safe_read(mFd, mBuffer, sBufferSize - 1); - -#ifdef QBBVIRTUALKEYBOARD_DEBUG - qDebug() << "QBB: keyboardMessage size: " << nread; -#endif - if (nread < 0) { - connect(); // reconnect - return; - } - - // We sometimes get spurious read notifications when no data is available. - // Bail out early in this case - if (nread == 0) - return; - - // nread is the real space necessary, not the amount read. - if (static_cast(nread) > sBufferSize - 1) { - qCritical("QBBVirtualKeyboard: Keyboard buffer size too short; need %u.", nread + 1); - connect(); // reconnect - return; - } - - mBuffer[nread] = 0; - pps_decoder_parse_pps_str(mDecoder, mBuffer); - pps_decoder_push(mDecoder, NULL); -#ifdef QBBVIRTUALKEYBOARD_DEBUG - pps_decoder_dump_tree(mDecoder, stderr); -#endif - - const char* value; - if (pps_decoder_get_string(mDecoder, "error", &value) == PPS_DECODER_OK) { - qCritical("QBBVirtualKeyboard: Keyboard PPS decoder error: %s", value ? value : "[null]"); - return; - } - - if (pps_decoder_get_string(mDecoder, "msg", &value) == PPS_DECODER_OK) { - if (strcmp(value, "show") == 0) - setVisible(true); - else if (strcmp(value, "hide") == 0) - setVisible(false); - else if (strcmp(value, "info") == 0) - handleKeyboardInfoMessage(); - else if (strcmp(value, "connect") == 0) { } - else - qCritical("QBBVirtualKeyboard: Unexpected keyboard PPS msg value: %s", value ? value : "[null]"); - } else if (pps_decoder_get_string(mDecoder, "res", &value) == PPS_DECODER_OK) { - if (strcmp(value, "info") == 0) - handleKeyboardInfoMessage(); - else - qCritical("QBBVirtualKeyboard: Unexpected keyboard PPS res value: %s", value ? value : "[null]"); - } else { - qCritical("QBBVirtualKeyboard: Unexpected keyboard PPS message type"); - } -} - -void QBBVirtualKeyboard::handleKeyboardInfoMessage() -{ - int newHeight = 0; - const char* value; - - if (pps_decoder_push(mDecoder, "dat") != PPS_DECODER_OK) { - qCritical("QBBVirtualKeyboard: Keyboard PPS dat object not found"); - return; - } - if (pps_decoder_get_int(mDecoder, "size", &newHeight) != PPS_DECODER_OK) { - qCritical("QBBVirtualKeyboard: Keyboard PPS size field not found"); - return; - } - if (pps_decoder_push(mDecoder, "locale") != PPS_DECODER_OK) { - qCritical("QBBVirtualKeyboard: Keyboard PPS locale object not found"); - return; - } - if (pps_decoder_get_string(mDecoder, "languageId", &value) != PPS_DECODER_OK) { - qCritical("QBBVirtualKeyboard: Keyboard PPS languageId field not found"); - return; - } - setLanguage(QString::fromLatin1(value)); - - if (pps_decoder_get_string(mDecoder, "countryId", &value) != PPS_DECODER_OK) { - qCritical("QBBVirtualKeyboard: Keyboard PPS size countryId not found"); - return; - } - setCountry(QString::fromLatin1(value)); - - // HUGE hack, should be removed ASAP. - newHeight -= KEYBOARD_SHADOW_HEIGHT; // We want to ignore the 8 pixel shadow above the keyboard. (PR 88400) - setHeight(newHeight); - -#ifdef QBBVIRTUALKEYBOARD_DEBUG - qDebug() << "QBB: handleKeyboardInfoMessage size=" << getHeight() << "languageId=" << languageId() << " countryId=" << countryId(); -#endif -} - -bool QBBVirtualKeyboard::showKeyboard() -{ -#ifdef QBBVIRTUALKEYBOARD_DEBUG - qDebug() << "QBB: showKeyboard()"; -#endif - - // Try to connect. - if (mFd == -1 && !connect()) - return false; - - // NOTE: This must be done everytime the keyboard is shown even if there is no change because - // hiding the keyboard wipes the setting. - applyKeyboardModeOptions(keyboardMode()); - - pps_encoder_reset(mEncoder); - - // Send the show message. - pps_encoder_add_string(mEncoder, "msg", "show"); - - if (::write(mFd, pps_encoder_buffer(mEncoder), pps_encoder_length(mEncoder)) == -1) { - close(); - return false; - } - - pps_encoder_reset(mEncoder); - - // Return true if no error occurs. Sizing response will be triggered when confirmation of - // the change arrives. - return true; -} - -bool QBBVirtualKeyboard::hideKeyboard() -{ -#ifdef QBBVIRTUALKEYBOARD_DEBUG - qDebug() << "QBB: hideKeyboard()"; -#endif - - if (mFd == -1 && !connect()) - return false; - - pps_encoder_add_string(mEncoder, "msg", "hide"); - - if (::write(mFd, pps_encoder_buffer(mEncoder), pps_encoder_length(mEncoder)) == -1) { - close(); - - //Try again. - if (connect()) { - if (::write(mFd, pps_encoder_buffer(mEncoder), pps_encoder_length(mEncoder)) == -1) { - close(); - return false; - } - } else { - return false; - } - } - - pps_encoder_reset(mEncoder); - - // Return true if no error occurs. Sizing response will be triggered when confirmation of - // the change arrives. - return true; -} - -void QBBVirtualKeyboard::applyKeyboardModeOptions(KeyboardMode mode) -{ - // Try to connect. - if (mFd == -1 && !connect()) - return; - - // Send the options message. - pps_encoder_add_string(mEncoder, "msg", "options"); - - pps_encoder_start_object(mEncoder, "dat"); - switch (mode) { - case Url: - addUrlModeOptions(); - break; - case Email: - addEmailModeOptions(); - break; - case Web: - addWebModeOptions(); - break; - case NumPunc: - addNumPuncModeOptions(); - break; - case Symbol: - addSymbolModeOptions(); - break; - case Phone: - addPhoneModeOptions(); - break; - case Pin: - addPinModeOptions(); - break; - case Default: // fall through - default: - addDefaultModeOptions(); - break; - } - - pps_encoder_end_object(mEncoder); - - if (::write(mFd, pps_encoder_buffer(mEncoder), pps_encoder_length(mEncoder)) == -1) - close(); - - pps_encoder_reset(mEncoder); -} - -void QBBVirtualKeyboard::addDefaultModeOptions() -{ - pps_encoder_add_string(mEncoder, "enter", "enter.default"); - pps_encoder_add_string(mEncoder, "type", "default"); -} - -void QBBVirtualKeyboard::addUrlModeOptions() -{ - pps_encoder_add_string(mEncoder, "enter", "enter.default"); - pps_encoder_add_string(mEncoder, "type", "url"); -} - -void QBBVirtualKeyboard::addEmailModeOptions() -{ - pps_encoder_add_string(mEncoder, "enter", "enter.default"); - pps_encoder_add_string(mEncoder, "type", "email"); -} - -void QBBVirtualKeyboard::addWebModeOptions() -{ - pps_encoder_add_string(mEncoder, "enter", "enter.default"); - pps_encoder_add_string(mEncoder, "type", "web"); -} - -void QBBVirtualKeyboard::addNumPuncModeOptions() -{ - pps_encoder_add_string(mEncoder, "enter", "enter.default"); - pps_encoder_add_string(mEncoder, "type", "numPunc"); -} - -void QBBVirtualKeyboard::addPhoneModeOptions() -{ - pps_encoder_add_string(mEncoder, "enter", "enter.default"); - pps_encoder_add_string(mEncoder, "type", "phone"); -} - -void QBBVirtualKeyboard::addPinModeOptions() -{ - pps_encoder_add_string(mEncoder, "enter", "enter.default"); - pps_encoder_add_string(mEncoder, "type", "pin"); -} - -void QBBVirtualKeyboard::addSymbolModeOptions() -{ - pps_encoder_add_string(mEncoder, "enter", "enter.default"); - pps_encoder_add_string(mEncoder, "type", "symbol"); -} - -QT_END_NAMESPACE diff --git a/src/plugins/platforms/blackberry/qbbvirtualkeyboard.h b/src/plugins/platforms/blackberry/qbbvirtualkeyboard.h deleted file mode 100644 index e544622..0000000 --- a/src/plugins/platforms/blackberry/qbbvirtualkeyboard.h +++ /dev/null @@ -1,99 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 - 2012 Research In Motion -** -** Contact: Research In Motion -** Contact: Klarälvdalens Datakonsult AB -** -** 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 VIRTUALKEYBOARD_H_ -#define VIRTUALKEYBOARD_H_ - -#include "qbbabstractvirtualkeyboard.h" - -#include - -QT_BEGIN_NAMESPACE - -class QSocketNotifier; - -/* Shamelessly copied from the browser - this should be rewritten once we have a proper PPS wrapper class */ -class QBBVirtualKeyboard : public QBBAbstractVirtualKeyboard -{ - Q_OBJECT -public: - QBBVirtualKeyboard(); - ~QBBVirtualKeyboard(); - - bool showKeyboard(); - bool hideKeyboard(); - -public Q_SLOTS: - void start(); - -protected: - void applyKeyboardMode(KeyboardMode mode); - -private Q_SLOTS: - void ppsDataReady(); - -private: - pps_encoder_t *mEncoder; - pps_decoder_t *mDecoder; - char *mBuffer; - int mFd; - QSocketNotifier *mReadNotifier; - - // Path to keyboardManager in PPS. - static const char *sPPSPath; - static const size_t sBufferSize; - - // Will be called internally if needed. - bool connect(); - void close(); - bool queryPPSInfo(); - void handleKeyboardInfoMessage(); - - void applyKeyboardModeOptions(KeyboardMode mode); - void addDefaultModeOptions(); - void addUrlModeOptions(); - void addEmailModeOptions(); - void addWebModeOptions(); - void addNumPuncModeOptions(); - void addSymbolModeOptions(); - void addPhoneModeOptions(); - void addPinModeOptions(); -}; - -#endif /* VIRTUALKEYBOARD_H_ */ diff --git a/src/plugins/platforms/blackberry/qbbvirtualkeyboardbps.cpp b/src/plugins/platforms/blackberry/qbbvirtualkeyboardbps.cpp new file mode 100644 index 0000000..c364f3b --- /dev/null +++ b/src/plugins/platforms/blackberry/qbbvirtualkeyboardbps.cpp @@ -0,0 +1,209 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Research In Motion +** +** Contact: Research In Motion +** Contact: Klarälvdalens Datakonsult AB +** +** 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 QBBVIRTUALKEYBOARD_DEBUG + +#include "qbbvirtualkeyboardbps.h" + +#include + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +QBBVirtualKeyboardBps::QBBVirtualKeyboardBps(QObject *parent) + : QBBAbstractVirtualKeyboard(parent) +{ + if (locale_request_events(0) != BPS_SUCCESS) + qWarning("QBB: Failed to register for locale events"); + + if (virtualkeyboard_request_events(0) != BPS_SUCCESS) + qWarning("QBB: Failed to register for virtual keyboard events"); + + int height = 0; + if (virtualkeyboard_get_height(&height) != BPS_SUCCESS) + qWarning("QBB: Failed to get virtual keyboard height"); + + setHeight(height); +} + +bool QBBVirtualKeyboardBps::handleEvent(bps_event_t *event) +{ + const int eventDomain = bps_event_get_domain(event); + if (eventDomain == locale_get_domain()) + return handleLocaleEvent(event); + + if (eventDomain == virtualkeyboard_get_domain()) + return handleVirtualKeyboardEvent(event); + + return false; +} + +bool QBBVirtualKeyboardBps::showKeyboard() +{ +#if defined(QBBVIRTUALKEYBOARD_DEBUG) + qDebug() << Q_FUNC_INFO << "current visibility=" << isVisible(); +#endif + + virtualkeyboard_show(); + return true; +} + +bool QBBVirtualKeyboardBps::hideKeyboard() +{ +#if defined(QBBVIRTUALKEYBOARD_DEBUG) + qDebug() << Q_FUNC_INFO << "current visibility=" << isVisible(); +#endif + + virtualkeyboard_hide(); + return true; +} + +void QBBVirtualKeyboardBps::applyKeyboardMode(KeyboardMode mode) +{ + virtualkeyboard_layout_t layout = VIRTUALKEYBOARD_LAYOUT_DEFAULT; + + switch (mode) { + case Url: + layout = VIRTUALKEYBOARD_LAYOUT_URL; + break; + + case Email: + layout = VIRTUALKEYBOARD_LAYOUT_EMAIL; + break; + + case Web: + layout = VIRTUALKEYBOARD_LAYOUT_WEB; + break; + + case NumPunc: + layout = VIRTUALKEYBOARD_LAYOUT_NUM_PUNC; + break; + + case Symbol: + layout = VIRTUALKEYBOARD_LAYOUT_SYMBOL; + break; + + case Phone: + layout = VIRTUALKEYBOARD_LAYOUT_PHONE; + break; + + case Pin: + layout = VIRTUALKEYBOARD_LAYOUT_PIN; + break; + + case Default: // fall through + default: + layout = VIRTUALKEYBOARD_LAYOUT_DEFAULT; + break; + } + +#if defined(QBBVIRTUALKEYBOARD_DEBUG) + qDebug() << Q_FUNC_INFO << "mode=" << mode; +#endif + + virtualkeyboard_change_options(layout, VIRTUALKEYBOARD_ENTER_DEFAULT); +} + +bool QBBVirtualKeyboardBps::handleLocaleEvent(bps_event_t *event) +{ + if (bps_event_get_code(event) == LOCALE_INFO) { + const QString language = QString::fromAscii(locale_event_get_language(event)); + const QString country = QString::fromAscii(locale_event_get_country(event)); + +#if defined(QBBVIRTUALKEYBOARD_DEBUG) + qDebug() << Q_FUNC_INFO << "current language/country" << languageId() << "/" << countryId() + << "new language/country=" << language << "/" << country; +#endif + setLanguage(language); + setCountry(country); + return true; + } + +#if defined(QBBVIRTUALKEYBOARD_DEBUG) + qDebug() << "QBB: Unhandled locale event. code=" << bps_event_get_code(event); +#endif + + return false; +} + +bool QBBVirtualKeyboardBps::handleVirtualKeyboardEvent(bps_event_t *event) +{ + switch (bps_event_get_code(event)) { + case VIRTUALKEYBOARD_EVENT_VISIBLE: + #if defined(QBBVIRTUALKEYBOARD_DEBUG) + qDebug() << Q_FUNC_INFO << "EVENT VISIBLE: current visibility=" << isVisible(); + #endif + + setVisible(true); + break; + + case VIRTUALKEYBOARD_EVENT_HIDDEN: + #if defined(QBBVIRTUALKEYBOARD_DEBUG) + qDebug() << Q_FUNC_INFO << "EVENT HIDDEN: current visibility=" << isVisible(); + #endif + + setVisible(false); + break; + + case VIRTUALKEYBOARD_EVENT_INFO: { + const int newHeight = virtualkeyboard_event_get_height(event); + + #if defined(QBBVIRTUALKEYBOARD_DEBUG) + qDebug() << Q_FUNC_INFO << "EVENT INFO: current height=" << getHeight() << "new height=" << newHeight; + #endif + + setHeight(newHeight); + break; + } + + default: + #if defined(QBBVIRTUALKEYBOARD_DEBUG) + qDebug() << "QBB: Unhandled virtual keyboard event. code=" << bps_event_get_code(event); + #endif + + return false; + } + + return true; +} + +QT_END_NAMESPACE diff --git a/src/plugins/platforms/blackberry/qbbvirtualkeyboardbps.h b/src/plugins/platforms/blackberry/qbbvirtualkeyboardbps.h new file mode 100644 index 0000000..89b5cca --- /dev/null +++ b/src/plugins/platforms/blackberry/qbbvirtualkeyboardbps.h @@ -0,0 +1,70 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Research In Motion +** +** Contact: Research In Motion +** Contact: Klarälvdalens Datakonsult AB +** +** 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 QBBVIRTUALKEYBOARDBPS_H +#define QBBVIRTUALKEYBOARDBPS_H + +#include "qbbabstractvirtualkeyboard.h" + +struct bps_event_t; + +QT_BEGIN_NAMESPACE + +class QBBVirtualKeyboardBps : public QBBAbstractVirtualKeyboard +{ + Q_OBJECT +public: + explicit QBBVirtualKeyboardBps(QObject *parent = 0); + + bool handleEvent(bps_event_t *event); + + bool showKeyboard(); + bool hideKeyboard(); + +protected: + void applyKeyboardMode(KeyboardMode mode); + +private: + bool handleLocaleEvent(bps_event_t *event); + bool handleVirtualKeyboardEvent(bps_event_t *event); +}; + +QT_END_NAMESPACE + +#endif // QBBVIRTUALKEYBOARDBPS_H diff --git a/src/plugins/platforms/blackberry/qbbvirtualkeyboardpps.cpp b/src/plugins/platforms/blackberry/qbbvirtualkeyboardpps.cpp new file mode 100644 index 0000000..6504c7e --- /dev/null +++ b/src/plugins/platforms/blackberry/qbbvirtualkeyboardpps.cpp @@ -0,0 +1,428 @@ +/**************************************************************************** +** +** Copyright (C) 2011 - 2012 Research In Motion +** +** Contact: Research In Motion +** Contact: Klarälvdalens Datakonsult AB +** +** 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 QBBVIRTUALKEYBOARD_DEBUG + +#include "qbbvirtualkeyboardpps.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +QT_BEGIN_NAMESPACE + +const char *QBBVirtualKeyboardPps::sPPSPath = "/pps/services/input/control"; +const size_t QBBVirtualKeyboardPps::sBufferSize = 2048; + +// Huge hack for keyboard shadow (see QNX PR 88400). Should be removed ASAP. +#define KEYBOARD_SHADOW_HEIGHT 8 + +QBBVirtualKeyboardPps::QBBVirtualKeyboardPps() + : mEncoder(0), + mDecoder(0), + mBuffer(0), + mFd(-1), + mReadNotifier(0) +{ +} + +QBBVirtualKeyboardPps::~QBBVirtualKeyboardPps() +{ + close(); +} + +void QBBVirtualKeyboardPps::start() +{ +#ifdef QBBVIRTUALKEYBOARD_DEBUG + qDebug() << "QBB: starting keyboard event processing"; +#endif + + if (!connect()) + return; +} + +void QBBVirtualKeyboardPps::applyKeyboardMode(KeyboardMode mode) +{ + applyKeyboardModeOptions(mode); +} + +void QBBVirtualKeyboardPps::close() +{ + delete mReadNotifier; + mReadNotifier = 0; + + if (mFd != -1) { + // any reads will fail after we close the fd, which is basically what we want. + ::close(mFd); + mFd = -1; + } + + if (mDecoder) { + pps_decoder_cleanup(mDecoder); + delete mDecoder; + mDecoder = 0; + } + + if (mEncoder) { + pps_encoder_cleanup(mEncoder); + delete mEncoder; + mEncoder = 0; + } + + delete [] mBuffer; + mBuffer = 0; +} + +bool QBBVirtualKeyboardPps::connect() +{ + close(); + + mEncoder = new pps_encoder_t; + mDecoder = new pps_decoder_t; + + pps_encoder_initialize(mEncoder, false); + pps_decoder_initialize(mDecoder, NULL); + + errno = 0; + mFd = ::open(sPPSPath, O_RDWR); + if (mFd == -1) { + qCritical("QBBVirtualKeyboard: Unable to open \"%s\" for keyboard: %s (%d).", + sPPSPath, strerror(errno), errno); + close(); + return false; + } + + mBuffer = new char[sBufferSize]; + if (!mBuffer) { + qCritical("QBBVirtualKeyboard: Unable to allocate buffer of %d bytes. Size is unavailable.", sBufferSize); + return false; + } + + if (!queryPPSInfo()) + return false; + + mReadNotifier = new QSocketNotifier(mFd, QSocketNotifier::Read); + QObject::connect(mReadNotifier, SIGNAL(activated(int)), this, SLOT(ppsDataReady())); + + return true; +} + +bool QBBVirtualKeyboardPps::queryPPSInfo() +{ + // Request info, requires id to regenerate res message. + pps_encoder_add_string(mEncoder, "msg", "info"); + pps_encoder_add_string(mEncoder, "id", "libWebView"); + + if (::write(mFd, pps_encoder_buffer(mEncoder), pps_encoder_length(mEncoder)) == -1) { + close(); + return false; + } + + pps_encoder_reset(mEncoder); + + return true; +} + +void QBBVirtualKeyboardPps::ppsDataReady() +{ + ssize_t nread = qt_safe_read(mFd, mBuffer, sBufferSize - 1); + +#ifdef QBBVIRTUALKEYBOARD_DEBUG + qDebug() << "QBB: keyboardMessage size: " << nread; +#endif + if (nread < 0) { + connect(); // reconnect + return; + } + + // We sometimes get spurious read notifications when no data is available. + // Bail out early in this case + if (nread == 0) + return; + + // nread is the real space necessary, not the amount read. + if (static_cast(nread) > sBufferSize - 1) { + qCritical("QBBVirtualKeyboard: Keyboard buffer size too short; need %u.", nread + 1); + connect(); // reconnect + return; + } + + mBuffer[nread] = 0; + pps_decoder_parse_pps_str(mDecoder, mBuffer); + pps_decoder_push(mDecoder, NULL); +#ifdef QBBVIRTUALKEYBOARD_DEBUG + pps_decoder_dump_tree(mDecoder, stderr); +#endif + + const char* value; + if (pps_decoder_get_string(mDecoder, "error", &value) == PPS_DECODER_OK) { + qCritical("QBBVirtualKeyboard: Keyboard PPS decoder error: %s", value ? value : "[null]"); + return; + } + + if (pps_decoder_get_string(mDecoder, "msg", &value) == PPS_DECODER_OK) { + if (strcmp(value, "show") == 0) + setVisible(true); + else if (strcmp(value, "hide") == 0) + setVisible(false); + else if (strcmp(value, "info") == 0) + handleKeyboardInfoMessage(); + else if (strcmp(value, "connect") == 0) { } + else + qCritical("QBBVirtualKeyboard: Unexpected keyboard PPS msg value: %s", value ? value : "[null]"); + } else if (pps_decoder_get_string(mDecoder, "res", &value) == PPS_DECODER_OK) { + if (strcmp(value, "info") == 0) + handleKeyboardInfoMessage(); + else + qCritical("QBBVirtualKeyboard: Unexpected keyboard PPS res value: %s", value ? value : "[null]"); + } else { + qCritical("QBBVirtualKeyboard: Unexpected keyboard PPS message type"); + } +} + +void QBBVirtualKeyboardPps::handleKeyboardInfoMessage() +{ + int newHeight = 0; + const char* value; + + if (pps_decoder_push(mDecoder, "dat") != PPS_DECODER_OK) { + qCritical("QBBVirtualKeyboard: Keyboard PPS dat object not found"); + return; + } + if (pps_decoder_get_int(mDecoder, "size", &newHeight) != PPS_DECODER_OK) { + qCritical("QBBVirtualKeyboard: Keyboard PPS size field not found"); + return; + } + if (pps_decoder_push(mDecoder, "locale") != PPS_DECODER_OK) { + qCritical("QBBVirtualKeyboard: Keyboard PPS locale object not found"); + return; + } + if (pps_decoder_get_string(mDecoder, "languageId", &value) != PPS_DECODER_OK) { + qCritical("QBBVirtualKeyboard: Keyboard PPS languageId field not found"); + return; + } + setLanguage(QString::fromLatin1(value)); + + if (pps_decoder_get_string(mDecoder, "countryId", &value) != PPS_DECODER_OK) { + qCritical("QBBVirtualKeyboard: Keyboard PPS size countryId not found"); + return; + } + setCountry(QString::fromLatin1(value)); + + // HUGE hack, should be removed ASAP. + newHeight -= KEYBOARD_SHADOW_HEIGHT; // We want to ignore the 8 pixel shadow above the keyboard. (PR 88400) + setHeight(newHeight); + +#ifdef QBBVIRTUALKEYBOARD_DEBUG + qDebug() << "QBB: handleKeyboardInfoMessage size=" << getHeight() << "languageId=" << languageId() << " countryId=" << countryId(); +#endif +} + +bool QBBVirtualKeyboardPps::showKeyboard() +{ +#ifdef QBBVIRTUALKEYBOARD_DEBUG + qDebug() << "QBB: showKeyboard()"; +#endif + + // Try to connect. + if (mFd == -1 && !connect()) + return false; + + // NOTE: This must be done everytime the keyboard is shown even if there is no change because + // hiding the keyboard wipes the setting. + applyKeyboardModeOptions(keyboardMode()); + + pps_encoder_reset(mEncoder); + + // Send the show message. + pps_encoder_add_string(mEncoder, "msg", "show"); + + if (::write(mFd, pps_encoder_buffer(mEncoder), pps_encoder_length(mEncoder)) == -1) { + close(); + return false; + } + + pps_encoder_reset(mEncoder); + + // Return true if no error occurs. Sizing response will be triggered when confirmation of + // the change arrives. + return true; +} + +bool QBBVirtualKeyboardPps::hideKeyboard() +{ +#ifdef QBBVIRTUALKEYBOARD_DEBUG + qDebug() << "QBB: hideKeyboard()"; +#endif + + if (mFd == -1 && !connect()) + return false; + + pps_encoder_add_string(mEncoder, "msg", "hide"); + + if (::write(mFd, pps_encoder_buffer(mEncoder), pps_encoder_length(mEncoder)) == -1) { + close(); + + //Try again. + if (connect()) { + if (::write(mFd, pps_encoder_buffer(mEncoder), pps_encoder_length(mEncoder)) == -1) { + close(); + return false; + } + } else { + return false; + } + } + + pps_encoder_reset(mEncoder); + + // Return true if no error occurs. Sizing response will be triggered when confirmation of + // the change arrives. + return true; +} + +void QBBVirtualKeyboardPps::applyKeyboardModeOptions(KeyboardMode mode) +{ + // Try to connect. + if (mFd == -1 && !connect()) + return; + + // Send the options message. + pps_encoder_add_string(mEncoder, "msg", "options"); + + pps_encoder_start_object(mEncoder, "dat"); + switch (mode) { + case Url: + addUrlModeOptions(); + break; + case Email: + addEmailModeOptions(); + break; + case Web: + addWebModeOptions(); + break; + case NumPunc: + addNumPuncModeOptions(); + break; + case Symbol: + addSymbolModeOptions(); + break; + case Phone: + addPhoneModeOptions(); + break; + case Pin: + addPinModeOptions(); + break; + case Default: // fall through + default: + addDefaultModeOptions(); + break; + } + + pps_encoder_end_object(mEncoder); + + if (::write(mFd, pps_encoder_buffer(mEncoder), pps_encoder_length(mEncoder)) == -1) + close(); + + pps_encoder_reset(mEncoder); +} + +void QBBVirtualKeyboardPps::addDefaultModeOptions() +{ + pps_encoder_add_string(mEncoder, "enter", "enter.default"); + pps_encoder_add_string(mEncoder, "type", "default"); +} + +void QBBVirtualKeyboardPps::addUrlModeOptions() +{ + pps_encoder_add_string(mEncoder, "enter", "enter.default"); + pps_encoder_add_string(mEncoder, "type", "url"); +} + +void QBBVirtualKeyboardPps::addEmailModeOptions() +{ + pps_encoder_add_string(mEncoder, "enter", "enter.default"); + pps_encoder_add_string(mEncoder, "type", "email"); +} + +void QBBVirtualKeyboardPps::addWebModeOptions() +{ + pps_encoder_add_string(mEncoder, "enter", "enter.default"); + pps_encoder_add_string(mEncoder, "type", "web"); +} + +void QBBVirtualKeyboardPps::addNumPuncModeOptions() +{ + pps_encoder_add_string(mEncoder, "enter", "enter.default"); + pps_encoder_add_string(mEncoder, "type", "numPunc"); +} + +void QBBVirtualKeyboardPps::addPhoneModeOptions() +{ + pps_encoder_add_string(mEncoder, "enter", "enter.default"); + pps_encoder_add_string(mEncoder, "type", "phone"); +} + +void QBBVirtualKeyboardPps::addPinModeOptions() +{ + pps_encoder_add_string(mEncoder, "enter", "enter.default"); + pps_encoder_add_string(mEncoder, "type", "pin"); +} + +void QBBVirtualKeyboardPps::addSymbolModeOptions() +{ + pps_encoder_add_string(mEncoder, "enter", "enter.default"); + pps_encoder_add_string(mEncoder, "type", "symbol"); +} + +QT_END_NAMESPACE diff --git a/src/plugins/platforms/blackberry/qbbvirtualkeyboardpps.h b/src/plugins/platforms/blackberry/qbbvirtualkeyboardpps.h new file mode 100644 index 0000000..0dd3c42 --- /dev/null +++ b/src/plugins/platforms/blackberry/qbbvirtualkeyboardpps.h @@ -0,0 +1,99 @@ +/**************************************************************************** +** +** Copyright (C) 2011 - 2012 Research In Motion +** +** Contact: Research In Motion +** Contact: Klarälvdalens Datakonsult AB +** +** 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 QBBVIRTUALKEYBOARDPPS_H_ +#define QBBVIRTUALKEYBOARDPPS_H_ + +#include "qbbabstractvirtualkeyboard.h" + +#include + +QT_BEGIN_NAMESPACE + +class QSocketNotifier; + +/* Shamelessly copied from the browser - this should be rewritten once we have a proper PPS wrapper class */ +class QBBVirtualKeyboardPps : public QBBAbstractVirtualKeyboard +{ + Q_OBJECT +public: + QBBVirtualKeyboardPps(); + ~QBBVirtualKeyboardPps(); + + bool showKeyboard(); + bool hideKeyboard(); + +public Q_SLOTS: + void start(); + +protected: + void applyKeyboardMode(KeyboardMode mode); + +private Q_SLOTS: + void ppsDataReady(); + +private: + pps_encoder_t *mEncoder; + pps_decoder_t *mDecoder; + char *mBuffer; + int mFd; + QSocketNotifier *mReadNotifier; + + // Path to keyboardManager in PPS. + static const char *sPPSPath; + static const size_t sBufferSize; + + // Will be called internally if needed. + bool connect(); + void close(); + bool queryPPSInfo(); + void handleKeyboardInfoMessage(); + + void applyKeyboardModeOptions(KeyboardMode mode); + void addDefaultModeOptions(); + void addUrlModeOptions(); + void addEmailModeOptions(); + void addWebModeOptions(); + void addNumPuncModeOptions(); + void addSymbolModeOptions(); + void addPhoneModeOptions(); + void addPinModeOptions(); +}; + +#endif /* QBBVIRTUALKEYBOARDPPS_H_ */ -- cgit v0.12