aboutsummaryrefslogtreecommitdiff
path: root/ui/gtk-egl.c
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2018-11-07 08:49:49 +0100
committerGerd Hoffmann <kraxel@redhat.com>2018-11-12 14:15:54 +0100
commitf1aba960cc40ab65fa88c8678883bd2201708c55 (patch)
tree42b1a607bb0344a175db395425f9ac6d825b9faf /ui/gtk-egl.c
parent6cdc2d189cb60a9d13e2d975b3fdb12eb00885cc (diff)
downloadqemu-f1aba960cc40ab65fa88c8678883bd2201708c55.zip
qemu-f1aba960cc40ab65fa88c8678883bd2201708c55.tar.gz
qemu-f1aba960cc40ab65fa88c8678883bd2201708c55.tar.bz2
ui/gtk: fix cursor in egl mode
In egl mode the scale_x and scale_y variables are not set, so the scaling logic in the mouse motion event handler does not work. Fix that. Also scale the cursor position in gd_egl_cursor_position(). Reported-by: Chen Zhang <tgfbeta@icloud.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Tested-by: Chen Zhang <tgfbeta@icloud.com> Message-id: 20181107074949.13805-1-kraxel@redhat.com
Diffstat (limited to 'ui/gtk-egl.c')
-rw-r--r--ui/gtk-egl.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c
index a77c25b..5420c23 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,