File N_fix-dpi-values.diff of Package xorg-x11-server

From: Egbert Eich <eich@suse.de>

Fix calculation of DPI using mode data if present.

Index: hw/xfree86/common/xf86Helper.c
===================================================================
--- hw/xfree86/common/xf86Helper.c.orig
+++ hw/xfree86/common/xf86Helper.c
@@ -875,12 +875,22 @@ xf86SetDpi(ScrnInfoPtr pScrn, int x, int
     else if (pScrn->widthmm > 0 || pScrn->heightmm > 0) {
         from = X_CONFIG;
         if (pScrn->widthmm > 0) {
-            pScrn->xDpi =
-                (int) ((double) pScrn->virtualX * MMPERINCH / pScrn->widthmm);
+	    if (pScrn->modes && pScrn->modes->HDisplay > 0) {
+		pScrn->xDpi =
+		    (int)((double) pScrn->modes->HDisplay * MMPERINCH / pScrn->widthmm);
+	    } else {
+	        pScrn->xDpi =
+                    (int)((double)pScrn->virtualX * MMPERINCH / pScrn->widthmm);
+	    }
         }
         if (pScrn->heightmm > 0) {
-            pScrn->yDpi =
-                (int) ((double) pScrn->virtualY * MMPERINCH / pScrn->heightmm);
+            if (pScrn->modes && pScrn->modes->VDisplay > 0) {
+	        pScrn->yDpi =
+		    (int)((double)pScrn->modes->VDisplay * MMPERINCH / pScrn->heightmm);
+	    } else {
+	        pScrn->yDpi =
+                (int)((double)pScrn->virtualY * MMPERINCH / pScrn->heightmm);
+	    }
         }
         if (pScrn->xDpi > 0 && pScrn->yDpi <= 0)
             pScrn->yDpi = pScrn->xDpi;
@@ -919,12 +929,22 @@ xf86SetDpi(ScrnInfoPtr pScrn, int x, int
         pScrn->widthmm = ddcWidthmm;
         pScrn->heightmm = ddcHeightmm;
         if (pScrn->widthmm > 0) {
-            pScrn->xDpi =
-                (int) ((double) pScrn->virtualX * MMPERINCH / pScrn->widthmm);
+		if (pScrn->modes && pScrn->modes->HDisplay > 0) {
+			pScrn->xDpi =
+				(int)((double) pScrn->modes->HDisplay * MMPERINCH / pScrn->widthmm);
+		} else {
+			pScrn->xDpi =
+				(int)((double)pScrn->virtualX * MMPERINCH / pScrn->widthmm);
+		}
         }
         if (pScrn->heightmm > 0) {
-            pScrn->yDpi =
-                (int) ((double) pScrn->virtualY * MMPERINCH / pScrn->heightmm);
+		if (pScrn->modes && pScrn->modes->VDisplay > 0) {
+			pScrn->yDpi =
+				(int)((double)pScrn->modes->VDisplay * MMPERINCH / pScrn->heightmm);
+		} else {
+			pScrn->yDpi =
+				(int)((double)pScrn->virtualY * MMPERINCH / pScrn->heightmm);
+		}
         }
         if (pScrn->xDpi > 0 && pScrn->yDpi <= 0)
             pScrn->yDpi = pScrn->xDpi;