Workaround quickwidget cursor position issue
This commit is contained in:
parent
306240d6da
commit
9c2654cf5f
|
@ -16,7 +16,7 @@ include(ECMSetupVersion)
|
|||
include(ECMGenerateHeaders)
|
||||
include(ECMUninstallTarget)
|
||||
|
||||
find_package(Qt5 ${REQUIRED_QT5_VERSION} CONFIG REQUIRED Core DBus Widgets X11Extras)
|
||||
find_package(Qt5 ${REQUIRED_QT5_VERSION} CONFIG REQUIRED Core DBus Widgets X11Extras QuickWidgets)
|
||||
find_package(XCB REQUIRED COMPONENTS XCB)
|
||||
find_package(Qt5Gui ${REQUIRED_QT5_VERSION} REQUIRED Private)
|
||||
find_package(XKBCommon 0.5.0 REQUIRED COMPONENTS XKBCommon)
|
||||
|
|
|
@ -24,6 +24,7 @@ target_link_libraries(fcitx5platforminputcontextplugin
|
|||
Qt5::Gui
|
||||
Qt5::DBus
|
||||
Qt5::X11Extras
|
||||
Qt5::QuickWidgets
|
||||
XCB::XCB
|
||||
Fcitx5::Utils
|
||||
Fcitx5Qt5::DBusAddons
|
||||
|
|
|
@ -18,10 +18,13 @@
|
|||
*/
|
||||
|
||||
#include <QDBusConnection>
|
||||
#include <QDebug>
|
||||
#include <QGuiApplication>
|
||||
#include <QInputMethod>
|
||||
#include <QKeyEvent>
|
||||
#include <QPalette>
|
||||
#include <QQuickItem>
|
||||
#include <QQuickWidget>
|
||||
#include <QTextCharFormat>
|
||||
#include <QTextCodec>
|
||||
#include <QWindow>
|
||||
|
@ -379,6 +382,22 @@ void QFcitxPlatformInputContext::cursorRectChanged() {
|
|||
return;
|
||||
}
|
||||
|
||||
// QQuickWidget workaround.
|
||||
auto obj = qApp->focusObject();
|
||||
if (auto quickwidget = qobject_cast<QQuickWidget *>(obj)) {
|
||||
auto realObj = quickwidget->quickWindow()->focusObject();
|
||||
|
||||
if (auto quickitem = qobject_cast<QQuickItem *>(realObj)) {
|
||||
QInputMethodQueryEvent query(Qt::ImCursorRectangle);
|
||||
QGuiApplication::sendEvent(realObj, &query);
|
||||
auto rect = query.value(Qt::ImCursorRectangle).toRectF();
|
||||
r = qApp->inputMethod()
|
||||
->inputItemTransform()
|
||||
.mapRect(quickitem->mapRectToScene(rect))
|
||||
.toRect();
|
||||
}
|
||||
}
|
||||
|
||||
qreal scale = inputWindow->devicePixelRatio();
|
||||
auto screenGeometry = inputWindow->screen()->geometry();
|
||||
auto point = inputWindow->mapToGlobal(r.topLeft());
|
||||
|
|
Loading…
Reference in New Issue