From 831943d7f12addef79fb536e5550da0f72480217 Mon Sep 17 00:00:00 2001 From: Kevin Krammer Date: Tue, 27 Mar 2012 17:43:43 +0200 Subject: Separate virtual keyboard interface and implementation Allows us to create a BPS based implementation and drop it in without further changes to users of the interface. Change-Id: I16313717e1200d717c330cbb18c3314567af51c2 Reviewed-by: Sean Harmer Reviewed-by: Thomas McGuire Reviewed-by: Robin Burchell --- src/plugins/platforms/qnx/qnx.pro | 6 +- .../platforms/qnx/qqnxabstractvirtualkeyboard.cpp | 103 +++++++++++++++++++++ .../platforms/qnx/qqnxabstractvirtualkeyboard.h | 100 ++++++++++++++++++++ src/plugins/platforms/qnx/qqnxinputcontext_imf.cpp | 8 +- src/plugins/platforms/qnx/qqnxinputcontext_imf.h | 6 +- .../platforms/qnx/qqnxinputcontext_noimf.cpp | 8 +- src/plugins/platforms/qnx/qqnxinputcontext_noimf.h | 6 +- src/plugins/platforms/qnx/qqnxintegration.h | 4 +- src/plugins/platforms/qnx/qqnxvirtualkeyboard.cpp | 71 +++----------- src/plugins/platforms/qnx/qqnxvirtualkeyboard.h | 40 +------- 10 files changed, 241 insertions(+), 111 deletions(-) create mode 100644 src/plugins/platforms/qnx/qqnxabstractvirtualkeyboard.cpp create mode 100644 src/plugins/platforms/qnx/qqnxabstractvirtualkeyboard.h diff --git a/src/plugins/platforms/qnx/qnx.pro b/src/plugins/platforms/qnx/qnx.pro index 185934c1d1..c29ad4d3a2 100644 --- a/src/plugins/platforms/qnx/qnx.pro +++ b/src/plugins/platforms/qnx/qnx.pro @@ -37,7 +37,8 @@ SOURCES = main.cpp \ qqnxvirtualkeyboard.cpp \ qqnxclipboard.cpp \ qqnxrootwindow.cpp \ - qqnxscreeneventhandler.cpp + qqnxscreeneventhandler.cpp \ + qqnxabstractvirtualkeyboard.cpp HEADERS = qqnxbuffer.h \ @@ -53,7 +54,8 @@ HEADERS = qqnxbuffer.h \ qqnxvirtualkeyboard.h \ qqnxclipboard.h \ qqnxrootwindow.h \ - qqnxscreeneventhandler.h + qqnxscreeneventhandler.h \ + qqnxabstractvirtualkeyboard.h CONFIG(blackberry) { SOURCES += qqnxservices.cpp diff --git a/src/plugins/platforms/qnx/qqnxabstractvirtualkeyboard.cpp b/src/plugins/platforms/qnx/qqnxabstractvirtualkeyboard.cpp new file mode 100644 index 0000000000..0ac1af6d2f --- /dev/null +++ b/src/plugins/platforms/qnx/qqnxabstractvirtualkeyboard.cpp @@ -0,0 +1,103 @@ +/*************************************************************************** +** +** 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 "qqnxabstractvirtualkeyboard.h" + +QT_BEGIN_NAMESPACE + +QQnxAbstractVirtualKeyboard::QQnxAbstractVirtualKeyboard(QObject *parent) + : QObject(parent) + , m_height(0) + , m_visible(false) + , m_locale(QLocale::system()) + , m_keyboardMode(Default) +{ +} + +void QQnxAbstractVirtualKeyboard::setKeyboardMode(KeyboardMode mode) +{ + if (mode == m_keyboardMode) + return; + + m_keyboardMode = mode; + + applyKeyboardMode(mode); +} + +void QQnxAbstractVirtualKeyboard::setHeight(int height) +{ + if (height == m_height) + return; + + const int effectiveHeight = this->height(); + + m_height = height; + + if (effectiveHeight != this->height()) + emit heightChanged(this->height()); +} + +void QQnxAbstractVirtualKeyboard::setVisible(bool visible) +{ + if (visible == m_visible) + return; + + const int effectiveHeight = height(); + + m_visible = visible; + + emit visibilityChanged(visible); + + if (effectiveHeight != height()) + emit heightChanged(height()); +} + +void QQnxAbstractVirtualKeyboard::setLocale(const QLocale &locale) +{ + if (locale == m_locale) + return; + + m_locale = locale; + + emit localeChanged(locale); +} + +QT_END_NAMESPACE diff --git a/src/plugins/platforms/qnx/qqnxabstractvirtualkeyboard.h b/src/plugins/platforms/qnx/qqnxabstractvirtualkeyboard.h new file mode 100644 index 0000000000..e548fa5ca2 --- /dev/null +++ b/src/plugins/platforms/qnx/qqnxabstractvirtualkeyboard.h @@ -0,0 +1,100 @@ +/*************************************************************************** +** +** 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$ +** +****************************************************************************/ + +#ifndef QQNXABSTRACTVIRTUALKEYBOARD_H +#define QQNXABSTRACTVIRTUALKEYBOARD_H + +#include +#include + +QT_BEGIN_NAMESPACE + +class QQnxAbstractVirtualKeyboard : public QObject +{ + Q_OBJECT +public: + // NOTE: Not all the following keyboard modes are currently used. + // Default - Regular Keyboard + // Url/Email - Enhanced keys for each types. + // Web - Regular keyboard with two blank keys, currently unused. + // NumPunc - Numbers & Punctionation, alternate to Symbol + // Symbol - All symbols, alternate to NumPunc, currently unused. + // Phone - Phone enhanced keyboard - currently unused as no alternate keyboard available to access a-zA-Z + // Pin - Keyboard for entering Pins (Hex values) currently unused. + // + // SPECIAL NOTE: Usage of NumPunc may have to be removed, ABC button is non-functional. + // + enum KeyboardMode { Default, Url, Email, Web, NumPunc, Symbol, Phone, Pin }; + + explicit QQnxAbstractVirtualKeyboard(QObject *parent = 0); + + virtual bool showKeyboard() = 0; + virtual bool hideKeyboard() = 0; + + int height() { return m_visible ? m_height : 0; } + bool isVisible() const { return m_visible; } + QLocale locale() const { return m_locale; } + + void setKeyboardMode(KeyboardMode mode); + KeyboardMode keyboardMode() const { return m_keyboardMode; } + +Q_SIGNALS: + void heightChanged(int height); + void visibilityChanged(bool visible); + void localeChanged(const QLocale &locale); + +protected: + virtual void applyKeyboardMode(KeyboardMode mode) = 0; + + void setHeight(int height); + void setVisible(bool visible); + void setLocale(const QLocale &locale); + +private: + int m_height; + bool m_visible; + QLocale m_locale; + KeyboardMode m_keyboardMode; +}; + +QT_END_NAMESPACE + +#endif // QQNXABSTRACTVIRTUALKEYBOARD_H diff --git a/src/plugins/platforms/qnx/qqnxinputcontext_imf.cpp b/src/plugins/platforms/qnx/qqnxinputcontext_imf.cpp index 3cf2d4ed62..efe4229b3b 100644 --- a/src/plugins/platforms/qnx/qqnxinputcontext_imf.cpp +++ b/src/plugins/platforms/qnx/qqnxinputcontext_imf.cpp @@ -41,7 +41,7 @@ #include "qqnxinputcontext_imf.h" #include "qqnxeventthread.h" -#include "qqnxvirtualkeyboard.h" +#include "qqnxabstractvirtualkeyboard.h" #include #include @@ -676,7 +676,7 @@ static bool imfAvailable() QT_BEGIN_NAMESPACE -QQnxInputContext::QQnxInputContext(QQnxVirtualKeyboard &keyboard): +QQnxInputContext::QQnxInputContext(QQnxAbstractVirtualKeyboard &keyboard): QPlatformInputContext(), m_lastCaretPos(0), m_isComposing(false), @@ -1688,9 +1688,9 @@ void QQnxInputContext::inputItemChanged() hideInputPanel(); } else { if (qobject_cast(inputItem)) - m_virtualKeyboard.setKeyboardMode(QQnxVirtualKeyboard::Phone); + m_virtualKeyboard.setKeyboardMode(QQnxAbstractVirtualKeyboard::Phone); else - m_virtualKeyboard.setKeyboardMode(QQnxVirtualKeyboard::Default); + m_virtualKeyboard.setKeyboardMode(QQnxAbstractVirtualKeyboard::Default); if (!m_inputPanelVisible) showInputPanel(); diff --git a/src/plugins/platforms/qnx/qqnxinputcontext_imf.h b/src/plugins/platforms/qnx/qqnxinputcontext_imf.h index 16972fbf00..faf3be4daa 100644 --- a/src/plugins/platforms/qnx/qqnxinputcontext_imf.h +++ b/src/plugins/platforms/qnx/qqnxinputcontext_imf.h @@ -53,13 +53,13 @@ QT_BEGIN_NAMESPACE -class QQnxVirtualKeyboard; +class QQnxAbstractVirtualKeyboard; class QQnxInputContext : public QPlatformInputContext { Q_OBJECT public: - QQnxInputContext(QQnxVirtualKeyboard &keyboard); + explicit QQnxInputContext(QQnxAbstractVirtualKeyboard &keyboard); ~QQnxInputContext(); bool isValid() const; @@ -125,7 +125,7 @@ private: QString m_composingText; bool m_inputPanelVisible; QLocale m_inputPanelLocale; - QQnxVirtualKeyboard &m_virtualKeyboad; + QQnxAbstractVirtualKeyboard &m_virtualKeyboad; }; Q_DECLARE_METATYPE(extracted_text_t*) diff --git a/src/plugins/platforms/qnx/qqnxinputcontext_noimf.cpp b/src/plugins/platforms/qnx/qqnxinputcontext_noimf.cpp index 6c8a0abe17..7bc0d5853a 100644 --- a/src/plugins/platforms/qnx/qqnxinputcontext_noimf.cpp +++ b/src/plugins/platforms/qnx/qqnxinputcontext_noimf.cpp @@ -40,7 +40,7 @@ ****************************************************************************/ #include "qqnxinputcontext_noimf.h" -#include "qqnxvirtualkeyboard.h" +#include "qqnxabstractvirtualkeyboard.h" #include #include @@ -48,7 +48,7 @@ QT_BEGIN_NAMESPACE -QQnxInputContext::QQnxInputContext(QQnxVirtualKeyboard &keyboard) : +QQnxInputContext::QQnxInputContext(QQnxAbstractVirtualKeyboard &keyboard) : QPlatformInputContext(), m_inputPanelVisible(false), m_inputPanelLocale(QLocale::c()), @@ -179,9 +179,9 @@ void QQnxInputContext::inputItemChanged() hideInputPanel(); } else { if (qobject_cast(inputItem)) - m_virtualKeyboard.setKeyboardMode(QQnxVirtualKeyboard::Phone); + m_virtualKeyboard.setKeyboardMode(QQnxAbstractVirtualKeyboard::Phone); else - m_virtualKeyboard.setKeyboardMode(QQnxVirtualKeyboard::Default); + m_virtualKeyboard.setKeyboardMode(QQnxAbstractVirtualKeyboard::Default); if (!m_inputPanelVisible) showInputPanel(); diff --git a/src/plugins/platforms/qnx/qqnxinputcontext_noimf.h b/src/plugins/platforms/qnx/qqnxinputcontext_noimf.h index 50927d244b..70b1359a83 100644 --- a/src/plugins/platforms/qnx/qqnxinputcontext_noimf.h +++ b/src/plugins/platforms/qnx/qqnxinputcontext_noimf.h @@ -48,13 +48,13 @@ QT_BEGIN_NAMESPACE -class QQnxVirtualKeyboard; +class QQnxAbstractVirtualKeyboard; class QQnxInputContext : public QPlatformInputContext { Q_OBJECT public: - explicit QQnxInputContext(QQnxVirtualKeyboard &keyboard); + explicit QQnxInputContext(QQnxAbstractVirtualKeyboard &keyboard); ~QQnxInputContext(); bool isValid() const; @@ -79,7 +79,7 @@ private: bool m_inputPanelVisible; QLocale m_inputPanelLocale; - QQnxVirtualKeyboard &m_virtualKeyboard; + QQnxAbstractVirtualKeyboard &m_virtualKeyboard; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/qnx/qqnxintegration.h b/src/plugins/platforms/qnx/qqnxintegration.h index 3c291c3f49..12fb60ab19 100644 --- a/src/plugins/platforms/qnx/qqnxintegration.h +++ b/src/plugins/platforms/qnx/qqnxintegration.h @@ -53,7 +53,7 @@ QT_BEGIN_NAMESPACE class QQnxEventThread; class QQnxInputContext; class QQnxNavigatorEventHandler; -class QQnxVirtualKeyboard; +class QQnxAbstractVirtualKeyboard; class QQnxWindow; class QQnxServices; @@ -104,7 +104,7 @@ private: screen_context_t m_screenContext; QQnxEventThread *m_eventThread; QQnxNavigatorEventHandler *m_navigatorEventHandler; - QQnxVirtualKeyboard *m_virtualKeyboard; + QQnxAbstractVirtualKeyboard *m_virtualKeyboard; QQnxInputContext *m_inputContext; QPlatformFontDatabase *m_fontDatabase; bool m_paintUsingOpenGL; diff --git a/src/plugins/platforms/qnx/qqnxvirtualkeyboard.cpp b/src/plugins/platforms/qnx/qqnxvirtualkeyboard.cpp index afdd7715db..916c6dfa62 100644 --- a/src/plugins/platforms/qnx/qqnxvirtualkeyboard.cpp +++ b/src/plugins/platforms/qnx/qqnxvirtualkeyboard.cpp @@ -68,11 +68,7 @@ QQnxVirtualKeyboard::QQnxVirtualKeyboard() : m_encoder(0), m_decoder(0), m_buffer(0), - m_height(0), m_fd(-1), - m_keyboardMode(Default), - m_visible(false), - m_locale(QLatin1String("en_US")), m_readNotifier(0) { } @@ -91,6 +87,11 @@ void QQnxVirtualKeyboard::start() return; } +void QQnxVirtualKeyboard::applyKeyboardMode(KeyboardMode mode) +{ + applyKeyboardModeOptions(mode); +} + void QQnxVirtualKeyboard::close() { delete m_readNotifier; @@ -168,12 +169,6 @@ bool QQnxVirtualKeyboard::queryPPSInfo() return true; } -void QQnxVirtualKeyboard::notifyClientActiveStateChange(bool active) -{ - if (!active) - hideKeyboard(); -} - void QQnxVirtualKeyboard::ppsDataReady() { ssize_t nread = qt_safe_read(m_fd, m_buffer, ms_bufferSize - 1); @@ -208,17 +203,9 @@ void QQnxVirtualKeyboard::ppsDataReady() if (pps_decoder_get_string(m_decoder, "msg", &value) == PPS_DECODER_OK) { if (strcmp(value, "show") == 0) { - const bool oldVisible = m_visible; - m_visible = true; - handleKeyboardStateChangeMessage(true); - if (oldVisible != m_visible) - emit visibilityChanged(m_visible); + setVisible(true); } else if (strcmp(value, "hide") == 0) { - const bool oldVisible = m_visible; - m_visible = false; - handleKeyboardStateChangeMessage(false); - if (oldVisible != m_visible) - emit visibilityChanged(m_visible); + setVisible(false); } else if (strcmp(value, "info") == 0) handleKeyboardInfoMessage(); else if (strcmp(value, "connect") == 0) { } @@ -264,38 +251,16 @@ void QQnxVirtualKeyboard::handleKeyboardInfoMessage() // HUGE hack, should be removed ASAP. newHeight -= KEYBOARD_SHADOW_HEIGHT; // We want to ignore the 8 pixel shadow above the keyboard. (PR 88400) - if (newHeight != m_height) { - m_height = newHeight; - if (m_visible) - emit heightChanged(m_height); - } + setHeight(newHeight); const QLocale locale = QLocale(languageId + QLatin1Char('_') + countryId); - if (locale != m_locale) { - m_locale = locale; - emit localeChanged(locale); - } + setLocale(locale); #ifdef QQNXVIRTUALKEYBOARD_DEBUG qDebug() << "QQNX: handleKeyboardInfoMessage size=" << m_height << "locale=" << m_locale; #endif } -void QQnxVirtualKeyboard::handleKeyboardStateChangeMessage(bool visible) -{ - -#ifdef QQNXVIRTUALKEYBOARD_DEBUG - qDebug() << "QQNX: handleKeyboardStateChangeMessage " << visible; -#endif - if (visible != m_visible) - emit heightChanged(height()); - - if (visible) - showKeyboard(); - else - hideKeyboard(); -} - bool QQnxVirtualKeyboard::showKeyboard() { #ifdef QQNXVIRTUALKEYBOARD_DEBUG @@ -308,9 +273,9 @@ bool QQnxVirtualKeyboard::showKeyboard() // NOTE: This must be done everytime the keyboard is shown even if there is no change because // hiding the keyboard wipes the setting. - applyKeyboardModeOptions(); + applyKeyboardModeOptions(keyboardMode()); - if (m_visible) + if (isVisible()) return true; pps_encoder_reset(m_encoder); @@ -362,17 +327,7 @@ bool QQnxVirtualKeyboard::hideKeyboard() return true; } -void QQnxVirtualKeyboard::setKeyboardMode(KeyboardMode mode) -{ - if (m_keyboardMode == mode) - return; - - m_keyboardMode = mode; - if (m_visible) - applyKeyboardModeOptions(); -} - -void QQnxVirtualKeyboard::applyKeyboardModeOptions() +void QQnxVirtualKeyboard::applyKeyboardModeOptions(KeyboardMode mode) { // Try to connect. if (m_fd == -1 && !connect()) @@ -382,7 +337,7 @@ void QQnxVirtualKeyboard::applyKeyboardModeOptions() pps_encoder_add_string(m_encoder, "msg", "options"); pps_encoder_start_object(m_encoder, "dat"); - switch (m_keyboardMode) { + switch (mode) { case Url: addUrlModeOptions(); break; diff --git a/src/plugins/platforms/qnx/qqnxvirtualkeyboard.h b/src/plugins/platforms/qnx/qqnxvirtualkeyboard.h index 9f29a077e6..b01a4df963 100644 --- a/src/plugins/platforms/qnx/qqnxvirtualkeyboard.h +++ b/src/plugins/platforms/qnx/qqnxvirtualkeyboard.h @@ -42,13 +42,8 @@ #ifndef VIRTUALKEYBOARD_H_ #define VIRTUALKEYBOARD_H_ -#include -#include -#include +#include "qqnxabstractvirtualkeyboard.h" -#include -#include -#include #include QT_BEGIN_NAMESPACE @@ -56,41 +51,21 @@ QT_BEGIN_NAMESPACE class QSocketNotifier; /* Shamelessly copied from the browser - this should be rewritten once we have a proper PPS wrapper class */ -class QQnxVirtualKeyboard : public QObject +class QQnxVirtualKeyboard : public QQnxAbstractVirtualKeyboard { Q_OBJECT public: - // NOTE: Not all the following keyboard modes are currently used. - // Default - Regular Keyboard - // Url/Email - Enhanced keys for each types. - // Web - Regular keyboard with two blank keys, currently unused. - // NumPunc - Numbers & Punctionation, alternate to Symbol - // Symbol - All symbols, alternate to NumPunc, currently unused. - // Phone - Phone enhanced keyboard - currently unused as no alternate keyboard available to access a-zA-Z - // Pin - Keyboard for entering Pins (Hex values) currently unused. - // - // SPECIAL NOTE: Usage of NumPunc may have to be removed, ABC button is non-functional. - // - enum KeyboardMode { Default, Url, Email, Web, NumPunc, Symbol, Phone, Pin }; - QQnxVirtualKeyboard(); ~QQnxVirtualKeyboard(); bool showKeyboard(); bool hideKeyboard(); - int height() { return m_visible ? m_height : 0; } - void setKeyboardMode(KeyboardMode); - void notifyClientActiveStateChange(bool); - bool isVisible() const { return m_visible; } - QLocale locale() const { return m_locale; } public Q_SLOTS: void start(); -Q_SIGNALS: - void localeChanged(const QLocale &locale); - void visibilityChanged(bool visible); - void heightChanged(int height); +protected: + void applyKeyboardMode(KeyboardMode mode); private Q_SLOTS: void ppsDataReady(); @@ -101,9 +76,8 @@ private: void close(); bool queryPPSInfo(); void handleKeyboardInfoMessage(); - void handleKeyboardStateChangeMessage(bool visible); - void applyKeyboardModeOptions(); + void applyKeyboardModeOptions(KeyboardMode mode); void addDefaultModeOptions(); void addUrlModeOptions(); void addEmailModeOptions(); @@ -116,11 +90,7 @@ private: pps_encoder_t *m_encoder; pps_decoder_t *m_decoder; char *m_buffer; - int m_height; int m_fd; - KeyboardMode m_keyboardMode; - bool m_visible; - QLocale m_locale; QSocketNotifier *m_readNotifier; // Path to keyboardManager in PPS. -- cgit v1.2.3