add a platform interface for input method support
add QPlatformInputContext to help supporting complex text input. Communication with the focus objects/widgets will happen slightly different then before, through events instead of methods one can query on QWidget.bb10
parent
c23580de7b
commit
e1293b49e3
|
|
@ -43,6 +43,7 @@ qpa {
|
|||
kernel/qplatformintegration_qpa.h \
|
||||
kernel/qplatformdrag_qpa.h \
|
||||
kernel/qplatformscreen_qpa.h \
|
||||
kernel/qplatforminputcontext_qpa.h \
|
||||
kernel/qplatformintegrationfactory_qpa_p.h \
|
||||
kernel/qplatformintegrationplugin_qpa.h \
|
||||
kernel/qplatformwindow_qpa.h \
|
||||
|
|
@ -63,6 +64,7 @@ qpa {
|
|||
kernel/qgenericpluginfactory_qpa.cpp \
|
||||
kernel/qgenericplugin_qpa.cpp \
|
||||
kernel/qwindowsysteminterface_qpa.cpp \
|
||||
kernel/qplatforminputcontext_qpa.cpp \
|
||||
kernel/qplatformintegration_qpa.cpp \
|
||||
kernel/qplatformscreen_qpa.cpp \
|
||||
kernel/qplatformintegrationfactory_qpa.cpp \
|
||||
|
|
|
|||
|
|
@ -0,0 +1,72 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** 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$
|
||||
** 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 <qplatforminputcontext_qpa.h>
|
||||
|
||||
QPlatformInputContext::QPlatformInputContext()
|
||||
{
|
||||
}
|
||||
|
||||
void QPlatformInputContext::reset()
|
||||
{
|
||||
}
|
||||
|
||||
void QPlatformInputContext::update()
|
||||
{
|
||||
}
|
||||
|
||||
void QPlatformInputContext::mouseHandler(int, QMouseEvent *event)
|
||||
{
|
||||
// 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)
|
||||
reset();
|
||||
}
|
||||
|
||||
QObject *QPlatformInputContext::focusObject() const
|
||||
{
|
||||
return focus.data();
|
||||
}
|
||||
|
||||
void QPlatformInputContext::setFocusObject(QObject *o)
|
||||
{
|
||||
focus = o;
|
||||
}
|
||||
|
|
@ -39,56 +39,28 @@
|
|||
**
|
||||
****************************************************************************/
|
||||
|
||||
//
|
||||
// W A R N I N G
|
||||
// -------------
|
||||
//
|
||||
// This file is not part of the Qt API. It exists purely as an
|
||||
// implementation detail. This header file may change from version to
|
||||
// version without notice, or even be removed.
|
||||
//
|
||||
// We mean it.
|
||||
//
|
||||
#ifndef QPLATFORMINPUTCONTEXT_H
|
||||
#define QPLATFORMINPUTCONTEXT_H
|
||||
|
||||
/****************************************************************************
|
||||
**
|
||||
** Implementation of QInputContext class
|
||||
**
|
||||
** Copyright (C) 2003-2004 immodule for Qt Project. All rights reserved.
|
||||
**
|
||||
** This file is written to contribute to Nokia Corporation and/or its subsidiary(-ies) under their own
|
||||
** license. You may use this file under your Qt license. Following
|
||||
** description is copied from their original file headers. Contact
|
||||
** immodule-qt@freedesktop.org if any conditions of this licensing are
|
||||
** not clear to you.
|
||||
**
|
||||
****************************************************************************/
|
||||
#include <qsharedpointer.h>
|
||||
class QMouseEvent;
|
||||
|
||||
#ifndef QINPUTCONTEXT_P_H
|
||||
#define QINPUTCONTEXT_P_H
|
||||
|
||||
#include "private/qobject_p.h"
|
||||
#include "qwidget.h"
|
||||
#include "qinputcontext.h"
|
||||
|
||||
#ifndef QT_NO_IM
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class QInputContextPrivate : public QObjectPrivate
|
||||
class Q_GUI_EXPORT QPlatformInputContext
|
||||
{
|
||||
Q_DECLARE_PUBLIC(QInputContext)
|
||||
public:
|
||||
QInputContextPrivate()
|
||||
: focusWidget(0)
|
||||
{}
|
||||
QPlatformInputContext();
|
||||
|
||||
QWidget *focusWidget;
|
||||
virtual void reset();
|
||||
virtual void update();
|
||||
|
||||
virtual void mouseHandler(int x, QMouseEvent *event);
|
||||
|
||||
QObject *focusObject() const;
|
||||
virtual void setFocusObject(QObject *o);
|
||||
|
||||
// virtual QList<QAction *> actions();
|
||||
private:
|
||||
QWeakPointer<QObject> focus;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
|
@ -98,6 +98,12 @@ QPlatformClipboard *QPlatformIntegration::clipboard() const
|
|||
#endif
|
||||
|
||||
#ifndef QT_NO_DRAGANDDROP
|
||||
/*!
|
||||
Accessor for the platform integrations drag object.
|
||||
|
||||
Default implementation returns 0, implying no drag and drop support.
|
||||
|
||||
*/
|
||||
QPlatformDrag *QPlatformIntegration::drag() const
|
||||
{
|
||||
return 0;
|
||||
|
|
@ -245,4 +251,14 @@ QPlatformPrinterSupport *QPlatformIntegration::printerSupport() const
|
|||
return ps;
|
||||
}
|
||||
|
||||
/*!
|
||||
Returns the platforms input context.
|
||||
|
||||
The default implementation returns 0, implying no input method support.
|
||||
*/
|
||||
QPlatformInputContext *QPlatformIntegration::inputContext() const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
|
|
|||
|
|
@ -64,6 +64,7 @@ class QPlatformDrag;
|
|||
class QPlatformGLContext;
|
||||
class QGuiGLFormat;
|
||||
class QAbstractEventDispatcher;
|
||||
class QPlatformInputContext;
|
||||
|
||||
class Q_GUI_EXPORT QPlatformIntegration
|
||||
{
|
||||
|
|
@ -100,6 +101,7 @@ public:
|
|||
#ifndef QT_NO_DRAGANDDROP
|
||||
virtual QPlatformDrag *drag() const;
|
||||
#endif
|
||||
virtual QPlatformInputContext *inputContext() const;
|
||||
|
||||
// Access native handles. The window handle is already available from Wid;
|
||||
virtual QPlatformNativeInterface *nativeInterface() const;
|
||||
|
|
|
|||
|
|
@ -27,4 +27,4 @@ include(fb_base/fb_base.pri)
|
|||
include(fontdatabases/fontdatabases.pri)
|
||||
include(glxconvenience/glxconvenience.pri)
|
||||
include(printersupport/printersupport.pri)
|
||||
|
||||
#include(inputmethods/inputmethods.pri)
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
|
||||
HEADERS +=inputmethod/qinputcontextfactory.h \
|
||||
inputmethod/qinputcontextplugin.h \
|
||||
inputmethod/qinputcontext_p.h \
|
||||
inputmethod/qinputcontext.h
|
||||
SOURCES +=inputmethod/qinputcontextfactory.cpp \
|
||||
inputmethod/qinputcontextplugin.cpp \
|
||||
|
|
|
|||
|
|
@ -56,13 +56,15 @@
|
|||
//#define QT_NO_IM_PREEDIT_RELOCATION
|
||||
|
||||
#include "qinputcontext.h"
|
||||
#include "qinputcontext_p.h"
|
||||
|
||||
#ifndef QT_NO_IM
|
||||
|
||||
#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"
|
||||
|
|
@ -143,7 +145,7 @@ QT_BEGIN_NAMESPACE
|
|||
Constructs an input context with the given \a parent.
|
||||
*/
|
||||
QInputContext::QInputContext(QObject* parent)
|
||||
: QObject(*new QInputContextPrivate, parent)
|
||||
: QObject(parent)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -170,8 +172,10 @@ QInputContext::~QInputContext()
|
|||
*/
|
||||
QWidget *QInputContext::focusWidget() const
|
||||
{
|
||||
Q_D(const QInputContext);
|
||||
return d->focusWidget;
|
||||
QPlatformInputContext *ic = QGuiApplicationPrivate::platformIntegration()->inputContext();
|
||||
if (ic)
|
||||
return qobject_cast<QWidget *>(ic->focusObject());
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -186,12 +190,14 @@ QWidget *QInputContext::focusWidget() const
|
|||
void QInputContext::setFocusWidget(QWidget *widget)
|
||||
{
|
||||
Q_ASSERT(!widget || widget->testAttribute(Qt::WA_InputMethodEnabled));
|
||||
Q_D(QInputContext);
|
||||
d->focusWidget = widget;
|
||||
QPlatformInputContext *ic = QGuiApplicationPrivate::platformIntegration()->inputContext();
|
||||
if (ic)
|
||||
ic->setFocusObject(widget);
|
||||
}
|
||||
|
||||
/*!
|
||||
\fn bool QInputContext::isComposing() const
|
||||
\obsolete
|
||||
|
||||
This function indicates whether InputMethodStart event had been
|
||||
sent to the current focus widget. It is ensured that an input
|
||||
|
|
@ -298,12 +304,11 @@ void QInputContext::sendEvent(const QInputMethodEvent &event)
|
|||
QEvent::MouseMove. The event's button and state indicate
|
||||
the kind of operation that was performed.
|
||||
*/
|
||||
void QInputContext::mouseHandler(int /*x*/, QMouseEvent *event)
|
||||
void QInputContext::mouseHandler(int x, QMouseEvent *event)
|
||||
{
|
||||
// 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)
|
||||
reset();
|
||||
QPlatformInputContext *ic = QGuiApplicationPrivate::platformIntegration()->inputContext();
|
||||
if (ic)
|
||||
ic->mouseHandler(x, event);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -312,11 +317,11 @@ void QInputContext::mouseHandler(int /*x*/, QMouseEvent *event)
|
|||
*/
|
||||
QFont QInputContext::font() const
|
||||
{
|
||||
Q_D(const QInputContext);
|
||||
if (!d->focusWidget)
|
||||
QWidget *focus = focusWidget();
|
||||
if (!focus)
|
||||
return QApplication::font();
|
||||
|
||||
return qvariant_cast<QFont>(d->focusWidget->inputMethodQuery(Qt::ImFont));
|
||||
return qvariant_cast<QFont>(focus->inputMethodQuery(Qt::ImFont));
|
||||
}
|
||||
|
||||
/*!
|
||||
|
|
@ -326,6 +331,9 @@ QFont QInputContext::font() const
|
|||
*/
|
||||
void QInputContext::update()
|
||||
{
|
||||
QPlatformInputContext *ic = QGuiApplicationPrivate::platformIntegration()->inputContext();
|
||||
if (ic)
|
||||
ic->update();
|
||||
}
|
||||
|
||||
/*!
|
||||
|
|
@ -335,8 +343,7 @@ void QInputContext::update()
|
|||
*/
|
||||
void QInputContext::widgetDestroyed(QWidget *widget)
|
||||
{
|
||||
Q_D(QInputContext);
|
||||
if (widget == d->focusWidget)
|
||||
if (widget == focusWidget())
|
||||
setFocusWidget(0);
|
||||
}
|
||||
|
||||
|
|
@ -360,6 +367,12 @@ void QInputContext::widgetDestroyed(QWidget *widget)
|
|||
string and attributes; otherwise, you risk breaking input state
|
||||
consistency.
|
||||
*/
|
||||
void QInputContext::reset()
|
||||
{
|
||||
QPlatformInputContext *ic = QGuiApplicationPrivate::platformIntegration()->inputContext();
|
||||
if (ic)
|
||||
ic->reset();
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
|
|
@ -380,6 +393,10 @@ void QInputContext::widgetDestroyed(QWidget *widget)
|
|||
|
||||
\sa QInputContextPlugin::keys(), QInputContextPlugin::displayName()
|
||||
*/
|
||||
QString QInputContext::identifierName()
|
||||
{
|
||||
return QLatin1String("qpa");
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
|
|
@ -398,6 +415,10 @@ void QInputContext::widgetDestroyed(QWidget *widget)
|
|||
(that automatically modifies fonts in CJK-mixed text) and XML editor
|
||||
(that automatically inserts lang attr).
|
||||
*/
|
||||
QString QInputContext::language()
|
||||
{
|
||||
return QString();
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
|
|
|
|||
|
|
@ -82,20 +82,18 @@ class QSymbianEvent;
|
|||
class Q_WIDGETS_EXPORT QInputContext : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_DECLARE_PRIVATE(QInputContext)
|
||||
public:
|
||||
explicit QInputContext(QObject* parent = 0);
|
||||
virtual ~QInputContext();
|
||||
|
||||
virtual QString identifierName() = 0;
|
||||
virtual QString language() = 0;
|
||||
virtual QString identifierName();
|
||||
virtual QString language();
|
||||
|
||||
virtual void reset() = 0;
|
||||
virtual void reset();
|
||||
virtual void update();
|
||||
|
||||
virtual void mouseHandler( int x, QMouseEvent *event);
|
||||
virtual QFont font() const;
|
||||
virtual bool isComposing() const = 0;
|
||||
|
||||
QWidget *focusWidget() const;
|
||||
virtual void setFocusWidget( QWidget *w );
|
||||
|
|
@ -114,6 +112,9 @@ public:
|
|||
|
||||
void sendEvent(const QInputMethodEvent &event);
|
||||
|
||||
virtual bool isComposing() const { return false; }
|
||||
|
||||
private:
|
||||
enum StandardFormat {
|
||||
PreeditFormat,
|
||||
SelectionFormat
|
||||
|
|
|
|||
|
|
@ -420,21 +420,6 @@ QPlatformNativeInterface *QApplication::platformNativeInterface()
|
|||
return pi->nativeInterface();
|
||||
}
|
||||
|
||||
#ifndef QT_NO_QWS_INPUTMETHODS
|
||||
class QDummyInputContext : public QInputContext
|
||||
{
|
||||
public:
|
||||
explicit QDummyInputContext(QObject* parent = 0) : QInputContext(parent) {}
|
||||
~QDummyInputContext() {}
|
||||
QString identifierName() { return QString(); }
|
||||
QString language() { return QString(); }
|
||||
|
||||
void reset() {}
|
||||
bool isComposing() const { return false; }
|
||||
|
||||
};
|
||||
#endif // QT_NO_QWS_INPUTMETHODS
|
||||
|
||||
void qt_init(QApplicationPrivate *, int type)
|
||||
{
|
||||
Q_UNUSED(type);
|
||||
|
|
@ -445,7 +430,7 @@ void qt_init(QApplicationPrivate *, int type)
|
|||
qApp->setObjectName(appName);
|
||||
|
||||
#ifndef QT_NO_QWS_INPUTMETHODS
|
||||
qApp->setInputContext(new QDummyInputContext(qApp));
|
||||
qApp->setInputContext(new QInputContext(qApp));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -80,7 +80,7 @@
|
|||
#include "qdebug.h"
|
||||
#include "private/qstylesheetstyle_p.h"
|
||||
#include "private/qstyle_p.h"
|
||||
#include "private/qinputcontext_p.h"
|
||||
#include "qinputcontext.h"
|
||||
#include "qfileinfo.h"
|
||||
#include "private/qsoftkeymanager_p.h"
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue