83 lines
2.9 KiB
Diff
83 lines
2.9 KiB
Diff
|
|
From 2e5fd7f2e6027899e84984bc31f52d4dda3b89ed Mon Sep 17 00:00:00 2001
|
||
|
|
From: qihao <qihao_yewu@cmss.chinamobile.com>
|
||
|
|
Date: Tue, 21 May 2024 14:35:19 +0800
|
||
|
|
Subject: [PATCH] ui/gtk: Fix mouse/motion event scaling issue with GTK display
|
||
|
|
backend
|
||
|
|
MIME-Version: 1.0
|
||
|
|
Content-Type: text/plain; charset=UTF-8
|
||
|
|
Content-Transfer-Encoding: 8bit
|
||
|
|
|
||
|
|
cheery-pick from 37e91415018db3656b46cdea8f9e4d47b3ff130d
|
||
|
|
|
||
|
|
Remove gtk_widget_get_scale_factor() usage from the calculation of
|
||
|
|
the motion events in the GTK backend to make it work correctly on
|
||
|
|
environments that have `gtk_widget_get_scale_factor() != 1`.
|
||
|
|
|
||
|
|
This scale factor usage had been introduced in the commit f14aab420c and
|
||
|
|
at that time the window size was used for calculating the things and it
|
||
|
|
was working correctly. However, in the commit 2f31663ed4 the logic
|
||
|
|
switched to use the widget size instead of window size and because of
|
||
|
|
the change the usage of scale factor becomes invalid (since widgets use
|
||
|
|
`vc->gfx.scale_{x, y}` for scaling).
|
||
|
|
|
||
|
|
Tested on Crostini on ChromeOS (15823.51.0) with an external display.
|
||
|
|
|
||
|
|
Fixes: 2f31663ed4 ("ui/gtk: use widget size for cursor motion event")
|
||
|
|
Fixes: f14aab420c ("ui: fix incorrect pointer position on highdpi with
|
||
|
|
gtk")
|
||
|
|
|
||
|
|
Signed-off-by: hikalium <hikalium@hikalium.com>
|
||
|
|
Acked-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||
|
|
Message-Id: <20240512111435.30121-3-hikalium@hikalium.com>
|
||
|
|
Signed-off-by: qihao_yewu <qihao_yewu@cmss.chinamobile.com>
|
||
|
|
---
|
||
|
|
ui/gtk.c | 17 +++++++++++++----
|
||
|
|
1 file changed, 13 insertions(+), 4 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/ui/gtk.c b/ui/gtk.c
|
||
|
|
index 810d7fc796..1a69f6fc37 100644
|
||
|
|
--- a/ui/gtk.c
|
||
|
|
+++ b/ui/gtk.c
|
||
|
|
@@ -887,7 +887,7 @@ static gboolean gd_motion_event(GtkWidget *widget, GdkEventMotion *motion,
|
||
|
|
int x, y;
|
||
|
|
int mx, my;
|
||
|
|
int fbh, fbw;
|
||
|
|
- int ww, wh, ws;
|
||
|
|
+ int ww, wh;
|
||
|
|
|
||
|
|
if (!vc->gfx.ds) {
|
||
|
|
return TRUE;
|
||
|
|
@@ -898,8 +898,13 @@ static gboolean gd_motion_event(GtkWidget *widget, GdkEventMotion *motion,
|
||
|
|
|
||
|
|
ww = gtk_widget_get_allocated_width(widget);
|
||
|
|
wh = gtk_widget_get_allocated_height(widget);
|
||
|
|
- ws = gtk_widget_get_scale_factor(widget);
|
||
|
|
|
||
|
|
+ /*
|
||
|
|
+ * `widget` may not have the same size with the frame buffer.
|
||
|
|
+ * In such cases, some paddings are needed around the `vc`.
|
||
|
|
+ * To achieve that, `vc` will be displayed at (mx, my)
|
||
|
|
+ * so that it is displayed at the center of the widget.
|
||
|
|
+ */
|
||
|
|
mx = my = 0;
|
||
|
|
if (ww > fbw) {
|
||
|
|
mx = (ww - fbw) / 2;
|
||
|
|
@@ -908,8 +913,12 @@ static gboolean gd_motion_event(GtkWidget *widget, GdkEventMotion *motion,
|
||
|
|
my = (wh - fbh) / 2;
|
||
|
|
}
|
||
|
|
|
||
|
|
- x = (motion->x - mx) / vc->gfx.scale_x * ws;
|
||
|
|
- y = (motion->y - my) / vc->gfx.scale_y * ws;
|
||
|
|
+ /*
|
||
|
|
+ * `motion` is reported in `widget` coordinates
|
||
|
|
+ * so translating it to the coordinates in `vc`.
|
||
|
|
+ */
|
||
|
|
+ x = (motion->x - mx) / vc->gfx.scale_x;
|
||
|
|
+ y = (motion->y - my) / vc->gfx.scale_y;
|
||
|
|
|
||
|
|
if (qemu_input_is_absolute(vc->gfx.dcl.con)) {
|
||
|
|
if (x < 0 || y < 0 ||
|
||
|
|
--
|
||
|
|
2.41.0.windows.1
|
||
|
|
|