From 0946e298075f8f7b6d63e552297a787c5f84d27c Mon Sep 17 00:00:00 2001 From: Pierre Ossman Date: Thu, 1 Nov 2018 10:19:15 +0100 Subject: [PATCH] Maintain static screen DPI on resize Trying to dynamically track the DPI did not really work as we'd start accumulating errors and eventually the DPI would start to drift. Instead maintain a fixed, sensible DPI at all times. --- unix/x0vncserver/RandrGlue.c | 18 +++++++++--------- unix/xserver/hw/vnc/RandrGlue.c | 11 +++++++---- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/unix/x0vncserver/RandrGlue.c b/unix/x0vncserver/RandrGlue.c index ff12902f..c26ac6ad 100644 --- a/unix/x0vncserver/RandrGlue.c +++ b/unix/x0vncserver/RandrGlue.c @@ -117,15 +117,15 @@ int vncRandRResizeScreen(int width, int height) { vncGlueContext *ctx = &randrGlueContext; - int xwidth = DisplayWidth(ctx->dpy, DefaultScreen(ctx->dpy)); - int xheight = DisplayHeight(ctx->dpy, DefaultScreen(ctx->dpy)); - int xwidthmm = DisplayWidthMM(ctx->dpy, DefaultScreen(ctx->dpy)); - int xheightmm = DisplayHeightMM(ctx->dpy, DefaultScreen(ctx->dpy)); - - /* Try to retain DPI when we resize */ - XRRSetScreenSize(ctx->dpy, DefaultRootWindow(ctx->dpy), width, height, - xwidthmm * width / xwidth, - xheightmm * height / xheight); + int mwidth, mheight; + + // Always calculate a DPI of 96. + // It's what mutter does, so good enough for us. + mwidth = width * 254 / 96 / 10; + mheight = height * 254 / 96 / 10; + + XRRSetScreenSize(ctx->dpy, DefaultRootWindow(ctx->dpy), + width, height, mwidth, mheight); return 1; } diff --git a/unix/xserver/hw/vnc/RandrGlue.c b/unix/xserver/hw/vnc/RandrGlue.c index 82e85524..a2916888 100644 --- a/unix/xserver/hw/vnc/RandrGlue.c +++ b/unix/xserver/hw/vnc/RandrGlue.c @@ -64,11 +64,14 @@ int vncRandRIsValidScreenSize(int width, int height) int vncRandRResizeScreen(int width, int height) { ScreenPtr pScreen = screenInfo.screens[scrIdx]; + int dpi, mwidth, mheight; - /* Try to retain DPI when we resize */ - return RRScreenSizeSet(pScreen, width, height, - pScreen->mmWidth * width / pScreen->width, - pScreen->mmHeight * height / pScreen->height); + /* Keep the DPI specified at start */ + dpi = monitorResolution ? monitorResolution : 96; + mwidth = width * 254 / dpi / 10; + mheight = height * 254 / dpi / 10; + + return RRScreenSizeSet(pScreen, width, height, mwidth, mheight); } void vncRandRUpdateSetTime(void) -- 2.39.5