diff options
Diffstat (limited to 'src/client/qwaylandtextinputv2.cpp')
-rw-r--r-- | src/client/qwaylandtextinputv2.cpp | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/src/client/qwaylandtextinputv2.cpp b/src/client/qwaylandtextinputv2.cpp index 402f5b557..9d462f7d6 100644 --- a/src/client/qwaylandtextinputv2.cpp +++ b/src/client/qwaylandtextinputv2.cpp @@ -11,6 +11,7 @@ #include <QtCore/qloggingcategory.h> #include <QtGui/QGuiApplication> #include <QtGui/private/qguiapplication_p.h> +#include <QtGui/private/qhighdpiscaling_p.h> #include <QtGui/qpa/qplatformintegration.h> #include <QtGui/qevent.h> #include <QtGui/qwindow.h> @@ -27,7 +28,7 @@ namespace QtWaylandClient { namespace { -const Qt::InputMethodQueries supportedQueries = Qt::ImEnabled | +const Qt::InputMethodQueries supportedQueries2 = Qt::ImEnabled | Qt::ImSurroundingText | Qt::ImCursorPosition | Qt::ImAnchorPosition | @@ -46,6 +47,7 @@ QWaylandTextInputv2::~QWaylandTextInputv2() { if (m_resetCallback) wl_callback_destroy(m_resetCallback); + destroy(); } void QWaylandTextInputv2::reset() @@ -58,9 +60,14 @@ void QWaylandTextInputv2::reset() void QWaylandTextInputv2::commit() { if (QObject *o = QGuiApplication::focusObject()) { - QInputMethodEvent event; - event.setCommitString(m_preeditCommit); - QCoreApplication::sendEvent(o, &event); + if (!m_preeditCommit.isEmpty()) { + + QInputMethodEvent event; + event.setCommitString(m_preeditCommit); + m_preeditCommit = QString(); + + QCoreApplication::sendEvent(o, &event); + } } reset(); @@ -93,7 +100,7 @@ void QWaylandTextInputv2::updateState(Qt::InputMethodQueries queries, uint32_t f if (!surface || (surface != m_surface)) return; - queries &= supportedQueries; + queries &= supportedQueries2; // Surrounding text, cursor and anchor positions are transferred together if ((queries & Qt::ImSurroundingText) || (queries & Qt::ImCursorPosition) || (queries & Qt::ImAnchorPosition)) @@ -128,8 +135,9 @@ void QWaylandTextInputv2::updateState(Qt::InputMethodQueries queries, uint32_t f if (queries & Qt::ImCursorRectangle) { const QRect &cRect = event.value(Qt::ImCursorRectangle).toRect(); const QRect &windowRect = QGuiApplication::inputMethod()->inputItemTransform().mapRect(cRect); - const QMargins margins = window->frameMargins(); - const QRect &surfaceRect = windowRect.translated(margins.left(), margins.top()); + const QRect &nativeRect = QHighDpi::toNativePixels(windowRect, QGuiApplication::focusWindow()); + const QMargins margins = window->clientSideMargins(); + const QRect &surfaceRect = nativeRect.translated(margins.left(), margins.top()); set_cursor_rectangle(surfaceRect.x(), surfaceRect.y(), surfaceRect.width(), surfaceRect.height()); } |