1 From 1557c71c858c7e16a54f959135faa1620cad11ab Mon Sep 17 00:00:00 2001
2 From: Nick Bowler <nbowler@draconx.ca>
3 Date: Wed, 6 Jan 2010 10:42:17 -0500
4 Subject: [PATCH] xfree86: Add DontLie server flag.
6 Since commit fff00df94d7ebd18a8e24537ec96073717375a3f, RandR 1.2 drivers
7 lie about the resolution of the attached screen by default. When the
8 reported resolution is wrong, fonts and other UI elements that use
9 physical units are not sized correctly.
11 This patch adds a new server flag, DontLie, which encourages the server
12 to be honest by default.
14 Signed-off-by: Nick Bowler <nbowler@draconx.ca>
16 hw/xfree86/common/xf86Config.c | 6 +++++-
17 hw/xfree86/common/xf86Globals.c | 1 +
18 hw/xfree86/common/xf86Privstr.h | 2 ++
19 hw/xfree86/doc/man/xorg.conf.man.pre | 6 ++++++
20 hw/xfree86/modes/xf86RandR12.c | 12 ++++++++++++
21 5 files changed, 26 insertions(+), 1 deletions(-)
23 diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
24 index 1e9543f..eb0b23e 100644
25 --- a/hw/xfree86/common/xf86Config.c
26 +++ b/hw/xfree86/common/xf86Config.c
27 @@ -715,7 +715,8 @@ typedef enum {
28 FLAG_AUTO_ENABLE_DEVICES,
37 @@ -779,6 +780,8 @@ static OptionInfoRec FlagOptions[] = {
39 { FLAG_USE_SIGIO, "UseSIGIO", OPTV_BOOLEAN,
41 + { FLAG_DONTLIE, "DontLie", OPTV_BOOLEAN,
43 { -1, NULL, OPTV_NONE,
46 @@ -836,6 +839,7 @@ configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts)
47 xf86GetOptValBool(FlagOptions, FLAG_DONTVTSWITCH, &xf86Info.dontVTSwitch);
48 xf86GetOptValBool(FlagOptions, FLAG_DONTZAP, &xf86Info.dontZap);
49 xf86GetOptValBool(FlagOptions, FLAG_DONTZOOM, &xf86Info.dontZoom);
50 + xf86GetOptValBool(FlagOptions, FLAG_DONTLIE, &xf86Info.dontLie);
52 xf86GetOptValBool(FlagOptions, FLAG_IGNORE_ABI, &xf86Info.ignoreABI);
53 if (xf86Info.ignoreABI) {
54 diff --git a/hw/xfree86/common/xf86Globals.c b/hw/xfree86/common/xf86Globals.c
55 index 8b483f3..6402329 100644
56 --- a/hw/xfree86/common/xf86Globals.c
57 +++ b/hw/xfree86/common/xf86Globals.c
58 @@ -110,6 +110,7 @@ xf86InfoRec xf86Info = {
59 .dontVTSwitch = FALSE,
63 .notrapSignals = FALSE,
64 .caughtSignal = FALSE,
65 .currentScreen = NULL,
66 diff --git a/hw/xfree86/common/xf86Privstr.h b/hw/xfree86/common/xf86Privstr.h
67 index b2095aa..05166f9 100644
68 --- a/hw/xfree86/common/xf86Privstr.h
69 +++ b/hw/xfree86/common/xf86Privstr.h
70 @@ -68,6 +68,8 @@ typedef struct {
76 Bool notrapSignals; /* don't exit cleanly - die at fault */
79 diff --git a/hw/xfree86/doc/man/xorg.conf.man.pre b/hw/xfree86/doc/man/xorg.conf.man.pre
80 index f7ff6f6..e2e5a55 100644
81 --- a/hw/xfree86/doc/man/xorg.conf.man.pre
82 +++ b/hw/xfree86/doc/man/xorg.conf.man.pre
83 @@ -550,6 +550,12 @@ When this option is enabled, those key sequences have no special meaning
84 and are passed to clients.
87 +.BI "Option \*qDontLie\*q \*q" boolean \*q
88 +This option suggests that the server should avoid lying whenever possible.
89 +Currently this means that RandR 1.2 drivers will try to compute the proper DPI
90 +instead of making it up.
93 .BI "Option \*qDisableVidModeExtension\*q \*q" boolean \*q
94 This disables the parts of the VidMode extension used by the xvidtune client
95 that can be used to change the video modes.
96 diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
97 index 7ba09b6..c51857b 100644
98 --- a/hw/xfree86/modes/xf86RandR12.c
99 +++ b/hw/xfree86/modes/xf86RandR12.c
100 @@ -806,6 +806,7 @@ xf86RandR12CreateScreenResources (ScreenPtr pScreen)
103 xf86OutputPtr output = xf86CompatOutput(pScrn);
104 + xf86CrtcPtr crtc = output->crtc;
107 output->conf_monitor &&
108 @@ -818,6 +819,17 @@ xf86RandR12CreateScreenResources (ScreenPtr pScreen)
109 mmWidth = output->conf_monitor->mon_width;
110 mmHeight = output->conf_monitor->mon_height;
112 + else if (xf86Info.dontLie && crtc && crtc->mode.HDisplay &&
113 + output->mm_width && output->mm_height)
116 + * If the output has a mode and a declared size, use that
117 + * to scale the screen size
119 + DisplayModePtr mode = &crtc->mode;
120 + mmWidth = output->mm_width * width / mode->HDisplay;
121 + mmHeight = output->mm_height * height / mode->VDisplay;