On Wed, Oct 31, 2018 at 06:24:56AM +0000, Chen Zhang wrote: > The issue was reported as in https://bugs.launchpad.net/qemu/+bug/1793859 > > When an OpenGL accelerated GTK window is used for iGVT-g DMA Buf device, > window scaling would cause guest cursor to move in undesirable velocity. > > To fix this usability issue, the gtk mouse motion events was modified to > scale the position of event to match the coordinates of the scaled GL > surface.
Hmm, we already have logic in place to deal with that. I suspect the root cause is simply that the scale_{x,y} variables are not set properly in egl mode. Can you try the patch below? thanks, Gerd ========================== [ cut here ] =========================== >From ebecaab0102aca37a3101131c20f45576835b6b3 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann <kra...@redhat.com> Date: Tue, 6 Nov 2018 13:18:39 +0100 Subject: [PATCH] try fix gtk egl cursor --- ui/gtk-egl.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c index a77c25b490..5420c2362b 100644 --- a/ui/gtk-egl.c +++ b/ui/gtk-egl.c @@ -68,8 +68,15 @@ void gd_egl_draw(VirtualConsole *vc) return; } + window = gtk_widget_get_window(vc->gfx.drawing_area); + ww = gdk_window_get_width(window); + wh = gdk_window_get_height(window); + if (vc->gfx.scanout_mode) { gd_egl_scanout_flush(&vc->gfx.dcl, 0, 0, vc->gfx.w, vc->gfx.h); + + vc->gfx.scale_x = (double)ww / vc->gfx.w; + vc->gfx.scale_y = (double)wh / vc->gfx.h; } else { if (!vc->gfx.ds) { return; @@ -77,13 +84,13 @@ void gd_egl_draw(VirtualConsole *vc) eglMakeCurrent(qemu_egl_display, vc->gfx.esurface, vc->gfx.esurface, vc->gfx.ectx); - window = gtk_widget_get_window(vc->gfx.drawing_area); - ww = gdk_window_get_width(window); - wh = gdk_window_get_height(window); surface_gl_setup_viewport(vc->gfx.gls, vc->gfx.ds, ww, wh); surface_gl_render_texture(vc->gfx.gls, vc->gfx.ds); eglSwapBuffers(qemu_egl_display, vc->gfx.esurface); + + vc->gfx.scale_x = (double)ww / surface_width(vc->gfx.ds); + vc->gfx.scale_y = (double)wh / surface_height(vc->gfx.ds); } } @@ -232,8 +239,8 @@ void gd_egl_cursor_position(DisplayChangeListener *dcl, { VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl); - vc->gfx.cursor_x = pos_x; - vc->gfx.cursor_y = pos_y; + vc->gfx.cursor_x = pos_x * vc->gfx.scale_x; + vc->gfx.cursor_y = pos_y * vc->gfx.scale_y; } void gd_egl_release_dmabuf(DisplayChangeListener *dcl, -- 2.9.3