Refactor the input framework

Results of the ongoing workshop in Oslo:
QInputPanel will be the application facing interface
for controlling the input context as well as querying
things like the position of the virtual keyboard.
QInputContext is significantly cleaned up and only there as
a compatibility API for existing code.

Change-Id: Ie8e2ee480930763f414bfaae63247b1fb6500c82
Reviewed-on: http://codereview.qt.nokia.com/4357
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Vesa Rantanen <vesa.rantanen@nokia.com>
Reviewed-by: Joona Petrell <joona.t.petrell@nokia.com>
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
This commit is contained in:
Lars Knoll 2011-09-05 12:53:33 +02:00
parent a796eda7c4
commit a30d4162dd
15 changed files with 480 additions and 199 deletions

View File

@ -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,

View File

@ -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 \

View File

@ -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()

View File

@ -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();

View File

@ -173,6 +173,7 @@ public:
static QFont *app_font;
QStyleHints *styleHints;
QInputPanel *inputPanel;
static bool quitOnLastWindowClosed;

View File

@ -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"

View File

@ -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

View File

@ -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

View File

@ -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 m_focusObject.data();
return QRectF();
}
void QPlatformInputContext::setFocusObject(QObject *object)
void QPlatformInputContext::emitKeyboardRectChanged() const
{
m_focusObject = object;
emit qApp->inputPanel()->keyboardRectChanged();
}
bool QPlatformInputContext::isAnimating()
{
return false;
}
void QPlatformInputContext::emitAnimatingChanged()
{
emit qApp->inputPanel()->animatingChanged();
}
QT_END_NAMESPACE

View File

@ -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

View File

@ -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);
}

View File

@ -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;

View File

@ -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:
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)) {
inputPanel()->open();
break;
}
}
#endif
res = d->notify_helper(receiver, e);
case QEvent::CloseSoftwareInputPanel:
inputPanel()->close();
break;
#ifndef QT_NO_GESTURES

View File

@ -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

View File

@ -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; }