diff options
-rw-r--r-- | src/corelib/global/qnamespace.h | 40 | ||||
-rw-r--r-- | src/gui/kernel/kernel.pri | 3 | ||||
-rw-r--r-- | src/gui/kernel/qguiapplication.cpp | 24 | ||||
-rw-r--r-- | src/gui/kernel/qguiapplication.h | 3 | ||||
-rw-r--r-- | src/gui/kernel/qguiapplication_p.h | 1 | ||||
-rw-r--r-- | src/gui/kernel/qinputpanel.cpp | 172 | ||||
-rw-r--r-- | src/gui/kernel/qinputpanel.h | 121 | ||||
-rw-r--r-- | src/gui/kernel/qinputpanel_p.h | 68 | ||||
-rw-r--r-- | src/gui/kernel/qplatforminputcontext_qpa.cpp | 28 | ||||
-rw-r--r-- | src/gui/kernel/qplatforminputcontext_qpa.h | 17 | ||||
-rw-r--r-- | src/platformsupport/inputmethods/ibus/qibusplatforminputcontext.cpp | 33 | ||||
-rw-r--r-- | src/platformsupport/inputmethods/ibus/qibusplatforminputcontext.h | 6 | ||||
-rw-r--r-- | src/widgets/kernel/qapplication.cpp | 22 | ||||
-rw-r--r-- | src/widgets/kernel/qinputcontext.cpp | 135 | ||||
-rw-r--r-- | src/widgets/kernel/qinputcontext.h | 8 |
15 files changed, 481 insertions, 200 deletions
diff --git a/src/corelib/global/qnamespace.h b/src/corelib/global/qnamespace.h index 2fc82c55ca..740579b11d 100644 --- a/src/corelib/global/qnamespace.h +++ b/src/corelib/global/qnamespace.h @@ -1234,24 +1234,36 @@ public: }; enum InputMethodQuery { - ImMicroFocus, - ImFont, - ImCursorPosition, - ImSurroundingText, - ImCurrentSelection, - ImMaximumTextLength, - ImAnchorPosition, - ImHints - }; + ImEnabled = 0x1, + ImMicroFocus = 0x2, + ImFont = 0x4, + ImCursorPosition = 0x8, + ImSurroundingText = 0x10, + ImCurrentSelection = 0x20, + ImMaximumTextLength = 0x40, + ImAnchorPosition = 0x80, + ImHints = 0x100, + ImPreferredLanguage = 0x200, + + ImPlatformData = 0x80000000, + ImQueryAll = 0xffffffff + }; + Q_DECLARE_FLAGS(InputMethodQueries, InputMethodQuery) enum InputMethodHint { ImhNone = 0x0, + ImhHiddenText = 0x1, - ImhNoAutoUppercase = 0x2, - ImhPreferNumbers = 0x4, - ImhPreferUppercase = 0x8, - ImhPreferLowercase = 0x10, - ImhNoPredictiveText = 0x20, + ImhSensitiveData = 0x2, + ImhNoAutoUppercase = 0x4, + ImhPreferNumbers = 0x8, + ImhPreferUppercase = 0x10, + ImhPreferLowercase = 0x20, + ImhNoPredictiveText = 0x40, + + ImhDate = 0x80, + ImhTime = 0x100, + ImhMultiLine = 0x200, ImhDigitsOnly = 0x10000, ImhFormattedNumbersOnly = 0x20000, diff --git a/src/gui/kernel/kernel.pri b/src/gui/kernel/kernel.pri index 2167510c4d..5195b2e3f5 100644 --- a/src/gui/kernel/kernel.pri +++ b/src/gui/kernel/kernel.pri @@ -13,6 +13,8 @@ HEADERS += \ kernel/qdnd_p.h \ kernel/qevent.h \ kernel/qevent_p.h \ + kernel/qinputpanel.h \ + kernel/qinputpanel_p.h \ kernel/qkeysequence.h \ kernel/qkeysequence_p.h \ kernel/qkeymapper_p.h \ @@ -29,6 +31,7 @@ SOURCES += \ kernel/qdrag.cpp \ kernel/qdnd.cpp \ kernel/qevent.cpp \ + kernel/qinputpanel.cpp \ kernel/qkeysequence.cpp \ kernel/qkeymapper.cpp \ kernel/qkeymapper_qpa.cpp \ diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index 6cddf3ab73..e9edeb9247 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -60,6 +60,7 @@ #include <QtGui/QPlatformIntegration> #include <QtGui/QGenericPluginFactory> #include <QtGui/qstylehints.h> +#include <QtGui/qinputpanel.h> #include <QWindowSystemInterface> #include "private/qwindowsysteminterface_qpa_p.h" @@ -174,7 +175,8 @@ QGuiApplication::~QGuiApplication() QGuiApplicationPrivate::QGuiApplicationPrivate(int &argc, char **argv, int flags) : QCoreApplicationPrivate(argc, argv, flags), - styleHints(0) + styleHints(0), + inputPanel(0) { self = this; } @@ -403,6 +405,7 @@ QGuiApplicationPrivate::~QGuiApplicationPrivate() cleanupThreadData(); delete styleHints; + delete inputPanel; delete platform_integration; platform_integration = 0; @@ -1186,6 +1189,25 @@ QStyleHints *QGuiApplication::styleHints() const } +/*! + \since 5.0 + + returns the input panel. + + The input panel returns properties about the state and position of + the virtual keyboard. It also provides information about the position of the + current focused input element. + + \sa QInputPanel + */ +QInputPanel *QGuiApplication::inputPanel() const +{ + Q_D(const QGuiApplication); + if (!d->inputPanel) + const_cast<QGuiApplicationPrivate *>(d)->inputPanel = new QInputPanel(); + return d->inputPanel; +} + // Returns the current platform used by keyBindings uint QGuiApplicationPrivate::currentKeyPlatform() diff --git a/src/gui/kernel/qguiapplication.h b/src/gui/kernel/qguiapplication.h index c402b9b9dc..0649b5de31 100644 --- a/src/gui/kernel/qguiapplication.h +++ b/src/gui/kernel/qguiapplication.h @@ -59,6 +59,7 @@ class QPlatformNativeInterface; class QPalette; class QScreen; class QStyleHints; +class QInputPanel; #if defined(qApp) #undef qApp @@ -113,10 +114,12 @@ public: static inline bool isRightToLeft() { return layoutDirection() == Qt::RightToLeft; } static inline bool isLeftToRight() { return layoutDirection() == Qt::LeftToRight; } + // ### move to QInputPanel static QLocale keyboardInputLocale(); static Qt::LayoutDirection keyboardInputDirection(); QStyleHints *styleHints() const; + QInputPanel *inputPanel() const; static QPlatformNativeInterface *platformNativeInterface(); diff --git a/src/gui/kernel/qguiapplication_p.h b/src/gui/kernel/qguiapplication_p.h index bdf79d4394..9f64911399 100644 --- a/src/gui/kernel/qguiapplication_p.h +++ b/src/gui/kernel/qguiapplication_p.h @@ -173,6 +173,7 @@ public: static QFont *app_font; QStyleHints *styleHints; + QInputPanel *inputPanel; static bool quitOnLastWindowClosed; diff --git a/src/gui/kernel/qinputpanel.cpp b/src/gui/kernel/qinputpanel.cpp new file mode 100644 index 0000000000..36104f3816 --- /dev/null +++ b/src/gui/kernel/qinputpanel.cpp @@ -0,0 +1,172 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <qinputpanel.h> +#include <private/qinputpanel_p.h> +#include <qplatforminputcontext_qpa.h> +#include <private/qguiapplication_p.h> + +QInputPanel::QInputPanel() + : QObject(*new QInputPanelPrivate) +{ +} + +QInputPanel::~QInputPanel() +{ +} + + +QObject *QInputPanel::inputItem() const +{ + Q_D(const QInputPanel); + return d->inputItem.data(); +} + +void QInputPanel::setInputItem(QObject *inputItem) +{ + Q_D(QInputPanel); + + if (d->inputItem.data() == inputItem) + return; + + d->inputItem = inputItem; + emit inputItemChanged(); +} + +QWindow *QInputPanel::inputWindow() const +{ + return qApp->activeWindow(); +} + +QTransform QInputPanel::inputItemTransform() const +{ + Q_D(const QInputPanel); + return d->inputItemTransform; +} + +void QInputPanel::setInputItemTranform(const QTransform &transform) +{ + Q_D(QInputPanel); + d->inputItemTransform = transform; + emit cursorRectChanged(); +} + +QRectF QInputPanel::cursorRect() const +{ + QInputMethodQueryEvent query(Qt::ImMicroFocus); + QGuiApplication::sendEvent(inputItem(), &query); + QRect r = query.value().toRect(); + if (!r.isValid()) + return QRect(); + + Q_D(const QInputPanel); + return d->inputItemTransform.mapRect(r); +} + +QRectF QInputPanel::keyboardRect() +{ + QPlatformInputContext *ic = QGuiApplicationPrivate::platformIntegration()->inputContext(); + if (ic) + return ic->keyboardRect(); + return QRectF(); +} + +void QInputPanel::open() +{ + setOpen(true); +} + +void QInputPanel::close() +{ + setOpen(false); +} + +bool QInputPanel::isOpen() const +{ + Q_D(const QInputPanel); + + return d->open; +} + +void QInputPanel::setOpen(bool open) +{ + Q_D(QInputPanel); + if (d->open == open) + return; + + d->open = open; + emit openChanged(); +} + +bool QInputPanel::isAnimating() const +{ + QPlatformInputContext *ic = QGuiApplicationPrivate::platformIntegration()->inputContext(); + if (ic) + return ic->isAnimating(); + return false; +} + + +void QInputPanel::update(Qt::InputMethodQueries queries) +{ + QPlatformInputContext *ic = QGuiApplicationPrivate::platformIntegration()->inputContext(); + if (ic) + ic->update(queries); + + if (queries & Qt::ImMicroFocus) + emit cursorRectChanged(); +} + +void QInputPanel::reset() +{ + QPlatformInputContext *ic = QGuiApplicationPrivate::platformIntegration()->inputContext(); + if (ic) + ic->reset(); +} + +void QInputPanel::invokeAction(Action a, int cursorPosition) +{ + QPlatformInputContext *ic = QGuiApplicationPrivate::platformIntegration()->inputContext(); + if (ic) + ic->invokeAction(a, cursorPosition); +} + +#include "moc_qinputpanel.cpp" diff --git a/src/gui/kernel/qinputpanel.h b/src/gui/kernel/qinputpanel.h new file mode 100644 index 0000000000..2348fbd62f --- /dev/null +++ b/src/gui/kernel/qinputpanel.h @@ -0,0 +1,121 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QINPUTPANEL_H +#define QINPUTPANEL_H + +#include <QtCore/qobject.h> + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(Gui) + +class QInputPanelPrivate; +class QWindow; +class QRectF; + +class Q_GUI_EXPORT QInputPanel : public QObject +{ + Q_OBJECT + Q_DECLARE_PRIVATE(QInputPanel) + Q_PROPERTY(QObject *inputItem READ inputItem WRITE setInputItem NOTIFY inputItemChanged) + Q_PROPERTY(QRectF cursorRect READ cursorRect NOTIFY cursorRectChanged) + Q_PROPERTY(QRectF keyboardRect READ keyboardRect NOTIFY keyboardRectChanged) + Q_PROPERTY(bool open READ isOpen WRITE setOpen NOTIFY openChanged) + Q_PROPERTY(bool animating READ isAnimating NOTIFY animatingChanged) + +public: + QObject *inputItem() const; + void setInputItem(QObject *inputItemChanged); + + // the window containing the editor + QWindow *inputWindow() const; + + QTransform inputItemTransform() const; + void setInputItemTranform(const QTransform &transform); + + // in window coordinates + QRectF cursorRect() const; // ### what if we have rotations for the item? + + // keyboard geometry in window coords + QRectF keyboardRect(); + + enum Action { + Click, + ContextMenu + }; + + bool isOpen() const; + void setOpen(bool open); + + bool isAnimating() const; + +public Q_SLOTS: + void open(); + void close(); + + void update(Qt::InputMethodQueries queries); + void reset(); + + void invokeAction(Action a, int cursorPosition); + +Q_SIGNALS: + void inputItemChanged(); + void cursorRectChanged(); + void keyboardRectChanged(); + void openChanged(); + void animatingChanged(); + +private: + friend class QGuiApplication; + friend class QGuiApplicationPrivate; + friend class QPlatformInputContext; + QInputPanel(); + ~QInputPanel(); +}; + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/gui/kernel/qinputpanel_p.h b/src/gui/kernel/qinputpanel_p.h new file mode 100644 index 0000000000..567459c79e --- /dev/null +++ b/src/gui/kernel/qinputpanel_p.h @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QINPUTPANEL_P_H +#define QINPUTPANEL_P_H + +#include <qinputpanel.h> +#include <private/qobject_p.h> +#include <QtCore/QWeakPointer> + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +class QInputPanelPrivate : public QObjectPrivate +{ +public: + inline QInputPanelPrivate() + : open(false) + {} + QTransform inputItemTransform; + QWeakPointer<QObject> inputItem; + bool open; +}; + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif diff --git a/src/gui/kernel/qplatforminputcontext_qpa.cpp b/src/gui/kernel/qplatforminputcontext_qpa.cpp index 4ef25ddbe5..8c08c13180 100644 --- a/src/gui/kernel/qplatforminputcontext_qpa.cpp +++ b/src/gui/kernel/qplatforminputcontext_qpa.cpp @@ -40,8 +40,7 @@ ****************************************************************************/ #include <qplatforminputcontext_qpa.h> - -#include <QtGui/QMouseEvent> +#include <qguiapplication.h> QT_BEGIN_NAMESPACE @@ -57,26 +56,37 @@ void QPlatformInputContext::reset() { } -void QPlatformInputContext::update() +void QPlatformInputContext::update(Qt::InputMethodQueries) { } -void QPlatformInputContext::mouseHandler(int, QMouseEvent *event) +void QPlatformInputContext::invokeAction(QInputPanel::Action action, int cursorPosition) { // Default behavior for simple ephemeral input contexts. Some // complex input contexts should not be reset here. - if (event->type() == QEvent::MouseButtonPress || event->type() == QEvent::MouseButtonDblClick) + if (action == QInputPanel::Click) reset(); } -QObject *QPlatformInputContext::focusObject() const +QRectF QPlatformInputContext::keyboardRect() const +{ + return QRectF(); +} + +void QPlatformInputContext::emitKeyboardRectChanged() const { - return m_focusObject.data(); + emit qApp->inputPanel()->keyboardRectChanged(); } -void QPlatformInputContext::setFocusObject(QObject *object) +bool QPlatformInputContext::isAnimating() { - m_focusObject = object; + return false; } +void QPlatformInputContext::emitAnimatingChanged() +{ + emit qApp->inputPanel()->animatingChanged(); +} + + QT_END_NAMESPACE diff --git a/src/gui/kernel/qplatforminputcontext_qpa.h b/src/gui/kernel/qplatforminputcontext_qpa.h index 57694fe9d9..3bdce73019 100644 --- a/src/gui/kernel/qplatforminputcontext_qpa.h +++ b/src/gui/kernel/qplatforminputcontext_qpa.h @@ -42,7 +42,7 @@ #ifndef QPLATFORMINPUTCONTEXT_H #define QPLATFORMINPUTCONTEXT_H -#include <QtCore/QWeakPointer> +#include <qinputpanel.h> QT_BEGIN_HEADER @@ -60,17 +60,14 @@ public: virtual ~QPlatformInputContext(); virtual void reset(); - virtual void update(); + virtual void update(Qt::InputMethodQueries); + virtual void invokeAction(QInputPanel::Action, int cursorPosition); - virtual void mouseHandler(int x, QMouseEvent *event); + virtual QRectF keyboardRect() const; + void emitKeyboardRectChanged() const; - QObject *focusObject() const; - virtual void setFocusObject(QObject *object); - -// virtual QList<QAction *> actions(); -private: - QWeakPointer<QObject> m_focusObject; - QWeakPointer<QWindow> m_focusWindow; + virtual bool isAnimating(); + void emitAnimatingChanged(); }; QT_END_NAMESPACE diff --git a/src/platformsupport/inputmethods/ibus/qibusplatforminputcontext.cpp b/src/platformsupport/inputmethods/ibus/qibusplatforminputcontext.cpp index 34838ff490..fba9116ca8 100644 --- a/src/platformsupport/inputmethods/ibus/qibusplatforminputcontext.cpp +++ b/src/platformsupport/inputmethods/ibus/qibusplatforminputcontext.cpp @@ -84,6 +84,8 @@ QIBusPlatformInputContext::QIBusPlatformInputContext () connect(d->context, SIGNAL(CommitText(QDBusVariant)), SLOT(commitText(QDBusVariant))); connect(d->context, SIGNAL(UpdatePreeditText(QDBusVariant,uint,bool)), this, SLOT(updatePreeditText(QDBusVariant,uint,bool))); } + QInputPanel *p = qApp->inputPanel(); + connect(p, SIGNAL(inputItemChanged()), this, SLOT(inputItemChanged())); } QIBusPlatformInputContext::~QIBusPlatformInputContext (void) @@ -96,9 +98,9 @@ bool QIBusPlatformInputContext::isValid() const return d->valid; } -void QIBusPlatformInputContext::mouseHandler (int x, QMouseEvent *event) +void QIBusPlatformInputContext::invokeAction(QInputPanel::Action a, int x) { - QPlatformInputContext::mouseHandler (x, event); + QPlatformInputContext::invokeAction(a, x); if (!d->valid) return; @@ -114,14 +116,14 @@ void QIBusPlatformInputContext::reset() d->context->Reset(); } -void QIBusPlatformInputContext::update() +void QIBusPlatformInputContext::update(Qt::InputMethodQueries q) { - QPlatformInputContext::update(); + QPlatformInputContext::update(q); if (!d->valid) return; - QObject *o = focusObject(); + QObject *o = qApp->inputPanel()->inputItem(); if (!o) return; @@ -135,16 +137,15 @@ void QIBusPlatformInputContext::update() } } -void QIBusPlatformInputContext::setFocusObject(QObject *object) +void QIBusPlatformInputContext::inputItemChanged() { - QPlatformInputContext::setFocusObject(object); - if (!d->valid) return; + QObject *input = qApp->inputPanel()->inputItem(); if (debug) - qDebug() << "setFocusObject" << object; - if (object) + qDebug() << "setFocusObject" << input; + if (input) d->context->FocusIn(); else d->context->FocusOut(); @@ -153,6 +154,10 @@ void QIBusPlatformInputContext::setFocusObject(QObject *object) void QIBusPlatformInputContext::commitText(const QDBusVariant &text) { + QObject *input = qApp->inputPanel()->inputItem(); + if (!input) + return; + const QDBusArgument arg = text.variant().value<QDBusArgument>(); QIBusText t; @@ -164,11 +169,15 @@ void QIBusPlatformInputContext::commitText(const QDBusVariant &text) QInputMethodEvent event; event.setCommitString(t.text); - QCoreApplication::sendEvent(focusObject(), &event); + QCoreApplication::sendEvent(input, &event); } void QIBusPlatformInputContext::updatePreeditText(const QDBusVariant &text, uint cursorPos, bool visible) { + QObject *input = qApp->inputPanel()->inputItem(); + if (!input) + return; + const QDBusArgument arg = text.variant().value<QDBusArgument>(); QIBusText t; @@ -180,7 +189,7 @@ void QIBusPlatformInputContext::updatePreeditText(const QDBusVariant &text, uint attributes += QInputMethodEvent::Attribute(QInputMethodEvent::Cursor, cursorPos, visible ? 1 : 0, QVariant()); QInputMethodEvent event(t.text, attributes); - QCoreApplication::sendEvent(focusObject(), &event); + QCoreApplication::sendEvent(input, &event); } diff --git a/src/platformsupport/inputmethods/ibus/qibusplatforminputcontext.h b/src/platformsupport/inputmethods/ibus/qibusplatforminputcontext.h index 74f7da8d41..66c3aeecc6 100644 --- a/src/platformsupport/inputmethods/ibus/qibusplatforminputcontext.h +++ b/src/platformsupport/inputmethods/ibus/qibusplatforminputcontext.h @@ -55,16 +55,16 @@ public: bool isValid() const; - void mouseHandler(int x, QMouseEvent *event); + void invokeAction(QInputPanel::Action a, int x); void reset(void); - void update(void); - void setFocusObject(QObject *object); + void update(Qt::InputMethodQueries); bool x11FilterEvent(uint keyval, uint keycode, uint state, bool press); public Q_SLOTS: void commitText(const QDBusVariant &text); void updatePreeditText(const QDBusVariant &text, uint cursor_pos, bool visible); + void inputItemChanged(); private: QIBusPlatformInputContextPrivate *d; diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp index 043b114c64..c9ef2e79d8 100644 --- a/src/widgets/kernel/qapplication.cpp +++ b/src/widgets/kernel/qapplication.cpp @@ -69,7 +69,7 @@ #include "qmessagebox.h" #include <QtWidgets/qgraphicsproxywidget.h> #include <QtGui/qstylehints.h> - +#include <QtGui/qinputpanel.h> #include "qinputcontext.h" #include "private/qkeymapper_p.h" @@ -3754,13 +3754,6 @@ bool QApplication::notify(QObject *receiver, QEvent *e) QPoint relpos = mouse->pos(); if (e->spontaneous()) { -#ifndef QT_NO_IM - QInputContext *ic = w->inputContext(); - if (ic - && w->testAttribute(Qt::WA_InputMethodEnabled) - && ic->filterEvent(mouse)) - return true; -#endif if (e->type() == QEvent::MouseButtonPress) { QApplicationPrivate::giveFocusAccordingToFocusPolicy(w, @@ -4117,17 +4110,10 @@ bool QApplication::notify(QObject *receiver, QEvent *e) break; } case QEvent::RequestSoftwareInputPanel: + inputPanel()->open(); + break; case QEvent::CloseSoftwareInputPanel: -#ifndef QT_NO_IM - if (receiver->isWidgetType()) { - QWidget *w = static_cast<QWidget *>(receiver); - QInputContext *ic = w->inputContext(); - if (ic && ic->filterEvent(e)) { - break; - } - } -#endif - res = d->notify_helper(receiver, e); + inputPanel()->close(); break; #ifndef QT_NO_GESTURES diff --git a/src/widgets/kernel/qinputcontext.cpp b/src/widgets/kernel/qinputcontext.cpp index a3e73eb288..05ed9369f6 100644 --- a/src/widgets/kernel/qinputcontext.cpp +++ b/src/widgets/kernel/qinputcontext.cpp @@ -62,12 +62,11 @@ #include "qplatformdefs.h" #include "qapplication.h" -#include "private/qguiapplication_p.h" -#include "qplatformintegration_qpa.h" -#include "qplatforminputcontext_qpa.h" #include "qmenu.h" #include "qtextformat.h" #include "qpalette.h" +#include <QtGui/qinputpanel.h> +#include <QtGui/qevent.h> #include <stdlib.h> #include <limits.h> @@ -172,10 +171,7 @@ QInputContext::~QInputContext() */ QWidget *QInputContext::focusWidget() const { - QPlatformInputContext *ic = QGuiApplicationPrivate::platformIntegration()->inputContext(); - if (ic) - return qobject_cast<QWidget *>(ic->focusObject()); - return 0; + return qobject_cast<QWidget *>(qApp->inputPanel()->inputItem()); } @@ -189,10 +185,7 @@ QWidget *QInputContext::focusWidget() const */ void QInputContext::setFocusWidget(QWidget *widget) { - Q_ASSERT(!widget || widget->testAttribute(Qt::WA_InputMethodEnabled)); - QPlatformInputContext *ic = QGuiApplicationPrivate::platformIntegration()->inputContext(); - if (ic) - ic->setFocusObject(widget); + qApp->inputPanel()->setInputItem(widget); } /*! @@ -209,50 +202,6 @@ void QInputContext::setFocusWidget(QWidget *widget) \sa sendEvent() */ -/*! - This function can be reimplemented in a subclass to filter input - events. - - Return true if the \a event has been consumed. Otherwise, the - unfiltered \a event will be forwarded to widgets as ordinary - way. Although the input events have accept() and ignore() - methods, leave it untouched. - - \a event is currently restricted to events of these types: - - \list - \i CloseSoftwareInputPanel - \i KeyPress - \i KeyRelease - \i MouseButtonDblClick - \i MouseButtonPress - \i MouseButtonRelease - \i MouseMove - \i RequestSoftwareInputPanel - \endlist - - But some input method related events such as QWheelEvent or - QTabletEvent may be added in future. - - The filtering opportunity is always given to the input context as - soon as possible. It has to be taken place before any other key - event consumers such as eventfilters and accelerators because some - input methods require quite various key combination and - sequences. It often conflicts with accelerators and so on, so we - must give the input context the filtering opportunity first to - ensure all input methods work properly regardless of application - design. - - Ordinary input methods require discrete key events to work - properly, so Qt's key compression is always disabled for any input - contexts. - - \sa QKeyEvent, x11FilterEvent() -*/ -bool QInputContext::filterEvent(const QEvent * /*event*/) -{ - return false; -} /*! Sends an input method event specified by \a event to the current focus @@ -271,14 +220,8 @@ bool QInputContext::filterEvent(const QEvent * /*event*/) */ void QInputContext::sendEvent(const QInputMethodEvent &event) { - // route events over input context parents to make chaining possible. - QInputContext *p = qobject_cast<QInputContext *>(parent()); - if (p) { - p->sendEvent(event); - return; - } - QWidget *focus = focusWidget(); + QObject *focus = qApp->inputPanel()->inputItem(); if (!focus) return; @@ -306,9 +249,8 @@ void QInputContext::sendEvent(const QInputMethodEvent &event) */ void QInputContext::mouseHandler(int x, QMouseEvent *event) { - QPlatformInputContext *ic = QGuiApplicationPrivate::platformIntegration()->inputContext(); - if (ic) - ic->mouseHandler(x, event); + if (event->type() == QEvent::MouseButtonRelease) + qApp->inputPanel()->invokeAction(QInputPanel::Click, x); } @@ -331,9 +273,7 @@ QFont QInputContext::font() const */ void QInputContext::update() { - QPlatformInputContext *ic = QGuiApplicationPrivate::platformIntegration()->inputContext(); - if (ic) - ic->update(); + qApp->inputPanel()->update(Qt::ImQueryAll); } /*! @@ -343,8 +283,7 @@ void QInputContext::update() */ void QInputContext::widgetDestroyed(QWidget *widget) { - if (widget == focusWidget()) - setFocusWidget(0); + // nothing to be done here, as we use a weak pointer in the input panel } /*! @@ -369,9 +308,7 @@ void QInputContext::widgetDestroyed(QWidget *widget) */ void QInputContext::reset() { - QPlatformInputContext *ic = QGuiApplicationPrivate::platformIntegration()->inputContext(); - if (ic) - ic->reset(); + qApp->inputPanel()->reset(); } @@ -464,58 +401,6 @@ QTextFormat QInputContext::standardFormat(StandardFormat s) const return fmt; } -#ifdef Q_WS_X11 -/*! - This function may be overridden only if input method is depending - on X11 and you need raw XEvent. Otherwise, this function must not. - - This function is designed to filter raw key events for XIM, but - other input methods may use this to implement some special - features such as distinguishing Shift_L and Shift_R. - - Return true if the \a event has been consumed. Otherwise, the - unfiltered \a event will be translated into QEvent and forwarded - to filterEvent(). Filtering at both x11FilterEvent() and - filterEvent() in single input method is allowed. - - \a keywidget is a client widget into which a text is inputted. \a - event is inputted XEvent. - - \sa filterEvent() -*/ -bool QInputContext::x11FilterEvent(QWidget * /*keywidget*/, XEvent * /*event*/) -{ - return false; -} -#endif // Q_WS_X11 - -#ifdef Q_OS_SYMBIAN -/*! - \since 4.6 - - This function may be overridden only if input method is depending - on Symbian and you need raw Symbian events. Otherwise, this function must not. - - This function is designed to filter raw key events on Symbian, but - other input methods may use this to implement some special - features. - - Return true if the \a event has been consumed. Otherwise, the - unfiltered \a event will be translated into QEvent and forwarded - to filterEvent(). Filtering at both symbianFilterEvent() and - filterEvent() in single input method is allowed. - - \a keywidget is a client widget into which a text is inputted. \a - event is inputted QSymbianEvent. - - \sa filterEvent() -*/ -bool QInputContext::symbianFilterEvent(QWidget * /*keywidget*/, const QSymbianEvent * /*event*/) -{ - return false; -} -#endif // Q_OS_SYMBIAN - QT_END_NAMESPACE #endif //Q_NO_IM diff --git a/src/widgets/kernel/qinputcontext.h b/src/widgets/kernel/qinputcontext.h index ac5f07549c..4864c5aea6 100644 --- a/src/widgets/kernel/qinputcontext.h +++ b/src/widgets/kernel/qinputcontext.h @@ -102,14 +102,6 @@ public: virtual QList<QAction *> actions(); -#if defined(Q_WS_X11) - virtual bool x11FilterEvent( QWidget *keywidget, XEvent *event ); -#endif // Q_WS_X11 -#if defined(Q_OS_SYMBIAN) - virtual bool symbianFilterEvent( QWidget *keywidget, const QSymbianEvent *event ); -#endif // Q_OS_SYMBIAN - virtual bool filterEvent( const QEvent *event ); - void sendEvent(const QInputMethodEvent &event); virtual bool isComposing() const { return false; } |