]> source.dussan.org Git - tigervnc.git/commitdiff
Maintain static screen DPI on resize
authorPierre Ossman <ossman@cendio.se>
Thu, 1 Nov 2018 09:19:15 +0000 (10:19 +0100)
committerPierre Ossman <ossman@cendio.se>
Thu, 8 Apr 2021 13:43:28 +0000 (15:43 +0200)
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
unix/xserver/hw/vnc/RandrGlue.c

index ff12902fdd8ee7373c16558c4ce53ca976dbd12b..c26ac6adf5c7d51cb7f47b93c90cc0d2b45003f1 100644 (file)
@@ -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;
 }
index 82e85524faf951529aae83b282685a5ea44340d6..a291688828ee391435275eb638c4737c3a1f7c27 100644 (file)
@@ -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)