mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
ui/gtk: Fix mouse/motion event scaling issue with GTK display backend
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 commitf14aab420c
and at that time the window size was used for calculating the things and it was working correctly. However, in the commit2f31663ed4
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>
This commit is contained in:
parent
36b8e6b4e1
commit
37e9141501
1 changed files with 13 additions and 5 deletions
18
ui/gtk.c
18
ui/gtk.c
|
@ -891,7 +891,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;
|
||||
|
@ -899,11 +899,15 @@ static gboolean gd_motion_event(GtkWidget *widget, GdkEventMotion *motion,
|
|||
|
||||
fbw = surface_width(vc->gfx.ds) * vc->gfx.scale_x;
|
||||
fbh = surface_height(vc->gfx.ds) * vc->gfx.scale_y;
|
||||
|
||||
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;
|
||||
|
@ -912,8 +916,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;
|
||||
|
||||
trace_gd_motion_event(ww, wh, gtk_widget_get_scale_factor(widget), x, y);
|
||||
|
||||
|
|
Loading…
Reference in a new issue