Sorry, just realized that I forgot to cc Marc-André :D. Here is a description of the issue this patch is trying to solve:
-------------------------- How to reproduce the issue -------------------------- Launch the guest with gtk backed virtual display using command like IMAGE_FOLDER=$HOME/workspace/images/fedora DISK_PATH=$IMAGE_FOLDER/rootfs.qcow2 UEFI_CODE_PATH=$IMAGE_FOLDER/OVMF_CODE.fd UEFI_DATA_PATH=$IMAGE_FOLDER/OVMF_VARS.fd ISO_PATH=$IMAGE_FOLDER/Fedora-Workstation-Live-42-1.1.x86_64.iso MEM=4G $QEMU \ -enable-kvm \ -M q35 \ -object memory-backend-memfd,id=mem1,size=$MEM \ -machine memory-backend=mem1 \ -smp 4 \ -cpu host \ -boot order=c,menu=on,splash-time=3 \ -cdrom $ISO_PATH \ -drive if=pflash,format=raw,readonly=on,file=$UEFI_CODE_PATH \ -drive if=pflash,format=raw,file=$UEFI_DATA_PATH \ -hda $DISK_PATH \ -display gtk,gl=on,show-cursor=on \ -device virtio-vga-gl,venus=false,blob=true,hostmem=$MEM \ -usb -device usb-tablet When guest GUI is ready, click the guest display and we are likely to find that the cursor coordinates are incorrectly reported to the guest with an offset. ------------------ Cause of the issue ------------------ There is a mapping from the gtk glarea widget coordinates to the guest display coordinates, and the scale factor plays an essential role in the calculation. However, the scale factor defaults to 1 and is not updated to reflect the fact on startup, rendering incorrect cursor coordinates. Best regards, Weifeng On Sat, 2025-04-19 at 17:48 +0800, Weifeng Liu wrote: > On startup, scale_x and scale_y were set to 1 that didn't reflect the > real situation of the scan-out, resulting in incorrect cursor > coordinates to be sent when moving the mouse pointer. Simply updating > the scales before rendering the image fixes this issue. > > Cc: hikalium <hikal...@hikalium.com> > Cc: Alexander Orzechowski <orzechowski.alexan...@gmail.com> > Cc: Gerd Hoffmann <kra...@redhat.com> > Signed-off-by: Weifeng Liu <weifeng.li...@gmail.com> > --- > ui/gtk-gl-area.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/ui/gtk-gl-area.c b/ui/gtk-gl-area.c > index 2c9a0db425..01235f876a 100644 > --- a/ui/gtk-gl-area.c > +++ b/ui/gtk-gl-area.c > @@ -42,6 +42,7 @@ void gd_gl_area_draw(VirtualConsole *vc) > #ifdef CONFIG_GBM > QemuDmaBuf *dmabuf = vc->gfx.guest_fb.dmabuf; > #endif > + int fbw, fbh; > int ww, wh, ws, y1, y2; > > if (!vc->gfx.gls) { > @@ -53,6 +54,11 @@ void gd_gl_area_draw(VirtualConsole *vc) > ww = gtk_widget_get_allocated_width(vc->gfx.drawing_area) * ws; > wh = gtk_widget_get_allocated_height(vc->gfx.drawing_area) * ws; > > + fbw = surface_width(vc->gfx.ds); > + fbh = surface_height(vc->gfx.ds); > + vc->gfx.scale_x = (double)ww / fbw / ws; > + vc->gfx.scale_y = (double)wh / fbh / ws; > + > if (vc->gfx.scanout_mode) { > if (!vc->gfx.guest_fb.framebuffer) { > return;