diff mbox series

[2/3] Fix issue #761: Broken scaling with gtk, gl=on on a hidpi display

Message ID 20230220101342.129689-2-liuyujun@fingera.cn
State New
Headers show
Series [1/3] This reverts commit f14aab420c58b57e07189d6d9e6d3fbfab4761a6. | expand

Commit Message

liuyujun Feb. 20, 2023, 10:13 a.m. UTC
Signed-off-by: Yujun <liuyujun@fingera.cn>
---
 ui/gtk-egl.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)
diff mbox series

Patch

diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c
index e84431790c..15b3d64233 100644
--- a/ui/gtk-egl.c
+++ b/ui/gtk-egl.c
@@ -66,13 +66,14 @@  void gd_egl_draw(VirtualConsole *vc)
 #ifdef CONFIG_GBM
     QemuDmaBuf *dmabuf = vc->gfx.guest_fb.dmabuf;
 #endif
-    int ww, wh;
+    int ww, wh, ws;
 
     if (!vc->gfx.gls) {
         return;
     }
 
     window = gtk_widget_get_window(vc->gfx.drawing_area);
+    ws = gdk_window_get_scale_factor(gtk_widget_get_window(vc->gfx.drawing_area));
     ww = gdk_window_get_width(window);
     wh = gdk_window_get_height(window);
 
@@ -109,13 +110,22 @@  void gd_egl_draw(VirtualConsole *vc)
         eglMakeCurrent(qemu_egl_display, vc->gfx.esurface,
                        vc->gfx.esurface, vc->gfx.ectx);
 
-        surface_gl_setup_viewport(vc->gfx.gls, vc->gfx.ds, ww, wh);
+        surface_gl_setup_viewport(vc->gfx.gls, vc->gfx.ds, ww * ws, wh * ws);
         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);
+        if (vc->s->full_screen) {
+            vc->gfx.scale_x = (double)ww / surface_width(vc->gfx.ds);
+            vc->gfx.scale_y = (double)wh / surface_height(vc->gfx.ds);
+        } else if (vc->s->free_scale) {
+            double sx, sy;
+
+            sx = (double)ww / surface_width(vc->gfx.ds);
+            sy = (double)wh / surface_height(vc->gfx.ds);
+
+            vc->gfx.scale_x = vc->gfx.scale_y = MIN(sx, sy);
+        }
 
         glFlush();
     }