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: