diff options
author | Zeno Albisser <zeno.albisser@digia.com> | 2014-02-07 13:07:29 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-02-08 11:35:31 +0100 |
commit | 19715fbc5bbaf03506372b38b6c2e34d759faee3 (patch) | |
tree | 3d058c9d1936f6d19f2f3b222a688f8a6902b7a5 /src | |
parent | 8ca06a55c074b9bf2509b6ec7b15d073030e5e40 (diff) |
Implement basic support for input method events.
This is needed to get text input working again on Mac.
Underlines are currently being ignored.
Change-Id: I2a1074a1151e9be6f96ebe12fd0bb40a0eb63d6a
Reviewed-by: Zeno Albisser <zeno.albisser@digia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/core/render_widget_host_view_qt.cpp | 20 | ||||
-rw-r--r-- | src/core/render_widget_host_view_qt.h | 1 | ||||
-rw-r--r-- | src/core/render_widget_host_view_qt_delegate.h | 1 | ||||
-rw-r--r-- | src/webengine/render_widget_host_view_qt_delegate_quick.h | 5 |
4 files changed, 27 insertions, 0 deletions
diff --git a/src/core/render_widget_host_view_qt.cpp b/src/core/render_widget_host_view_qt.cpp index 9279c57b0..4fb9a1fed 100644 --- a/src/core/render_widget_host_view_qt.cpp +++ b/src/core/render_widget_host_view_qt.cpp @@ -62,6 +62,7 @@ #include <QEvent> #include <QFocusEvent> #include <QGuiApplication> +#include <QInputMethodEvent> #include <QKeyEvent> #include <QMouseEvent> #include <QScreen> @@ -703,6 +704,9 @@ bool RenderWidgetHostViewQt::forwardEvent(QEvent *event) case QEvent::FocusOut: handleFocusEvent(static_cast<QFocusEvent*>(event)); break; + case QEvent::InputMethod: + handleInputMethodEvent(static_cast<QInputMethodEvent*>(event)); + break; default: return false; } @@ -850,6 +854,22 @@ void RenderWidgetHostViewQt::handleKeyEvent(QKeyEvent *ev) m_host->ForwardKeyboardEvent(WebEventFactory::toWebKeyboardEvent(ev)); } +void RenderWidgetHostViewQt::handleInputMethodEvent(QInputMethodEvent *ev) +{ + if (!m_host) + return; + + if (ev->commitString().length()) + m_host->ImeConfirmComposition(toString16(ev->commitString()), gfx::Range::InvalidRange(), false); + + if (ev->preeditString().length()) { + // FIXME: Implement translation from QInputMethodEvent::Attribute list to WebKit::WebCompositionUnderlines. + std::vector<WebKit::WebCompositionUnderline> underlines; + int start = ev->replacementStart(); + m_host->ImeSetComposition(toString16(ev->preeditString()), underlines, start, start + ev->replacementLength()); + } +} + void RenderWidgetHostViewQt::handleWheelEvent(QWheelEvent *ev) { m_host->ForwardWheelEvent(WebEventFactory::toWebWheelEvent(ev, dpiScale())); diff --git a/src/core/render_widget_host_view_qt.h b/src/core/render_widget_host_view_qt.h index 861315e8a..5591be190 100644 --- a/src/core/render_widget_host_view_qt.h +++ b/src/core/render_widget_host_view_qt.h @@ -180,6 +180,7 @@ public: void handleTouchEvent(QTouchEvent*); void handleHoverEvent(QHoverEvent*); void handleFocusEvent(QFocusEvent*); + void handleInputMethodEvent(QInputMethodEvent*); #if defined(OS_MACOSX) virtual void SetTakesFocusOnlyOnMouseDown(bool flag) Q_DECL_OVERRIDE { QT_NOT_YET_IMPLEMENTED } diff --git a/src/core/render_widget_host_view_qt_delegate.h b/src/core/render_widget_host_view_qt_delegate.h index 7ed895f0b..a780335ef 100644 --- a/src/core/render_widget_host_view_qt_delegate.h +++ b/src/core/render_widget_host_view_qt_delegate.h @@ -55,6 +55,7 @@ class QQuickWindow; class QSGNode; class QVariant; class QWindow; +class QInputMethodEvent; QT_END_NAMESPACE class WebContentsAdapterClient; diff --git a/src/webengine/render_widget_host_view_qt_delegate_quick.h b/src/webengine/render_widget_host_view_qt_delegate_quick.h index 9c7bba35e..9dbe79941 100644 --- a/src/webengine/render_widget_host_view_qt_delegate_quick.h +++ b/src/webengine/render_widget_host_view_qt_delegate_quick.h @@ -202,6 +202,11 @@ public: return m_client->inputMethodQuery(query); } + virtual void inputMethodEvent(QInputMethodEvent *event) Q_DECL_OVERRIDE + { + m_client->forwardEvent(event); + } + protected: void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) { |