[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

RandR fix for next revision




Hi,

please apply the attached patch to your tree. It fixes the following issues with the RandR extension (name of submitter in parentheses):

568. The call to xf86RandRSetMode() from f86RandRCreateScreenResources()
     doesn't appear to be necessary.  Removing it restores the
     documented ViewPort behaviour when RandR is enabled (David Dawes).

Applied: Fri Nov 7 23:40:13 2003 UTC (7 months, 1 week ago) by dawes

562. Fix RandR initialization problem when default screen resolution is
     different from the virtual resolution. (Bugzilla #853, Bob
     Paauwe).

Applied: Thu Nov 6 13:03:10 2003 UTC (7 months, 1 week ago) by alanh

338. Fixed rounding of refresh rate in RandR, updated Xrandr man page
     (BugzillaR #527, Egbert Eich).

Applied Mon Aug 4 09:32:24 2003 UTC (10 months, 2 weeks ago) by eich

Of specific interest is 562. This lead to a BadImplementation error when calling GetScreenInfo if the virtual screen is larger than the current display mode. Easy to reproduce: Press CTRL-ALT-+ to switch to a smaller mode and start the xrandr program. You will receive a X Window system error from the RandR extension (major 154, minor 5). Other programs querying the RandR extension behave in the same way.

All these patches were commited to the XFree86 CVS before the license change occured. Hence, that should not be a problem.

Here is a direct link to the history of these changes:

http://cvsweb.xfree86.org/cvsweb/xc/programs/Xserver/hw/xfree86/common/xf86RandR.c

Fix tested and found working by me.

Thomas

--
Thomas Winischhofer
Vienna/Austria
thomas AT winischhofer DOT net          *** http://www.winischhofer.net/
twini AT xfree86 DOT org
--- programs/Xserver/hw/xfree86/common/xf86RandR.c-old	2003-03-02 05:27:23.000000000 +0100
+++ programs/Xserver/hw/xfree86/common/xf86RandR.c	2004-04-23 21:20:32.000000000 +0200
@@ -1,5 +1,5 @@
 /*
- * $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86RandR.c,v 1.4 2003/02/13 10:49:38 eich Exp $
+ * $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86RandR.c,v 1.7tsi Exp $
  *
  * Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc.
  *
@@ -48,9 +49,9 @@
 xf86RandRModeRefresh (DisplayModePtr mode)
 {
     if (mode->VRefresh)
-	return (int) mode->VRefresh;
+	return (int) (mode->VRefresh + 0.5);
     else
-	return (int) (mode->Clock * 1000.0 / mode->HTotal / mode->VTotal);
+	return (int) (mode->Clock * 1000.0 / mode->HTotal / mode->VTotal + 0.5);
 }
 
 static Bool
@@ -60,7 +61,6 @@
     ScrnInfoPtr		    scrp = XF86SCRNINFO(pScreen);
     XF86RandRInfoPtr	    randrp = XF86RANDRINFO(pScreen);
     DisplayModePtr	    mode;
-    Bool		    reportVirtual = TRUE;
     int			    refresh0 = 60;
     
     *rotations = RR_Rotate_0;
@@ -75,9 +75,6 @@
 				pScreen->mmWidth, pScreen->mmHeight);
 	if (!pSize)
 	    return FALSE;
-	if (mode->HDisplay == randrp->virtualX && 
-	    mode->VDisplay == randrp->virtualY)
-	    reportVirtual = FALSE;
 	RRRegisterRate (pScreen, pSize, refresh);
 	if (mode == scrp->currentMode &&
 	    mode->HDisplay == pScreen->width && mode->VDisplay == pScreen->height)
@@ -85,13 +82,14 @@
 	if (mode->next == scrp->modes)
 	    break;
     }
-    if (reportVirtual)
+    if (scrp->currentMode->HDisplay != randrp->virtualX ||
+	scrp->currentMode->VDisplay != randrp->virtualY)
     {
 	mode = scrp->modes;
 	pSize = RRRegisterSize (pScreen,
 				randrp->virtualX, randrp->virtualY,
-				pScreen->mmWidth * randrp->virtualX / mode->HDisplay,
-				pScreen->mmHeight * randrp->virtualY / mode->VDisplay);
+				pScreen->mmWidth * randrp->virtualX / scrp->currentMode->HDisplay,
+				pScreen->mmHeight * randrp->virtualY / scrp->currentMode->VDisplay);
 	if (!pSize)
 	    return FALSE;
 	RRRegisterRate (pScreen, pSize, refresh0);
@@ -202,17 +200,21 @@
 static Bool
 xf86RandRCreateScreenResources (ScreenPtr pScreen)
 {
-    ScrnInfoPtr		    scrp = XF86SCRNINFO(pScreen);
     XF86RandRInfoPtr	    randrp = XF86RANDRINFO(pScreen);
+#if 0
+    ScrnInfoPtr		    scrp = XF86SCRNINFO(pScreen);
     DisplayModePtr	    mode;
+#endif
 
     pScreen->CreateScreenResources = randrp->CreateScreenResources;
     if (!(*pScreen->CreateScreenResources) (pScreen))
 	return FALSE;
     
+#if 0
     mode = scrp->currentMode;
     if (mode)
 	xf86RandRSetMode (pScreen, mode, TRUE);
+#endif
     
     return TRUE;
 }

Reply to: