From 73d915296302f49024bf3d7cab2b11e253d5c8da Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Wed, 6 Jan 2010 10:42:17 -0500 Subject: [PATCH] xfree86: Add DontLie server flag. Since commit fff00df94d7ebd18a8e24537ec96073717375a3f, RandR 1.2 drivers lie about attached screen resolution by default. The new server flag, DontLie, causes the server to be honest by default. Signed-off-by: Nick Bowler --- hw/xfree86/common/xf86Config.c | 6 +++++- hw/xfree86/common/xf86Globals.c | 1 + hw/xfree86/common/xf86Privstr.h | 2 ++ hw/xfree86/doc/man/xorg.conf.man.pre | 6 ++++++ hw/xfree86/modes/xf86RandR12.c | 12 ++++++++++++ 5 files changed, 26 insertions(+), 1 deletions(-) diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c index 6fbf613..88c8a56 100644 --- a/hw/xfree86/common/xf86Config.c +++ b/hw/xfree86/common/xf86Config.c @@ -703,7 +703,8 @@ typedef enum { FLAG_AUTO_ENABLE_DEVICES, FLAG_GLX_VISUALS, FLAG_DRI2, - FLAG_USE_SIGIO + FLAG_USE_SIGIO, + FLAG_DONTLIE } FlagValues; /** @@ -767,6 +768,8 @@ static OptionInfoRec FlagOptions[] = { {0}, FALSE }, { FLAG_USE_SIGIO, "UseSIGIO", OPTV_BOOLEAN, {0}, FALSE }, + { FLAG_DONTLIE, "DontLie", OPTV_BOOLEAN, + {0}, FALSE }, { -1, NULL, OPTV_NONE, {0}, FALSE }, }; @@ -824,6 +827,7 @@ configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts) xf86GetOptValBool(FlagOptions, FLAG_DONTVTSWITCH, &xf86Info.dontVTSwitch); xf86GetOptValBool(FlagOptions, FLAG_DONTZAP, &xf86Info.dontZap); xf86GetOptValBool(FlagOptions, FLAG_DONTZOOM, &xf86Info.dontZoom); + xf86GetOptValBool(FlagOptions, FLAG_DONTLIE, &xf86Info.dontLie); xf86GetOptValBool(FlagOptions, FLAG_IGNORE_ABI, &xf86Info.ignoreABI); if (xf86Info.ignoreABI) { diff --git a/hw/xfree86/common/xf86Globals.c b/hw/xfree86/common/xf86Globals.c index 98f8284..c7d03a4 100644 --- a/hw/xfree86/common/xf86Globals.c +++ b/hw/xfree86/common/xf86Globals.c @@ -110,6 +110,7 @@ xf86InfoRec xf86Info = { .dontVTSwitch = FALSE, .dontZap = FALSE, .dontZoom = FALSE, + .dontLie = FALSE, .notrapSignals = FALSE, .caughtSignal = FALSE, .currentScreen = NULL, diff --git a/hw/xfree86/common/xf86Privstr.h b/hw/xfree86/common/xf86Privstr.h index b2095aa..05166f9 100644 --- a/hw/xfree86/common/xf86Privstr.h +++ b/hw/xfree86/common/xf86Privstr.h @@ -68,6 +68,8 @@ typedef struct { Bool dontVTSwitch; Bool dontZap; Bool dontZoom; + Bool dontLie; + Bool notrapSignals; /* don't exit cleanly - die at fault */ Bool caughtSignal; diff --git a/hw/xfree86/doc/man/xorg.conf.man.pre b/hw/xfree86/doc/man/xorg.conf.man.pre index 942c397..dd1269c 100644 --- a/hw/xfree86/doc/man/xorg.conf.man.pre +++ b/hw/xfree86/doc/man/xorg.conf.man.pre @@ -490,6 +490,12 @@ When this option is enabled, those key sequences have no special meaning and are passed to clients. Default: off. .TP 7 +.BI "Option \*qDontLie\*q \*q" boolean \*q +This option suggests that the server should avoid lying whenever possible. +Currently this means that RandR 1.2 drivers will try to compute the proper DPI +instead of making it up. +Default: off. +.TP 7 .BI "Option \*qDisableVidModeExtension\*q \*q" boolean \*q This disables the parts of the VidMode extension used by the xvidtune client that can be used to change the video modes. diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c index 1fc63c4..5d8bc29 100644 --- a/hw/xfree86/modes/xf86RandR12.c +++ b/hw/xfree86/modes/xf86RandR12.c @@ -806,6 +806,7 @@ xf86RandR12CreateScreenResources (ScreenPtr pScreen) else { xf86OutputPtr output = config->output[config->compat_output]; + xf86CrtcPtr crtc = output->crtc; if (output->conf_monitor && (output->conf_monitor->mon_width > 0 && @@ -817,6 +818,17 @@ xf86RandR12CreateScreenResources (ScreenPtr pScreen) mmWidth = output->conf_monitor->mon_width; mmHeight = output->conf_monitor->mon_height; } + else if (xf86Info.dontLie && crtc && crtc->mode.HDisplay && + output->mm_width && output->mm_height) + { + /* + * If the output has a mode and a declared size, use that + * to scale the screen size + */ + DisplayModePtr mode = &crtc->mode; + mmWidth = output->mm_width * width / mode->HDisplay; + mmHeight = output->mm_height * height / mode->VDisplay; + } else { /* -- 1.6.6