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

X Strike Force Xrender SVN commit: rev 73 - in trunk: . debian



Author: branden
Date: 2003-10-15 14:01:06 -0500 (Wed, 15 Oct 2003)
New Revision: 73

Modified:
   trunk/Xrender.c
   trunk/debian/changelog
Log:
Steal patch from upstream CVS that works around breakage in the Xinerama
implementation in the XFree86 X server, which only reports depths with an
associated visual, when it should return all available depths.  Thanks to
Marc Wilson for help tracking down the problem and the solution.
(Closes: #215845)

- Xrender.c


Modified: trunk/Xrender.c
===================================================================
--- trunk/Xrender.c	2003-10-15 08:26:04 UTC (rev 72)
+++ trunk/Xrender.c	2003-10-15 19:01:06 UTC (rev 73)
@@ -1,5 +1,5 @@
 /*
- * $Id: Xrender.c,v 1.17 2003/06/08 17:56:37 keithp Exp $
+ * $Id: Xrender.c,v 1.18 2003/06/23 21:12:08 keithp Exp $
  *
  * Copyright © 2000 SuSE, Inc.
  *
@@ -80,6 +80,33 @@
 			 DEPTH_MASK(24) | \
 			 DEPTH_MASK(32))
     
+typedef struct _DepthCheckRec {
+    struct _DepthCheckRec *next;
+    Display *dpy;
+    CARD32  missing;
+    unsigned long serial;
+} DepthCheckRec, *DepthCheckPtr;
+
+static DepthCheckPtr	depthChecks;
+
+static int
+XRenderDepthCheckErrorHandler (Display *dpy, XErrorEvent *evt)
+{
+    if (evt->request_code == X_CreatePixmap && evt->error_code == BadValue)
+    {
+	DepthCheckPtr	d;
+	_XLockMutex(_Xglobal_lock);
+	for (d = depthChecks; d; d = d->next)
+	    if (d->dpy == dpy)
+	    {
+		if ((long) (evt->serial - d->serial) >= 0)
+		    d->missing |= DEPTH_MASK(evt->resourceid);
+		break;
+	    }
+	_XUnlockMutex (_Xglobal_lock);
+    }
+}
+
 static Bool
 XRenderHasDepths (Display *dpy)
 {
@@ -88,13 +115,66 @@
     for (s = 0; s < ScreenCount (dpy); s++)
     {
 	CARD32		    depths = 0;
+	CARD32		    missing;
 	Screen		    *scr = ScreenOfDisplay (dpy, s);
 	int		    d;
 
 	for (d = 0; d < scr->ndepths; d++)
 	    depths |= DEPTH_MASK(scr->depths[d].depth);
-	if (~depths & REQUIRED_DEPTHS)
-	    return False;
+	missing = ~depths & REQUIRED_DEPTHS;
+	if (missing)
+	{
+	    DepthCheckRec   dc, **dp;
+	    XErrorHandler   previousHandler;
+
+	    /*
+	     * Ok, this is ugly.  It should be sufficient at this
+	     * point to just return False, but Xinerama is broken at
+	     * this point and only advertises depths which have an
+	     * associated visual.  Of course, the other depths still
+	     * work, but the only way to find out is to try them.
+	     */
+	    dc.dpy = dpy;
+	    dc.missing = 0;
+	    dc.serial = XNextRequest (dpy);
+	    _XLockMutex(_Xglobal_lock);
+	    dc.next = depthChecks;
+	    depthChecks = &dc;
+	    _XUnlockMutex (_Xglobal_lock);
+	    /*
+	     * I suspect this is not really thread safe, but Xlib doesn't
+	     * provide a lot of options here
+	     */
+	    previousHandler = XSetErrorHandler (XRenderDepthCheckErrorHandler);
+	    /*
+	     * Try each missing depth and see if pixmap creation succeeds
+	     */
+	    for (d = 1; d <= 32; d++)
+		/* don't check depth 1 == Xcursor recurses... */
+		if ((missing & DEPTH_MASK(d)) && d != 1)
+		{
+		    Pixmap  p;
+		    p = XCreatePixmap (dpy, RootWindow (dpy, s), 1, 1, d);
+		    XFreePixmap (dpy, p);
+		}
+	    XSync (dpy, False);
+	    XSetErrorHandler (previousHandler);
+	    /*
+	     * Unhook from the list of depth check records
+	     */
+	    _XLockMutex(_Xglobal_lock);
+	    for (dp = &depthChecks; *dp; dp = &(*dp)->next)
+	    {
+		if (*dp == &dc)
+		{
+		    *dp = dc.next;
+		    break;
+		}
+	    }
+	    _XUnlockMutex (_Xglobal_lock);
+	    if (dc.missing)
+		return False;
+	}
     }
     return True;
 }

Modified: trunk/debian/changelog
===================================================================
--- trunk/debian/changelog	2003-10-15 08:26:04 UTC (rev 72)
+++ trunk/debian/changelog	2003-10-15 19:01:06 UTC (rev 73)
@@ -34,8 +34,15 @@
     include myself.
     - debian/control
 
- -- Branden Robinson <branden@debian.org>  Wed, 15 Oct 2003 03:25:23 -0500
+  * Steal patch from upstream CVS that works around breakage in the Xinerama
+    implementation in the XFree86 X server, which only reports depths with an
+    associated visual, when it should return all available depths.  Thanks to
+    Marc Wilson for help tracking down the problem and the solution.
+    (Closes: #215845)
+    - Xrender.c
 
+ -- Branden Robinson <branden@debian.org>  Wed, 15 Oct 2003 13:56:07 -0500
+
 xrender (0.8.3-2) unstable; urgency=medium
 
   * Urgency medium because the problem fixed by this release bites a lot of



Reply to: