diff options
author | Kevin Krammer <kevin.krammer.qnx@kdab.com> | 2012-03-27 18:39:49 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-05-02 17:52:50 +0200 |
commit | a818a1eb2f3d2c5ac61da7e1a8cf1b341e63aed1 (patch) | |
tree | 39d84b80a37273b5f4857569a7d3a9fccded42af /src/plugins/platforms/qnx/qqnxvirtualkeyboard.cpp | |
parent | 77a8bd1e01251211701fa094278b8ddc23b7e6ba (diff) |
Add implementation of virtual keyboard based on BPS events
Change-Id: Ida4fa344c54db32b7b22b08a124b8c7b6df8adef
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Reviewed-by: Nicolas Arnaud-Cormos <nicolas@kdab.com>
Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
Diffstat (limited to 'src/plugins/platforms/qnx/qqnxvirtualkeyboard.cpp')
-rw-r--r-- | src/plugins/platforms/qnx/qqnxvirtualkeyboard.cpp | 430 |
1 files changed, 0 insertions, 430 deletions
diff --git a/src/plugins/platforms/qnx/qqnxvirtualkeyboard.cpp b/src/plugins/platforms/qnx/qqnxvirtualkeyboard.cpp deleted file mode 100644 index 685e5f0f0b..0000000000 --- a/src/plugins/platforms/qnx/qqnxvirtualkeyboard.cpp +++ /dev/null @@ -1,430 +0,0 @@ -/*************************************************************************** -** -** 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 "qqnxvirtualkeyboard.h" -#include "qqnxscreen.h" - -#include <QtCore/QDebug> -#include <QtCore/QSocketNotifier> -#include <QtCore/private/qcore_unix_p.h> - -#include <errno.h> -#include <fcntl.h> -#include <stdlib.h> -#include <string.h> -#include <sys/iomsg.h> -#include <sys/pps.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <unistd.h> - -QT_BEGIN_NAMESPACE - -const char *QQnxVirtualKeyboard::ms_PPSPath = "/pps/services/input/control"; -const size_t QQnxVirtualKeyboard::ms_bufferSize = 2048; - -// Huge hack for keyboard shadow (see QNX PR 88400). Should be removed ASAP. -#define KEYBOARD_SHADOW_HEIGHT 8 - -QQnxVirtualKeyboard::QQnxVirtualKeyboard() - : m_encoder(0), - m_decoder(0), - m_buffer(0), - m_fd(-1), - m_readNotifier(0) -{ -} - -QQnxVirtualKeyboard::~QQnxVirtualKeyboard() -{ - close(); -} - -void QQnxVirtualKeyboard::start() -{ -#ifdef QQNXVIRTUALKEYBOARD_DEBUG - qDebug() << "QQNX: starting keyboard event processing"; -#endif - if (!connect()) - return; -} - -void QQnxVirtualKeyboard::applyKeyboardMode(KeyboardMode mode) -{ - applyKeyboardModeOptions(mode); -} - -void QQnxVirtualKeyboard::close() -{ - delete m_readNotifier; - m_readNotifier = 0; - - if (m_fd != -1) { - ::close(m_fd); - m_fd = -1; - } - - if (m_decoder) { - pps_decoder_cleanup(m_decoder); - delete m_decoder; - m_decoder = 0; - } - - if (m_encoder) { - pps_encoder_cleanup(m_encoder); - delete m_encoder; - m_encoder = 0; - } - - delete [] m_buffer; - m_buffer = 0; -} - -bool QQnxVirtualKeyboard::connect() -{ - close(); - - m_encoder = new pps_encoder_t; - m_decoder = new pps_decoder_t; - - pps_encoder_initialize(m_encoder, false); - pps_decoder_initialize(m_decoder, NULL); - - errno = 0; - m_fd = ::open(ms_PPSPath, O_RDWR); - if (m_fd == -1) - { - qCritical("QQnxVirtualKeyboard: Unable to open \"%s\" for keyboard: %s (%d).", - ms_PPSPath, strerror(errno), errno); - close(); - return false; - } - - m_buffer = new char[ms_bufferSize]; - if (!m_buffer) { - qCritical("QQnxVirtualKeyboard: Unable to allocate buffer of %d bytes. Size is unavailable.", ms_bufferSize); - return false; - } - - if (!queryPPSInfo()) - return false; - - m_readNotifier = new QSocketNotifier(m_fd, QSocketNotifier::Read); - QObject::connect(m_readNotifier, SIGNAL(activated(int)), this, SLOT(ppsDataReady())); - - return true; -} - -bool QQnxVirtualKeyboard::queryPPSInfo() -{ - // Request info, requires id to regenerate res message. - pps_encoder_add_string(m_encoder, "msg", "info"); - pps_encoder_add_string(m_encoder, "id", "libWebView"); - - if (::write(m_fd, pps_encoder_buffer(m_encoder), pps_encoder_length(m_encoder)) == -1) { - close(); - return false; - } - - pps_encoder_reset(m_encoder); - - return true; -} - -void QQnxVirtualKeyboard::ppsDataReady() -{ - ssize_t nread = qt_safe_read(m_fd, m_buffer, ms_bufferSize - 1); - -#ifdef QQNXVIRTUALKEYBOARD_DEBUG - qDebug() << "QQNX: 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<size_t>(nread) > ms_bufferSize - 1) { - qCritical("QQnxVirtualKeyboard: Keyboard buffer size too short; need %u.", nread + 1); - connect(); // reconnect - return; - } - - m_buffer[nread] = 0; - pps_decoder_parse_pps_str(m_decoder, m_buffer); - pps_decoder_push(m_decoder, NULL); -#ifdef QQNXVIRTUALKEYBOARD_DEBUG - pps_decoder_dump_tree(m_decoder, stderr); -#endif - - const char *value; - if (pps_decoder_get_string(m_decoder, "error", &value) == PPS_DECODER_OK) { - qCritical("QQnxVirtualKeyboard: Keyboard PPS decoder error: %s", value ? value : "[null]"); - return; - } - - if (pps_decoder_get_string(m_decoder, "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("QQnxVirtualKeyboard: Unexpected keyboard PPS msg value: %s", value ? value : "[null]"); - } else if (pps_decoder_get_string(m_decoder, "res", &value) == PPS_DECODER_OK) { - if (strcmp(value, "info") == 0) - handleKeyboardInfoMessage(); - else - qCritical("QQnxVirtualKeyboard: Unexpected keyboard PPS res value: %s", value ? value : "[null]"); - } else - qCritical("QQnxVirtualKeyboard: Unexpected keyboard PPS message type"); -} - -void QQnxVirtualKeyboard::handleKeyboardInfoMessage() -{ - int newHeight = 0; - const char *value; - - if (pps_decoder_push(m_decoder, "dat") != PPS_DECODER_OK) { - qCritical("QQnxVirtualKeyboard: Keyboard PPS dat object not found"); - return; - } - if (pps_decoder_get_int(m_decoder, "size", &newHeight) != PPS_DECODER_OK) { - qCritical("QQnxVirtualKeyboard: Keyboard PPS size field not found"); - return; - } - if (pps_decoder_push(m_decoder, "locale") != PPS_DECODER_OK) { - qCritical("QQnxVirtualKeyboard: Keyboard PPS locale object not found"); - return; - } - if (pps_decoder_get_string(m_decoder, "languageId", &value) != PPS_DECODER_OK) { - qCritical("QQnxVirtualKeyboard: Keyboard PPS languageId field not found"); - return; - } - const QString languageId = QString::fromLatin1(value); - if (pps_decoder_get_string(m_decoder, "countryId", &value) != PPS_DECODER_OK) { - qCritical("QQnxVirtualKeyboard: Keyboard PPS size countryId not found"); - return; - } - const QString countryId = 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); - - const QLocale locale = QLocale(languageId + QLatin1Char('_') + countryId); - setLocale(locale); - -#ifdef QQNXVIRTUALKEYBOARD_DEBUG - qDebug() << "QQNX: handleKeyboardInfoMessage size=" << newHeight << "locale=" << locale; -#endif -} - -bool QQnxVirtualKeyboard::showKeyboard() -{ -#ifdef QQNXVIRTUALKEYBOARD_DEBUG - qDebug() << "QQNX: showKeyboard()"; -#endif - - // Try to connect. - if (m_fd == -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()); - - if (isVisible()) - return true; - - pps_encoder_reset(m_encoder); - - // Send the show message. - pps_encoder_add_string(m_encoder, "msg", "show"); - - if (::write(m_fd, pps_encoder_buffer(m_encoder), pps_encoder_length(m_encoder)) == -1) { - close(); - return false; - } - - pps_encoder_reset(m_encoder); - - // Return true if no error occurs. Sizing response will be triggered when confirmation of - // the change arrives. - return true; -} - -bool QQnxVirtualKeyboard::hideKeyboard() -{ -#ifdef QQNXVIRTUALKEYBOARD_DEBUG - qDebug() << "QQNX: hideKeyboard()"; -#endif - - if (m_fd == -1 && !connect()) - return false; - - pps_encoder_add_string(m_encoder, "msg", "hide"); - - if (::write(m_fd, pps_encoder_buffer(m_encoder), pps_encoder_length(m_encoder)) == -1) { - close(); - - //Try again. - if (connect()) { - if (::write(m_fd, pps_encoder_buffer(m_encoder), pps_encoder_length(m_encoder)) == -1) { - close(); - return false; - } - } - else - return false; - } - - pps_encoder_reset(m_encoder); - - // Return true if no error occurs. Sizing response will be triggered when confirmation of - // the change arrives. - return true; -} - -void QQnxVirtualKeyboard::applyKeyboardModeOptions(KeyboardMode mode) -{ - // Try to connect. - if (m_fd == -1 && !connect()) - return; - - // Send the options message. - pps_encoder_add_string(m_encoder, "msg", "options"); - - pps_encoder_start_object(m_encoder, "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: - default: - addDefaultModeOptions(); - break; - } - - pps_encoder_end_object(m_encoder); - - if (::write(m_fd, pps_encoder_buffer(m_encoder), pps_encoder_length(m_encoder)) == -1) { - close(); - } - - pps_encoder_reset(m_encoder); -} - -void QQnxVirtualKeyboard::addDefaultModeOptions() -{ - pps_encoder_add_string(m_encoder, "enter", "enter.default"); - pps_encoder_add_string(m_encoder, "type", "default"); -} - -void QQnxVirtualKeyboard::addUrlModeOptions() -{ - pps_encoder_add_string(m_encoder, "enter", "enter.default"); - pps_encoder_add_string(m_encoder, "type", "url"); -} - -void QQnxVirtualKeyboard::addEmailModeOptions() -{ - pps_encoder_add_string(m_encoder, "enter", "enter.default"); - pps_encoder_add_string(m_encoder, "type", "email"); -} - -void QQnxVirtualKeyboard::addWebModeOptions() -{ - pps_encoder_add_string(m_encoder, "enter", "enter.default"); - pps_encoder_add_string(m_encoder, "type", "web"); -} - -void QQnxVirtualKeyboard::addNumPuncModeOptions() -{ - pps_encoder_add_string(m_encoder, "enter", "enter.default"); - pps_encoder_add_string(m_encoder, "type", "numPunc"); -} - -void QQnxVirtualKeyboard::addPhoneModeOptions() -{ - pps_encoder_add_string(m_encoder, "enter", "enter.default"); - pps_encoder_add_string(m_encoder, "type", "phone"); -} - -void QQnxVirtualKeyboard::addPinModeOptions() -{ - pps_encoder_add_string(m_encoder, "enter", "enter.default"); - pps_encoder_add_string(m_encoder, "type", "pin"); -} - -void QQnxVirtualKeyboard::addSymbolModeOptions() -{ - pps_encoder_add_string(m_encoder, "enter", "enter.default"); - pps_encoder_add_string(m_encoder, "type", "symbol"); -} - -QT_END_NAMESPACE |