summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2022-12-06 13:01:29 +0100
committerLiang Qi <liang.qi@qt.io>2023-01-03 12:07:44 +0100
commit3790821b220ff6ab3c51a5c0b35581c00bc4e84d (patch)
treefeb42bece49cfa80175c1901e8d540fbf98d6ed6
parent54002671bd68b1c59b61a630c9333b2aab286483 (diff)
ibus: support high dpi for cursor rectangle
on both X11/xcb and Wayland. Following similar approach in QFcitxPlatformInputContext::cursorRectChanged() https://github.com/fcitx/fcitx5-qt/blob/master/qt5/platforminputcontext/qfcitxplatforminputcontext.cpp#L490-L532 Tested with following configurations: * GNOME on xorg, 100%/125%/150%/200% scale, 1 and 2 monitors * KDE/Plasma X11, 100%/150%/200% scale, 1 monitor * GNOME on Wayland, 100%/200% scale, 1 and 2 monitors Enable fractional scale on GNOME: gsettings set org.gnome.mutter experimental-features "['scale-monitor-framebuffer']" Pick-to: 6.5 6.4 6.2 5.15 Fixes: QTBUG-103393 Change-Id: Idfd3153e4cd9f9530b4db6f089830ec47451a19e Reviewed-by: Ilya Fedin <fedin-ilja2010@ya.ru> Reviewed-by: Weng Xuetian <wengxt@gmail.com> Reviewed-by: Liang Qi <liang.qi@qt.io>
-rw-r--r--src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp27
1 files changed, 24 insertions, 3 deletions
diff --git a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp
index 0860254726..49a44519b6 100644
--- a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp
+++ b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp
@@ -222,10 +222,31 @@ void QIBusPlatformInputContext::cursorRectChanged()
QWindow *inputWindow = qApp->focusWindow();
if (!inputWindow)
return;
- r.moveTopLeft(inputWindow->mapToGlobal(r.topLeft()));
+ if (!inputWindow->screen())
+ return;
+
+ if (QGuiApplication::platformName().startsWith("wayland"_L1)) {
+ auto margins = inputWindow->frameMargins();
+ r.translate(margins.left(), margins.top());
+ qreal scale = inputWindow->devicePixelRatio();
+ QRect newRect = QRect(r.x() * scale, r.y() * scale, r.width() * scale, r.height() * scale);
+ if (debug)
+ qDebug() << "microFocus" << newRect;
+ d->context->SetCursorLocationRelative(newRect.x(), newRect.y(),
+ newRect.width(), newRect.height());
+ return;
+ }
+
+ // x11/xcb
+ auto screenGeometry = inputWindow->screen()->geometry();
+ auto point = inputWindow->mapToGlobal(r.topLeft());
+ qreal scale = inputWindow->devicePixelRatio();
+ auto native = (point - screenGeometry.topLeft()) * scale + screenGeometry.topLeft();
+ QRect newRect(native, r.size() * scale);
if (debug)
- qDebug() << "microFocus" << r;
- d->context->SetCursorLocation(r.x(), r.y(), r.width(), r.height());
+ qDebug() << "microFocus" << newRect;
+ d->context->SetCursorLocation(newRect.x(), newRect.y(),
+ newRect.width(), newRect.height());
}
void QIBusPlatformInputContext::setFocusObject(QObject *object)