return s_imfReady;
}
-QQnxInputContext::QQnxInputContext():
+QT_BEGIN_NAMESPACE
+
+QQnxInputContext::QQnxInputContext(QQnxVirtualKeyboard &keyboard):
QPlatformInputContext(),
m_lastCaretPos(0),
m_isComposing(false),
m_inputPanelVisible(false),
- m_inputPanelLocale(QLocale::c())
+ m_inputPanelLocale(QLocale::c()),
+ m_virtualKeyboad(keyboard)
{
#if defined(QQNXINPUTCONTEXT_DEBUG)
qDebug() << Q_FUNC_INFO;
// p_vkb_init_selection_service();
- QQnxVirtualKeyboard &keyboard = QQnxVirtualKeyboard::instance();
connect(&keyboard, SIGNAL(visibilityChanged(bool)), this, SLOT(keyboardVisibilityChanged(bool)));
connect(&keyboard, SIGNAL(localeChanged(QLocale)), this, SLOT(keyboardLocaleChanged(QLocale)));
keyboardVisibilityChanged(keyboard.isVisible());
bool QQnxInputContext::dispatchRequestSoftwareInputPanel()
{
- QQnxVirtualKeyboard::instance().showKeyboard();
+ m_virtualKeyboard.showKeyboard();
#if defined(QQNXINPUTCONTEXT_DEBUG)
qDebug() << "QQNX: requesting virtual keyboard";
#endif
bool QQnxInputContext::dispatchCloseSoftwareInputPanel()
{
- QQnxVirtualKeyboard::instance().hideKeyboard();
+ m_virtualKeyboard.hideKeyboard();
#if defined(QQNXINPUTCONTEXT_DEBUG)
qDebug() << "QQNX: hiding virtual keyboard";
#endif
if (m_inputPanelVisible)
hideInputPanel();
} else {
- if (qobject_cast<QAbstractSpinBox*>(inputItem)) {
- QQnxVirtualKeyboard::instance().setKeyboardMode(QQnxVirtualKeyboard::NumPunc);
- } else {
- QQnxVirtualKeyboard::instance().setKeyboardMode(QQnxVirtualKeyboard::Default);
- }
+ if (qobject_cast<QAbstractSpinBox*>(inputItem))
+ m_virtualKeyboard.setKeyboardMode(QQnxVirtualKeyboard::Phone);
+ else
+ m_virtualKeyboard.setKeyboardMode(QQnxVirtualKeyboard::Default);
+
if (!m_inputPanelVisible)
showInputPanel();
}
}
+
+QT_END_NAMESPACE
QT_BEGIN_NAMESPACE
+class QQnxVirtualKeyboard;
+
class QQnxInputContext : public QPlatformInputContext
{
Q_OBJECT
public:
- QQnxInputContext();
+ QQnxInputContext(QQnxVirtualKeyboard &keyboard);
~QQnxInputContext();
virtual bool isValid() const;
QString m_composingText;
bool m_inputPanelVisible;
QLocale m_inputPanelLocale;
+ QQnxVirtualKeyboard &m_virtualKeyboad;
};
Q_DECLARE_METATYPE(extracted_text_t*)
#include <QtGui/QGuiApplication>
#include <QtWidgets/QAbstractSpinBox>
-QQnxInputContext::QQnxInputContext() :
+QT_BEGIN_NAMESPACE
+
+QQnxInputContext::QQnxInputContext(QQnxVirtualKeyboard &keyboard) :
QPlatformInputContext(),
m_inputPanelVisible(false),
- m_inputPanelLocale(QLocale::c())
+ m_inputPanelLocale(QLocale::c()),
+ m_virtualKeyboard(keyboard)
{
- QQnxVirtualKeyboard &keyboard = QQnxVirtualKeyboard::instance();
connect(&keyboard, SIGNAL(visibilityChanged(bool)), this, SLOT(keyboardVisibilityChanged(bool)));
connect(&keyboard, SIGNAL(localeChanged(QLocale)), this, SLOT(keyboardLocaleChanged(QLocale)));
keyboardVisibilityChanged(keyboard.isVisible());
return false;
if (event->type() == QEvent::CloseSoftwareInputPanel) {
- QQnxVirtualKeyboard::instance().hideKeyboard();
+ m_virtualKeyboard.hideKeyboard();
#if defined(QQNXINPUTCONTEXT_DEBUG)
qDebug() << "QQNX: hiding virtual keyboard";
#endif
}
if (event->type() == QEvent::RequestSoftwareInputPanel) {
- QQnxVirtualKeyboard::instance().showKeyboard();
+ m_virtualKeyboard.showKeyboard();
#if defined(QQNXINPUTCONTEXT_DEBUG)
qDebug() << "QQNX: requesting virtual keyboard";
#endif
#if defined(QQNXINPUTCONTEXT_DEBUG)
qDebug() << Q_FUNC_INFO;
#endif
- QQnxVirtualKeyboard::instance().showKeyboard();
+ m_virtualKeyboard.showKeyboard();
}
void QQnxInputContext::hideInputPanel()
#if defined(QQNXINPUTCONTEXT_DEBUG)
qDebug() << Q_FUNC_INFO;
#endif
- QQnxVirtualKeyboard::instance().hideKeyboard();
+ m_virtualKeyboard.hideKeyboard();
}
bool QQnxInputContext::isInputPanelVisible() const
if (m_inputPanelVisible)
hideInputPanel();
} else {
- if (qobject_cast<QAbstractSpinBox*>(inputItem)) {
- QQnxVirtualKeyboard::instance().setKeyboardMode(QQnxVirtualKeyboard::NumPunc);
- } else {
- QQnxVirtualKeyboard::instance().setKeyboardMode(QQnxVirtualKeyboard::Default);
- }
+ if (qobject_cast<QAbstractSpinBox*>(inputItem))
+ m_virtualKeyboard.setKeyboardMode(QQnxVirtualKeyboard::Phone);
+ else
+ m_virtualKeyboard.setKeyboardMode(QQnxVirtualKeyboard::Default);
+
if (!m_inputPanelVisible)
showInputPanel();
}
}
+
+QT_END_NAMESPACE
QT_BEGIN_NAMESPACE
+class QQnxVirtualKeyboard;
+
class QQnxInputContext : public QPlatformInputContext
{
Q_OBJECT
public:
- explicit QQnxInputContext();
+ explicit QQnxInputContext(QQnxVirtualKeyboard &keyboard);
~QQnxInputContext();
virtual bool isValid() const;
bool m_inputPanelVisible;
QLocale m_inputPanelLocale;
+ QQnxVirtualKeyboard &m_virtualKeyboard;
};
QT_END_NAMESPACE
: QPlatformIntegration()
, m_eventThread(0)
, m_navigatorEventHandler(0)
+ , m_virtualKeyboard(0)
, m_inputContext(0)
, m_fontDatabase(new QGenericUnixFontDatabase())
, m_paintUsingOpenGL(false)
#endif
// Create/start the keyboard class.
- QQnxVirtualKeyboard::instance();
+ m_virtualKeyboard = new QQnxVirtualKeyboard();
+
+ // 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_virtualKeyboard, "start", Qt::QueuedConnection);
+
+ // TODO check if we need to do this for all screens or only the primary one
+ QObject::connect(m_virtualKeyboard, SIGNAL(heightChanged(int)),
+ QQnxScreen::primaryDisplay(), SLOT(keyboardHeightChanged(int)));
// Set up the input context
- m_inputContext = new QQnxInputContext;
+ m_inputContext = new QQnxInputContext(*m_virtualKeyboard);
// Create services handling class
#ifdef Q_OS_BLACKBERRY
#if defined(QQNXINTEGRATION_DEBUG)
qDebug() << "QQnx: platform plugin shutdown begin";
#endif
+
+ // Destroy input context
+ delete m_inputContext;
+
// Destroy the keyboard class.
- QQnxVirtualKeyboard::destroy();
+ delete m_virtualKeyboard;
#ifndef QT_NO_CLIPBOARD
// Delete the clipboard
class QQnxEventThread;
class QQnxInputContext;
class QQnxNavigatorEventHandler;
+class QQnxVirtualKeyboard;
class QQnxWindow;
class QQnxServices;
screen_context_t m_screenContext;
QQnxEventThread *m_eventThread;
QQnxNavigatorEventHandler *m_navigatorEventHandler;
+ QQnxVirtualKeyboard *m_virtualKeyboard;
QQnxInputContext *m_inputContext;
QPlatformFontDatabase *m_fontDatabase;
bool m_paintUsingOpenGL;
****************************************************************************/
#include "qqnxscreen.h"
-#include "qqnxvirtualkeyboard.h"
#include "qqnxwindow.h"
#include <QtCore/QDebug>
#include <QtCore/QUuid>
+#include <QtGui/QWindowSystemInterface>
#include <errno.h>
m_rootWindow(),
m_primaryScreen(primaryScreen),
m_posted(false),
+ m_keyboardHeight(0),
m_platformContext(0)
{
#if defined(QQNXSCREEN_DEBUG)
qDebug() << Q_FUNC_INFO;
#endif
// available geometry = total geometry - keyboard
- int keyboardHeight = QQnxVirtualKeyboard::instance().height();
return QRect(m_currentGeometry.x(), m_currentGeometry.y(),
- m_currentGeometry.width(), m_currentGeometry.height() - keyboardHeight);
+ m_currentGeometry.width(), m_currentGeometry.height() - m_keyboardHeight);
}
/*!
}
}
+void QQnxScreen::keyboardHeightChanged(int height)
+{
+ if (height == m_keyboardHeight)
+ return;
+
+ m_keyboardHeight = height;
+
+ QWindowSystemInterface::handleScreenAvailableGeometryChange(screen(), availableGeometry());
+}
+
+
QT_END_NAMESPACE
#include "qqnxrootwindow.h"
#include <QtCore/QByteArray>
+#include <QtCore/QObject>
#include <QtCore/QScopedPointer>
#include <screen/screen.h>
class QQnxWindow;
-class QQnxScreen : public QPlatformScreen
+class QQnxScreen : public QObject, public QPlatformScreen
{
+ Q_OBJECT
public:
static QList<QPlatformScreen *> screens() { return ms_screens; }
static void createDisplays(screen_context_t context);
QSharedPointer<QQnxRootWindow> rootWindow() const { return m_rootWindow; }
+private Q_SLOTS:
+ void keyboardHeightChanged(int height);
+
private:
QQnxScreen(screen_context_t context, screen_display_t display, bool primaryScreen);
virtual ~QQnxScreen();
QSharedPointer<QQnxRootWindow> m_rootWindow;
bool m_primaryScreen;
bool m_posted;
- bool m_usingOpenGL;
int m_initialRotation;
int m_currentRotation;
+ int m_keyboardHeight;
QSize m_initialPhysicalSize;
QSize m_currentPhysicalSize;
QRect m_initialGeometry;
#include "qqnxvirtualkeyboard.h"
#include "qqnxscreen.h"
-#include <QtGui/QPlatformScreen>
-#include <QtGui/QPlatformWindow>
-
#include <QtCore/QDebug>
#include <QtCore/QSocketNotifier>
#include <QtCore/private/qcore_unix_p.h>
#include <sys/types.h>
#include <unistd.h>
+QT_BEGIN_NAMESPACE
+
const char *QQnxVirtualKeyboard::ms_PPSPath = "/pps/services/input/control?wait";
const size_t QQnxVirtualKeyboard::ms_bufferSize = 2048;
-static QQnxVirtualKeyboard *s_instance = 0;
-
// Huge hack for keyboard shadow (see QNX PR 88400). Should be removed ASAP.
#define KEYBOARD_SHADOW_HEIGHT 8
close();
}
-/* static */
-QQnxVirtualKeyboard& QQnxVirtualKeyboard::instance()
-{
- if (!s_instance) {
- s_instance = new QQnxVirtualKeyboard();
-
- // 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(s_instance, "start", Qt::QueuedConnection);
- }
-
- return *s_instance;
-}
-
void QQnxVirtualKeyboard::start()
{
#ifdef QQNXVIRTUALKEYBOARD_DEBUG
return;
}
-/* static */
-void QQnxVirtualKeyboard::destroy()
-{
- if (s_instance) {
- delete s_instance;
- s_instance = 0;
- }
-}
-
void QQnxVirtualKeyboard::close()
{
delete m_readNotifier;
if (newHeight != m_height) {
m_height = newHeight;
- updateAvailableScreenGeometry();
+ if (m_visible)
+ emit heightChanged(m_height);
}
const QLocale locale = QLocale(languageId + QLatin1Char('_') + countryId);
#ifdef QQNXVIRTUALKEYBOARD_DEBUG
qDebug() << "QQNX: handleKeyboardStateChangeMessage " << visible;
#endif
- updateAvailableScreenGeometry();
+ if (visible != m_visible)
+ emit heightChanged(height());
if (visible)
showKeyboard();
hideKeyboard();
}
-void QQnxVirtualKeyboard::updateAvailableScreenGeometry()
-{
-#ifdef QQNXVIRTUALKEYBOARD_DEBUG
- qDebug() << "QQNX: updateAvailableScreenGeometry: keyboard visible=" << m_visible << ", keyboard height=" << m_height;
-#endif
-
- // TODO: What screen index should be used? I assume primaryScreen here because it works, and
- // we do it for handleScreenGeometryChange elsewhere but since we have support
- // for more than one screen, that's not going to always work.
- QQnxScreen *platformScreen = QQnxScreen::primaryDisplay();
- QWindowSystemInterface::handleScreenAvailableGeometryChange(platformScreen->screen(), platformScreen->availableGeometry());
-}
-
bool QQnxVirtualKeyboard::showKeyboard()
{
#ifdef QQNXVIRTUALKEYBOARD_DEBUG
// hiding the keyboard wipes the setting.
applyKeyboardModeOptions();
+ if (m_visible)
+ return true;
+
pps_encoder_reset(m_encoder);
// Send the show message.
void QQnxVirtualKeyboard::setKeyboardMode(KeyboardMode mode)
{
+ if (m_keyboardMode == mode)
+ return;
+
m_keyboardMode = mode;
+ if (m_visible)
+ applyKeyboardModeOptions();
}
void QQnxVirtualKeyboard::applyKeyboardModeOptions()
pps_encoder_add_string(m_encoder, "enter", "enter.default");
pps_encoder_add_string(m_encoder, "type", "symbol");
}
+
+QT_END_NAMESPACE
#include <QtCore/QObject>
#include <QtCore/QLocale>
#include <QtGui/QPlatformScreen>
-#include <QtGui/QWindowSystemInterface>
#include <stddef.h>
#include <vector>
#include <string>
#include <sys/pps.h>
-class QSocketNotifier;
-
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
{
//
enum KeyboardMode { Default, Url, Email, Web, NumPunc, Symbol, Phone, Pin };
- static QQnxVirtualKeyboard& instance();
- static void destroy();
+ QQnxVirtualKeyboard();
+ ~QQnxVirtualKeyboard();
bool showKeyboard();
bool hideKeyboard();
Q_SIGNALS:
void localeChanged(const QLocale &locale);
void visibilityChanged(bool visible);
+ void heightChanged(int height);
private Q_SLOTS:
void ppsDataReady();
private:
- QQnxVirtualKeyboard();
- virtual ~QQnxVirtualKeyboard();
-
// Will be called internally if needed.
bool connect();
void close();
bool queryPPSInfo();
void handleKeyboardInfoMessage();
void handleKeyboardStateChangeMessage(bool visible);
- void updateAvailableScreenGeometry();
void applyKeyboardModeOptions();
void addDefaultModeOptions();