xserver: Branch 'master' - 10 commits

Keith Packard keithp at kemper.freedesktop.org
Wed May 19 13:01:03 PDT 2010


 Xext/panoramiX.c                      |    4 +
 Xext/panoramiXprocs.c                 |  124 +++++++++++++++++-----------------
 Xext/saver.c                          |   17 +---
 Xext/security.c                       |   19 +----
 Xext/shape.c                          |   21 ++---
 Xext/shm.c                            |    6 -
 Xext/sync.c                           |   31 +++-----
 Xext/xcalibrate.c                     |    4 -
 Xext/xtest.c                          |    2 
 Xext/xvdisp.c                         |   25 +++---
 Xext/xvdix.h                          |    2 
 Xext/xvmain.c                         |   35 +++------
 Xext/xvmc.c                           |   15 ++--
 Xi/exevents.c                         |    4 -
 Xi/xichangecursor.c                   |    2 
 Xi/xipassivegrab.c                    |    2 
 composite/compext.c                   |    5 -
 damageext/damageext.c                 |   10 --
 damageext/damageextint.h              |    2 
 dbe/dbe.c                             |    6 +
 dix/cursor.c                          |    4 -
 dix/dispatch.c                        |   47 +++++++-----
 dix/dixfonts.c                        |    1 
 dix/dixutils.c                        |    8 --
 dix/events.c                          |   26 +++----
 dix/gc.c                              |    2 
 dix/inpututils.c                      |    1 
 dix/resource.c                        |  101 ++++++++++++++++++++-------
 dix/selection.c                       |   12 +--
 dix/window.c                          |    8 +-
 glx/glxdri2.c                         |    1 
 hw/xfree86/common/xf86Configure.c     |    5 +
 hw/xfree86/common/xf86Opt.h           |    4 +
 hw/xfree86/common/xf86Option.c        |   47 ++++++++++++
 hw/xfree86/common/xf86ShowOpts.c      |    2 
 hw/xfree86/dixmods/extmod/xf86dga2.c  |    4 -
 hw/xfree86/dixmods/extmod/xf86vmode.c |    7 -
 hw/xfree86/doc/sgml/DESIGN.sgml       |    6 +
 hw/xfree86/dri2/dri2ext.c             |    5 -
 hw/xquartz/applewm.c                  |   10 --
 hw/xquartz/xpr/appledri.c             |    8 --
 hw/xwin/winconfig.c                   |   37 ++++++++++
 hw/xwin/winconfig.h                   |    2 
 hw/xwin/winwindowswm.c                |    4 -
 include/resource.h                    |    3 
 mi/midispcur.c                        |   58 ++-------------
 mi/miexpose.c                         |    5 -
 mi/misprite.c                         |   86 ++++++-----------------
 mi/misprite.h                         |   88 +++++-------------------
 os/io.c                               |    8 +-
 randr/randrstr.h                      |    6 -
 randr/rrcrtc.c                        |    4 -
 randr/rrmode.c                        |    1 
 randr/rroutput.c                      |    2 
 randr/rrproperty.c                    |    6 -
 randr/rrscreen.c                      |    2 
 record/record.c                       |    5 -
 render/picture.c                      |    2 
 render/picturestr.h                   |    2 
 render/render.c                       |   48 ++++++++-----
 xfixes/cursor.c                       |   13 +--
 xfixes/region.c                       |    6 -
 xfixes/select.c                       |    4 -
 xfixes/xfixes.c                       |    1 
 xfixes/xfixes.h                       |    5 -
 xkb/xkbEvents.c                       |    1 
 66 files changed, 499 insertions(+), 545 deletions(-)

New commits:
commit 8b6c1809c09f832051327d86e1a25dc0ec5cc878
Merge: d88ba77... c38552d...
Author: Keith Packard <keithp at keithp.com>
Date:   Wed May 19 12:58:02 2010 -0700

    Merge remote branch 'jamey/for-keith'

commit c38552d115e3bc71ad6179a8ad0d68778e943793
Author: Jamey Sharp <jamey at minilop.net>
Date:   Sat Apr 24 23:56:36 2010 -0700

    Add typed resource-lookup errors for non-core resource types.
    
    Signed-off-by: Jamey Sharp <jamey at minilop.net>
    Reviewed-by: Adam Jackson <ajax at redhat.com>

diff --git a/Xext/panoramiX.c b/Xext/panoramiX.c
index 31286d4..edcbb49 100644
--- a/Xext/panoramiX.c
+++ b/Xext/panoramiX.c
@@ -519,6 +519,10 @@ void PanoramiXExtensionInit(int argc, char *argv[])
 	    panoramiXGeneration = serverGeneration;
 	    success = TRUE;
 	}
+	SetResourceTypeErrorValue(XRT_WINDOW, BadWindow);
+	SetResourceTypeErrorValue(XRT_PIXMAP, BadPixmap);
+	SetResourceTypeErrorValue(XRT_GC, BadGC);
+	SetResourceTypeErrorValue(XRT_COLORMAP, BadColor);
     }
 
     if (!success) {
diff --git a/Xext/panoramiXprocs.c b/Xext/panoramiXprocs.c
index dbaae26..8752ca5 100644
--- a/Xext/panoramiXprocs.c
+++ b/Xext/panoramiXprocs.c
@@ -74,7 +74,7 @@ int PanoramiXCreateWindow(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&parent, stuff->parent,
 				     XRT_WINDOW, client, DixWriteAccess);
     if (result != Success)
-        return (result == BadValue) ? BadWindow : result;
+        return result;
 
     if(stuff->class == CopyFromParent)
 	stuff->class = parent->u.win.class;
@@ -89,7 +89,7 @@ int PanoramiXCreateWindow(ClientPtr client)
 	    result = dixLookupResourceByType((pointer *)&backPix, tmp,
 					     XRT_PIXMAP, client, DixReadAccess);
 	    if (result != Success)
-		return (result == BadValue) ? BadPixmap : result;
+		return result;
 	}
     }
     if ((Mask)stuff->mask & CWBorderPixmap) {
@@ -99,7 +99,7 @@ int PanoramiXCreateWindow(ClientPtr client)
 	    result = dixLookupResourceByType((pointer *)&bordPix, tmp,
 					     XRT_PIXMAP, client, DixReadAccess);
 	    if (result != Success)
-		return (result == BadValue) ? BadPixmap : result;
+		return result;
 	}
     }
     if ((Mask)stuff->mask & CWColormap) {
@@ -109,7 +109,7 @@ int PanoramiXCreateWindow(ClientPtr client)
 	    result = dixLookupResourceByType((pointer *)&cmap, tmp,
 					     XRT_COLORMAP, client, DixReadAccess);
 	    if (result != Success)
-		return (result == BadValue) ? BadColor : result;
+		return result;
 	}
     }
 
@@ -179,7 +179,7 @@ int PanoramiXChangeWindowAttributes(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&win, stuff->window,
 				     XRT_WINDOW, client, DixWriteAccess);
     if (result != Success)
-        return (result == BadValue) ? BadWindow : result;
+        return result;
 
     if((win->u.win.class == InputOnly) && 
        (stuff->valueMask & (~INPUTONLY_LEGAL_MASK)))
@@ -192,7 +192,7 @@ int PanoramiXChangeWindowAttributes(ClientPtr client)
 	    result = dixLookupResourceByType((pointer *)&backPix, tmp,
 					     XRT_PIXMAP, client, DixReadAccess);
 	    if (result != Success)
-		return (result == BadValue) ? BadPixmap : result;
+		return result;
 	}
     }
     if ((Mask)stuff->valueMask & CWBorderPixmap) {
@@ -202,7 +202,7 @@ int PanoramiXChangeWindowAttributes(ClientPtr client)
 	    result = dixLookupResourceByType((pointer *)&bordPix, tmp,
 					     XRT_PIXMAP, client, DixReadAccess);
 	    if (result != Success)
-		return (result == BadValue) ? BadPixmap : result;
+		return result;
 	}
     }
     if ((Mask)stuff->valueMask & CWColormap) {
@@ -212,7 +212,7 @@ int PanoramiXChangeWindowAttributes(ClientPtr client)
 	    result = dixLookupResourceByType((pointer *)&cmap, tmp,
 					     XRT_COLORMAP, client, DixReadAccess);
 	    if (result != Success)
-		return (result == BadValue) ? BadColor : result;
+		return result;
 	}
     }
 
@@ -242,7 +242,7 @@ int PanoramiXDestroyWindow(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&win, stuff->id, XRT_WINDOW,
 				     client, DixDestroyAccess);
     if (result != Success)
-	return (result == BadValue) ? BadWindow : result;
+	return result;
 
     FOR_NSCREENS_BACKWARD(j) {
 	stuff->id = win->info[j].id;
@@ -268,7 +268,7 @@ int PanoramiXDestroySubwindows(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&win, stuff->id, XRT_WINDOW,
 				     client, DixDestroyAccess);
     if (result != Success)
-	return (result == BadValue) ? BadWindow : result;
+	return result;
 
     FOR_NSCREENS_BACKWARD(j) {
 	stuff->id = win->info[j].id;
@@ -294,7 +294,7 @@ int PanoramiXChangeSaveSet(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&win, stuff->window,
 				     XRT_WINDOW, client, DixReadAccess);
     if (result != Success)
-	return (result == BadValue) ? BadWindow : result;
+	return result;
 
     FOR_NSCREENS_BACKWARD(j) {
 	stuff->window = win->info[j].id;
@@ -319,12 +319,12 @@ int PanoramiXReparentWindow(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&win, stuff->window,
 				     XRT_WINDOW, client, DixWriteAccess);
     if (result != Success)
-	return (result == BadValue) ? BadWindow : result;
+	return result;
 
     result = dixLookupResourceByType((pointer *)&parent, stuff->parent,
 				     XRT_WINDOW, client, DixWriteAccess);
     if (result != Success)
-	return (result == BadValue) ? BadWindow : result;
+	return result;
 
     x = stuff->x;
     y = stuff->y;
@@ -356,7 +356,7 @@ int PanoramiXMapWindow(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&win, stuff->id,
 				     XRT_WINDOW, client, DixReadAccess);
     if (result != Success)
-	return (result == BadValue) ? BadWindow : result;
+	return result;
 
     FOR_NSCREENS_FORWARD(j) {
 	stuff->id = win->info[j].id;
@@ -379,7 +379,7 @@ int PanoramiXMapSubwindows(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&win, stuff->id,
 				     XRT_WINDOW, client, DixReadAccess);
     if (result != Success)
-	return (result == BadValue) ? BadWindow : result;
+	return result;
 
     FOR_NSCREENS_FORWARD(j) {
 	stuff->id = win->info[j].id;
@@ -402,7 +402,7 @@ int PanoramiXUnmapWindow(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&win, stuff->id,
 				     XRT_WINDOW, client, DixReadAccess);
     if (result != Success)
-	return (result == BadValue) ? BadWindow : result;
+	return result;
 
     FOR_NSCREENS_FORWARD(j) {
 	stuff->id = win->info[j].id;
@@ -425,7 +425,7 @@ int PanoramiXUnmapSubwindows(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&win, stuff->id,
 				     XRT_WINDOW, client, DixReadAccess);
     if (result != Success)
-	return (result == BadValue) ? BadWindow : result;
+	return result;
 
     FOR_NSCREENS_FORWARD(j) {
 	stuff->id = win->info[j].id;
@@ -462,7 +462,7 @@ int PanoramiXConfigureWindow(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&win, stuff->window,
 				     XRT_WINDOW, client, DixWriteAccess);
     if (result != Success)
-	return (result == BadValue) ? BadWindow : result;
+	return result;
 
     if ((Mask)stuff->mask & CWSibling) {
 	XID tmp;
@@ -471,7 +471,7 @@ int PanoramiXConfigureWindow(ClientPtr client)
 	    result = dixLookupResourceByType((pointer *)&sib, tmp, XRT_WINDOW,
 					     client, DixReadAccess);
 	    if (result != Success)
-		return (result == BadValue) ? BadWindow : result;
+		return result;
 	}
     }
 
@@ -517,7 +517,7 @@ int PanoramiXCirculateWindow(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&win, stuff->window,
 				     XRT_WINDOW, client, DixWriteAccess);
     if (result != Success)
-	return (result == BadValue) ? BadWindow : result;
+	return result;
 
     FOR_NSCREENS_FORWARD(j) {
 	stuff->window = win->info[j].id;
@@ -697,7 +697,7 @@ int PanoramiXFreePixmap(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&pix, stuff->id, XRT_PIXMAP,
 				     client, DixDestroyAccess);
     if (result != Success)
-	return (result == BadValue) ? BadPixmap : result;
+	return result;
 
     FOR_NSCREENS_BACKWARD(j) {
 	stuff->id = pix->info[j].id;
@@ -742,7 +742,7 @@ int PanoramiXCreateGC(ClientPtr client)
 	    result = dixLookupResourceByType((pointer *)&tile, tmp, XRT_PIXMAP,
 					     client, DixReadAccess);
 	    if (result != Success)
-		return (result == BadValue) ? BadPixmap : result;
+		return result;
 	}
     }
     if ((Mask)stuff->mask & GCStipple) {
@@ -751,7 +751,7 @@ int PanoramiXCreateGC(ClientPtr client)
 	    result = dixLookupResourceByType((pointer *)&stip, tmp, XRT_PIXMAP,
 					     client, DixReadAccess);
 	    if (result != Success)
-		return (result == BadValue) ? BadPixmap : result;
+		return result;
 	}
     }
     if ((Mask)stuff->mask & GCClipMask) {
@@ -760,7 +760,7 @@ int PanoramiXCreateGC(ClientPtr client)
 	    result = dixLookupResourceByType((pointer *)&clip, tmp, XRT_PIXMAP,
 					     client, DixReadAccess);
 	    if (result != Success)
-		return (result == BadValue) ? BadPixmap : result;
+		return result;
 	}
     }
 
@@ -813,7 +813,7 @@ int PanoramiXChangeGC(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
 				     client, DixReadAccess);
     if (result != Success)
-	return (result == BadValue) ? BadGC : result;
+	return result;
 
     if ((Mask)stuff->mask & GCTile) {
 	tile_offset = Ones((Mask)stuff->mask & (GCTile - 1));
@@ -821,7 +821,7 @@ int PanoramiXChangeGC(ClientPtr client)
 	    result = dixLookupResourceByType((pointer *)&tile, tmp, XRT_PIXMAP,
 					     client, DixReadAccess);
 	    if (result != Success)
-		return (result == BadValue) ? BadPixmap : result;
+		return result;
 	}
     }
     if ((Mask)stuff->mask & GCStipple) {
@@ -830,7 +830,7 @@ int PanoramiXChangeGC(ClientPtr client)
 	    result = dixLookupResourceByType((pointer *)&stip, tmp, XRT_PIXMAP,
 					     client, DixReadAccess);
 	    if (result != Success)
-		return (result == BadValue) ? BadPixmap : result;
+		return result;
 	}
     }
     if ((Mask)stuff->mask & GCClipMask) {
@@ -839,7 +839,7 @@ int PanoramiXChangeGC(ClientPtr client)
 	    result = dixLookupResourceByType((pointer *)&clip, tmp, XRT_PIXMAP,
 					     client, DixReadAccess);
 	    if (result != Success)
-		return (result == BadValue) ? BadPixmap : result;
+		return result;
 	}
     }
 
@@ -871,12 +871,12 @@ int PanoramiXCopyGC(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&srcGC, stuff->srcGC, XRT_GC,
 				     client, DixReadAccess);
     if (result != Success)
-	return (result == BadValue) ? BadGC : result;
+	return result;
 
     result = dixLookupResourceByType((pointer *)&dstGC, stuff->dstGC, XRT_GC,
 				     client, DixWriteAccess);
     if (result != Success)
-	return (result == BadValue) ? BadGC : result;
+	return result;
 
     FOR_NSCREENS(j) {
 	stuff->srcGC = srcGC->info[j].id;
@@ -900,7 +900,7 @@ int PanoramiXSetDashes(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
 				     client, DixWriteAccess);
     if (result != Success)
-	return (result == BadValue) ? BadGC : result;
+	return result;
 
     FOR_NSCREENS_BACKWARD(j) {
 	stuff->gc = gc->info[j].id;
@@ -923,7 +923,7 @@ int PanoramiXSetClipRectangles(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
 				     client, DixWriteAccess);
     if (result != Success)
-	return (result == BadValue) ? BadGC : result;
+	return result;
 
     FOR_NSCREENS_BACKWARD(j) {
 	stuff->gc = gc->info[j].id;
@@ -946,7 +946,7 @@ int PanoramiXFreeGC(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&gc, stuff->id, XRT_GC,
 				     client, DixDestroyAccess);
     if (result != Success)
-	return (result == BadValue) ? BadGC : result;
+	return result;
 
     FOR_NSCREENS_BACKWARD(j) {
 	stuff->id = gc->info[j].id;
@@ -973,7 +973,7 @@ int PanoramiXClearToBackground(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&win, stuff->window,
 				     XRT_WINDOW, client, DixWriteAccess);
     if (result != Success)
-	return (result == BadValue) ? BadWindow : result;
+	return result;
 
     x = stuff->x;
     y = stuff->y;
@@ -1033,7 +1033,7 @@ int PanoramiXCopyArea(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
 				     client, DixReadAccess);
     if (result != Success)
-	return (result == BadValue) ? BadGC : result;
+	return result;
 
     if((dst->type == XRT_WINDOW) && dst->u.win.root)
 	dstIsRoot = TRUE;
@@ -1188,7 +1188,7 @@ int PanoramiXCopyPlane(ClientPtr client)
     rc = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
 				 client, DixReadAccess);
     if (rc != Success)
-	return (rc == BadValue) ? BadGC : rc;
+	return rc;
 
     if((dst->type == XRT_WINDOW) && dst->u.win.root)
 	dstIsRoot = TRUE;
@@ -1285,7 +1285,7 @@ int PanoramiXPolyPoint(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
 				     client, DixReadAccess);
     if (result != Success)
-	return (result == BadValue) ? BadGC : result;
+	return result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
     npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyPointReq));
@@ -1345,7 +1345,7 @@ int PanoramiXPolyLine(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
 				     client, DixReadAccess);
     if (result != Success)
-	return (result == BadValue) ? BadGC : result;
+	return result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
     npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyLineReq));
@@ -1405,7 +1405,7 @@ int PanoramiXPolySegment(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
 				     client, DixReadAccess);
     if (result != Success)
-	return (result == BadValue) ? BadGC : result;
+	return result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -1468,7 +1468,7 @@ int PanoramiXPolyRectangle(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
 				     client, DixReadAccess);
     if (result != Success)
-	return (result == BadValue) ? BadGC : result;
+	return result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -1530,7 +1530,7 @@ int PanoramiXPolyArc(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
 				     client, DixReadAccess);
     if (result != Success)
-	return (result == BadValue) ? BadGC : result;
+	return result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -1590,7 +1590,7 @@ int PanoramiXFillPoly(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
 				     client, DixReadAccess);
     if (result != Success)
-	return (result == BadValue) ? BadGC : result;
+	return result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -1651,7 +1651,7 @@ int PanoramiXPolyFillRectangle(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
 				     client, DixReadAccess);
     if (result != Success)
-	return (result == BadValue) ? BadGC : result;
+	return result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -1712,7 +1712,7 @@ int PanoramiXPolyFillArc(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
 				     client, DixReadAccess);
     if (result != Success)
-	return (result == BadValue) ? BadGC : result;
+	return result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -1772,7 +1772,7 @@ int PanoramiXPutImage(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
 				     client, DixReadAccess);
     if (result != Success)
-	return (result == BadValue) ? BadGC : result;
+	return result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -1973,7 +1973,7 @@ PanoramiXPolyText8(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
 				     client, DixReadAccess);
     if (result != Success)
-	return (result == BadValue) ? BadGC : result;
+	return result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -2014,7 +2014,7 @@ PanoramiXPolyText16(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
 				     client, DixReadAccess);
     if (result != Success)
-	return (result == BadValue) ? BadGC : result;
+	return result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -2055,7 +2055,7 @@ int PanoramiXImageText8(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
 				     client, DixReadAccess);
     if (result != Success)
-	return (result == BadValue) ? BadGC : result;
+	return result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -2096,7 +2096,7 @@ int PanoramiXImageText16(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC,
 				     client, DixReadAccess);
     if (result != Success)
-	return (result == BadValue) ? BadGC : result;
+	return result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -2128,7 +2128,7 @@ int PanoramiXCreateColormap(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&win, stuff->window,
 				     XRT_WINDOW, client, DixReadAccess);
     if (result != Success)
-	return (result == BadValue) ? BadWindow : result;
+	return result;
 
     if(!(newCmap = malloc(sizeof(PanoramiXRes))))
         return BadAlloc;
@@ -2169,7 +2169,7 @@ int PanoramiXFreeColormap(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&cmap, stuff->id, XRT_COLORMAP,
 				     client, DixDestroyAccess);
     if (result != Success)
-        return (result == BadValue) ? BadColor : result;
+        return result;
 
     FOR_NSCREENS_BACKWARD(j) {
         stuff->id = cmap->info[j].id;
@@ -2199,7 +2199,7 @@ PanoramiXCopyColormapAndFree(ClientPtr client)
 				     XRT_COLORMAP, client,
 				     DixReadAccess | DixWriteAccess);
     if (result != Success)
-        return (result == BadValue) ? BadColor : result;
+        return result;
 
     if(!(newCmap = malloc(sizeof(PanoramiXRes))))
         return BadAlloc;
@@ -2238,7 +2238,7 @@ int PanoramiXInstallColormap(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&cmap, stuff->id, XRT_COLORMAP,
 				     client, DixReadAccess);
     if (result != Success)
-        return (result == BadValue) ? BadColor : result;
+        return result;
 
     FOR_NSCREENS_BACKWARD(j){
 	stuff->id = cmap->info[j].id;
@@ -2262,7 +2262,7 @@ int PanoramiXUninstallColormap(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&cmap, stuff->id, XRT_COLORMAP,
 				     client, DixReadAccess);
     if (result != Success)
-        return (result == BadValue) ? BadColor : result;
+        return result;
 
     FOR_NSCREENS_BACKWARD(j) {
 	stuff->id = cmap->info[j].id;
@@ -2286,7 +2286,7 @@ int PanoramiXAllocColor(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
 				     XRT_COLORMAP, client, DixWriteAccess);
     if (result != Success)
-        return (result == BadValue) ? BadColor : result;
+        return result;
 
     FOR_NSCREENS_BACKWARD(j){
 	stuff->cmap = cmap->info[j].id;
@@ -2310,7 +2310,7 @@ int PanoramiXAllocNamedColor(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
 				     XRT_COLORMAP, client, DixWriteAccess);
     if (result != Success)
-        return (result == BadValue) ? BadColor : result;
+        return result;
 
     FOR_NSCREENS_BACKWARD(j){
         stuff->cmap = cmap->info[j].id;
@@ -2334,7 +2334,7 @@ int PanoramiXAllocColorCells(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
 				     XRT_COLORMAP, client, DixWriteAccess);
     if (result != Success)
-        return (result == BadValue) ? BadColor : result;
+        return result;
 	
     FOR_NSCREENS_BACKWARD(j){
 	stuff->cmap = cmap->info[j].id;
@@ -2358,7 +2358,7 @@ int PanoramiXAllocColorPlanes(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
 				     XRT_COLORMAP, client, DixWriteAccess);
     if (result != Success)
-        return (result == BadValue) ? BadColor : result;
+        return result;
 	
     FOR_NSCREENS_BACKWARD(j){
 	stuff->cmap = cmap->info[j].id;
@@ -2383,7 +2383,7 @@ int PanoramiXFreeColors(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
 				     XRT_COLORMAP, client, DixWriteAccess);
     if (result != Success)
-        return (result == BadValue) ? BadColor : result;
+        return result;
 
     FOR_NSCREENS_BACKWARD(j) {
         stuff->cmap = cmap->info[j].id;
@@ -2406,7 +2406,7 @@ int PanoramiXStoreColors(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
 				     XRT_COLORMAP, client, DixWriteAccess);
     if (result != Success)
-        return (result == BadValue) ? BadColor : result;
+        return result;
 
     FOR_NSCREENS_BACKWARD(j){
 	stuff->cmap = cmap->info[j].id;
@@ -2430,7 +2430,7 @@ int PanoramiXStoreNamedColor(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap,
 				     XRT_COLORMAP, client, DixWriteAccess);
     if (result != Success)
-        return (result == BadValue) ? BadColor : result;
+        return result;
 
     FOR_NSCREENS_BACKWARD(j){
 	stuff->cmap = cmap->info[j].id;
diff --git a/Xext/saver.c b/Xext/saver.c
index 63a41d6..fdcbac5 100644
--- a/Xext/saver.c
+++ b/Xext/saver.c
@@ -1272,7 +1272,7 @@ ProcScreenSaverSetAttributes (ClientPtr client)
 					       XRT_PIXMAP, client,
 					       DixReadAccess);
 	      if (status != Success)
-		  return (status == BadValue) ? BadPixmap : status;
+		  return status;
           }
        }
 
@@ -1284,7 +1284,7 @@ ProcScreenSaverSetAttributes (ClientPtr client)
 					       XRT_PIXMAP, client,
 					       DixReadAccess);
 	      if (status != Success)
-		  return (status == BadValue) ? BadPixmap : status;
+		  return status;
           }
        }
 
@@ -1296,7 +1296,7 @@ ProcScreenSaverSetAttributes (ClientPtr client)
 						XRT_COLORMAP, client,
 						DixReadAccess);
 	       if (status != Success)
-		   return (status == BadValue) ? BadColor : status;
+		   return status;
            }
        }
 
diff --git a/Xext/security.c b/Xext/security.c
index 32730e2..e58ba10 100644
--- a/Xext/security.c
+++ b/Xext/security.c
@@ -623,8 +623,7 @@ ProcSecurityRevokeAuthorization(
 				 SecurityAuthorizationResType, client,
 				 DixDestroyAccess);
     if (rc != Success)
-	return (rc == BadValue) ?
-	    SecurityErrorBase + XSecurityBadAuthorization : rc;
+	return rc;
 
     FreeResource(stuff->authId, RT_NONE);
     return Success;
@@ -1140,6 +1139,8 @@ SecurityExtensionInit(INITARGS)
     EventSwapVector[SecurityEventBase + XSecurityAuthorizationRevoked] =
 	(EventSwapPtr)SwapSecurityAuthorizationRevokedEvent;
 
+    SetResourceTypeErrorValue(SecurityAuthorizationResType, SecurityErrorBase + XSecurityBadAuthorization);
+
     /* Label objects that were created before we could register ourself */
     SecurityLabelInitial();
 }
diff --git a/Xext/shape.c b/Xext/shape.c
index f49e9a0..93e4703 100644
--- a/Xext/shape.c
+++ b/Xext/shape.c
@@ -360,7 +360,7 @@ ProcPanoramiXShapeRectangles(
     result = dixLookupResourceByType((pointer *)&win, stuff->dest, XRT_WINDOW,
 				     client, DixWriteAccess);
     if (result != Success)
-	return (result == BadValue) ? BadWindow : result;
+	return result;
 
     FOR_NSCREENS(j) {
 	stuff->dest = win->info[j].id;
@@ -459,13 +459,13 @@ ProcPanoramiXShapeMask(
     result = dixLookupResourceByType((pointer *)&win, stuff->dest, XRT_WINDOW,
 				     client, DixWriteAccess);
     if (result != Success)
-	return (result == BadValue) ? BadWindow : result;
+	return result;
 
     if(stuff->src != None) {
 	result = dixLookupResourceByType((pointer *)&pmap, stuff->src,
 					 XRT_PIXMAP, client, DixReadAccess);
 	if (result != Success)
-	    return (result == BadValue) ? BadPixmap : result;
+	    return result;
     } else
 	pmap = NULL;
 
@@ -589,12 +589,12 @@ ProcPanoramiXShapeCombine(
     result = dixLookupResourceByType((pointer *)&win, stuff->dest, XRT_WINDOW,
 				     client, DixWriteAccess);
     if (result != Success)
-	return (result == BadValue) ? BadWindow : result;
+	return result;
 
     result = dixLookupResourceByType((pointer *)&win2, stuff->src, XRT_WINDOW,
 				     client, DixReadAccess);
     if (result != Success)
-	return (result == BadValue) ? BadWindow : result;
+	return result;
 
     FOR_NSCREENS(j) {
 	stuff->dest = win->info[j].id;
@@ -663,7 +663,7 @@ ProcPanoramiXShapeOffset(
     result = dixLookupResourceByType((pointer *)&win, stuff->dest, XRT_WINDOW,
 				     client, DixWriteAccess);
     if (result != Success)
-	return (result == BadValue) ? BadWindow : result;
+	return result;
 
     FOR_NSCREENS(j) {
 	stuff->dest = win->info[j].id;
diff --git a/Xext/shm.c b/Xext/shm.c
index b2c4208..3d9c633 100644
--- a/Xext/shm.c
+++ b/Xext/shm.c
@@ -156,7 +156,7 @@ static ShmFuncs fbFuncs = {fbShmCreatePixmap, NULL};
     rc = dixLookupResourceByType((pointer *)&(shmdesc), shmseg, ShmSegType, \
                                  client, DixReadAccess); \
     if (rc != Success) \
-	return (rc == BadValue) ? BadShmSegCode : rc; \
+	return rc; \
 }
 
 #define VERIFY_SHMPTR(shmseg,offset,needwrite,shmdesc,client) \
@@ -286,6 +286,7 @@ ShmExtensionInit(INITARGS)
 	ShmReqCode = (unsigned char)extEntry->base;
 	ShmCompletionCode = extEntry->eventBase;
 	BadShmSegCode = extEntry->errorBase;
+	SetResourceTypeErrorValue(ShmSegType, BadShmSegCode);
 	EventSwapVector[ShmCompletionCode] = (EventSwapPtr) SShmCompletionEvent;
     }
 }
@@ -584,7 +585,7 @@ ProcPanoramiXShmPutImage(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&gc, stuff->gc,
 				     XRT_GC, client, DixReadAccess);
     if (result != Success)
-        return (result == BadValue) ? BadGC : result;
+        return result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
diff --git a/Xext/sync.c b/Xext/sync.c
index f7ac405..a51262a 100644
--- a/Xext/sync.c
+++ b/Xext/sync.c
@@ -264,7 +264,7 @@ SyncInitTrigger(ClientPtr client, SyncTrigger *pTrigger, XSyncCounter counter,
 				counter, RTCounter, client, DixReadAccess)))
 	{
 	    client->errorValue = counter;
-	    return (rc == BadValue) ? SyncErrorBase + XSyncBadCounter : rc;
+	    return rc;
 	}
 	if (pCounter != pTrigger->pCounter)
 	{ /* new counter for trigger */
@@ -1328,7 +1328,7 @@ ProcSyncSetCounter(ClientPtr client)
     rc = dixLookupResourceByType((pointer *)&pCounter, stuff->cid, RTCounter,
 				 client, DixWriteAccess);
     if (rc != Success)
-	return (rc == BadValue) ? SyncErrorBase + XSyncBadCounter : rc;
+	return rc;
 
     if (IsSystemCounter(pCounter))
     {
@@ -1358,7 +1358,7 @@ ProcSyncChangeCounter(ClientPtr client)
     rc = dixLookupResourceByType((pointer *)&pCounter, stuff->cid, RTCounter,
 				 client, DixWriteAccess);
     if (rc != Success)
-	return (rc == BadValue) ? SyncErrorBase + XSyncBadCounter : rc;
+	return rc;
 
     if (IsSystemCounter(pCounter))
     {
@@ -1393,7 +1393,7 @@ ProcSyncDestroyCounter(ClientPtr client)
     rc = dixLookupResourceByType((pointer *)&pCounter, stuff->counter, RTCounter,
 				 client, DixDestroyAccess);
     if (rc != Success)
-	return (rc == BadValue) ? SyncErrorBase + XSyncBadCounter : rc;
+	return rc;
 
     if (IsSystemCounter(pCounter))
     {
@@ -1536,7 +1536,7 @@ ProcSyncQueryCounter(ClientPtr client)
     rc = dixLookupResourceByType((pointer *)&pCounter, stuff->counter,
 				 RTCounter, client, DixReadAccess);
     if (rc != Success)
-	return (rc == BadValue) ? SyncErrorBase + XSyncBadCounter : rc;
+	return rc;
 
     rep.type = X_Reply;
     rep.length = 0;
@@ -1660,7 +1660,7 @@ ProcSyncChangeAlarm(ClientPtr client)
     status = dixLookupResourceByType((pointer *)&pAlarm, stuff->alarm, RTAlarm,
 				     client, DixWriteAccess);
     if (status != Success)
-	return (status == BadValue) ? SyncErrorBase + XSyncBadAlarm : status;
+	return status;
 
     vmask = stuff->valueMask;
     len = client->req_len - bytes_to_int32(sizeof(xSyncChangeAlarmReq));
@@ -1699,7 +1699,7 @@ ProcSyncQueryAlarm(ClientPtr client)
     rc = dixLookupResourceByType((pointer *)&pAlarm, stuff->alarm, RTAlarm,
 				 client, DixReadAccess);
     if (rc != Success)
-	return (rc == BadValue) ? SyncErrorBase + XSyncBadAlarm : rc;
+	return rc;
 
     rep.type = X_Reply;
     rep.length = bytes_to_int32(sizeof(xSyncQueryAlarmReply) - sizeof(xGenericReply));
@@ -1756,7 +1756,7 @@ ProcSyncDestroyAlarm(ClientPtr client)
     rc = dixLookupResourceByType((pointer *)&pAlarm, stuff->alarm, RTAlarm,
 				 client, DixDestroyAccess);
     if (rc != Success)
-	return (rc == BadValue) ? SyncErrorBase + XSyncBadAlarm : rc;
+	return rc;
 
     FreeResource(stuff->alarm, RT_NONE);
     return Success;
@@ -2127,6 +2127,9 @@ SyncExtensionInit(void)
     EventSwapVector[SyncEventBase + XSyncCounterNotify] = (EventSwapPtr) SCounterNotifyEvent;
     EventSwapVector[SyncEventBase + XSyncAlarmNotify] = (EventSwapPtr) SAlarmNotifyEvent;
 
+    SetResourceTypeErrorValue(RTCounter, SyncErrorBase + XSyncBadCounter);
+    SetResourceTypeErrorValue(RTAlarm, SyncErrorBase + XSyncBadAlarm);
+
     /*
      * Although SERVERTIME is implemented by the OS layer, we initialise it
      * here because doing it in OsInit() is too early. The resource database
diff --git a/Xext/xvdisp.c b/Xext/xvdisp.c
index 250a994..d7338ad 100644
--- a/Xext/xvdisp.c
+++ b/Xext/xvdisp.c
@@ -1025,7 +1025,6 @@ typedef struct _ShmDesc {
 } ShmDescRec, *ShmDescPtr;
 
 extern RESTYPE ShmSegType;
-extern int BadShmSegCode;
 extern int ShmCompletionCode;
 
 static int 
@@ -1077,7 +1076,7 @@ ProcXvShmPutImage(ClientPtr client)
   status = dixLookupResourceByType((pointer *)&shmdesc, stuff->shmseg,
 				   ShmSegType, serverClient, DixReadAccess);
   if (status != Success)
-      return (status == BadValue) ? BadShmSegCode : status;
+      return status;
  
   width = stuff->width;
   height = stuff->height;
@@ -1615,7 +1614,7 @@ XineramaXvStopVideo(ClientPtr client)
    result = dixLookupResourceByType((pointer *)&port, stuff->port,
 				    XvXRTPort, client, DixReadAccess);
    if (result != Success)
-       return (result == BadValue) ? _XvBadPort : result;
+       return result;
 
    FOR_NSCREENS_BACKWARD(i) {
 	if(port->info[i].id) {
@@ -1640,7 +1639,7 @@ XineramaXvSetPortAttribute(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&port, stuff->port,
 				     XvXRTPort, client, DixReadAccess);
     if (result != Success)
-	return (result == BadValue) ? _XvBadPort : result;
+	return result;
 
     FOR_NSCREENS_BACKWARD(i) {
 	if(port->info[i].id) {
@@ -1671,12 +1670,12 @@ XineramaXvShmPutImage(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&gc, stuff->gc,
 				     XRT_GC, client, DixReadAccess);
     if (result != Success)
-        return (result == BadValue) ? BadGC : result;
+        return result;
 
     result = dixLookupResourceByType((pointer *)&port, stuff->port,
 				     XvXRTPort, client, DixReadAccess);
     if (result != Success)
-	return (result == BadValue) ? _XvBadPort : result;
+	return result;
  
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -1723,12 +1722,12 @@ XineramaXvPutImage(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&gc, stuff->gc,
 				     XRT_GC, client, DixReadAccess);
     if (result != Success)
-        return (result == BadValue) ? BadGC : result;
+        return result;
 
     result = dixLookupResourceByType((pointer *)&port, stuff->port,
 				     XvXRTPort, client, DixReadAccess);
     if (result != Success)
-	return (result == BadValue) ? _XvBadPort : result;
+	return result;
  
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -1771,12 +1770,12 @@ XineramaXvPutVideo(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&gc, stuff->gc,
 				     XRT_GC, client, DixReadAccess);
     if (result != Success)
-        return (result == BadValue) ? BadGC : result;
+        return result;
 
     result = dixLookupResourceByType((pointer *)&port, stuff->port,
 				     XvXRTPort, client, DixReadAccess);
     if (result != Success)
-	return (result == BadValue) ? _XvBadPort : result;
+	return result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -1819,12 +1818,12 @@ XineramaXvPutStill(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&gc, stuff->gc,
 				     XRT_GC, client, DixReadAccess);
     if (result != Success)
-        return (result == BadValue) ? BadGC : result;
+        return result;
 
     result = dixLookupResourceByType((pointer *)&port, stuff->port,
 				     XvXRTPort, client, DixReadAccess);
     if (result != Success)
-	return (result == BadValue) ? _XvBadPort : result;
+	return result;
 
     isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
 
@@ -1910,6 +1909,7 @@ void XineramifyXv(void)
    XvXRTPort = CreateNewResourceType(XineramaDeleteResource, "XvXRTPort");
 
    if (!xvsp0 || !XvXRTPort) return;
+   SetResourceTypeErrorValue(XvXRTPort, _XvBadPort);
 
    for(i = 0; i < xvsp0->nAdaptors; i++) {
       Bool isOverlay;
diff --git a/Xext/xvdix.h b/Xext/xvdix.h
index 44f8f6b..a210615 100644
--- a/Xext/xvdix.h
+++ b/Xext/xvdix.h
@@ -206,7 +206,7 @@ typedef struct _XvPortRec {
 	int rc = dixLookupResourceByType((pointer *)&(pPort), portID,\
 	                                 XvRTPort, client, mode);\
 	if (rc != Success)\
-	    return (rc == BadValue) ? _XvBadPort : rc;\
+	    return rc;\
     }
 
 typedef struct {
diff --git a/Xext/xvmain.c b/Xext/xvmain.c
index f6d39d0..9a367bd 100644
--- a/Xext/xvmain.c
+++ b/Xext/xvmain.c
@@ -192,6 +192,7 @@ XvExtensionInit(void)
       EventSwapVector[XvEventBase+XvPortNotify] = 
 	(EventSwapPtr)WriteSwappedPortNotifyEvent;
 
+      SetResourceTypeErrorValue(XvRTPort, _XvBadPort);
       (void)MakeAtom(XvName, strlen(XvName), xTrue);
 
     }
diff --git a/Xext/xvmc.c b/Xext/xvmc.c
index abb8e02..7550386 100644
--- a/Xext/xvmc.c
+++ b/Xext/xvmc.c
@@ -40,7 +40,6 @@ unsigned long XvMCGeneration = 0;
 
 int XvMCReqCode;
 int XvMCEventBase;
-int XvMCErrorBase;
 
 unsigned long XvMCRTContext;
 unsigned long XvMCRTSurface;
@@ -276,7 +275,7 @@ ProcXvMCDestroyContext(ClientPtr client)
     rc = dixLookupResourceByType(&val, stuff->context_id, XvMCRTContext,
 				 client, DixDestroyAccess);
     if (rc != Success)
-	return (rc == BadValue) ? XvMCBadContext + XvMCErrorBase : rc;
+	return rc;
 
     FreeResource(stuff->context_id, RT_NONE); 
 
@@ -299,7 +298,7 @@ ProcXvMCCreateSurface(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&pContext, stuff->context_id,
 				     XvMCRTContext, client, DixUseAccess);
     if (result != Success)
-        return (result == BadValue) ? XvMCBadContext + XvMCErrorBase : result;
+        return result;
 
     pScreenPriv = XVMC_GET_PRIVATE(pContext->pScreen);
 
@@ -346,7 +345,7 @@ ProcXvMCDestroySurface(ClientPtr client)
     rc = dixLookupResourceByType(&val, stuff->surface_id, XvMCRTSurface,
 				 client, DixDestroyAccess);
     if (rc != Success)
-        return (rc == BadValue) ? XvMCBadSurface + XvMCErrorBase : rc;
+        return rc;
 
     FreeResource(stuff->surface_id, RT_NONE);
 
@@ -371,7 +370,7 @@ ProcXvMCCreateSubpicture(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&pContext, stuff->context_id,
 				     XvMCRTContext, client, DixUseAccess);
     if (result != Success)
-        return (result == BadValue) ? XvMCBadContext + XvMCErrorBase : result;
+        return result;
 
     pScreenPriv = XVMC_GET_PRIVATE(pContext->pScreen);
 
@@ -463,7 +462,7 @@ ProcXvMCDestroySubpicture(ClientPtr client)
     rc = dixLookupResourceByType(&val, stuff->subpicture_id, XvMCRTSubpicture,
 				 client, DixDestroyAccess);
     if (rc != Success)
-        return (rc == BadValue) ? XvMCBadSubpicture + XvMCErrorBase : rc;
+        return rc;
 
     FreeResource(stuff->subpicture_id, RT_NONE);
 
@@ -694,7 +693,9 @@ XvMCExtensionInit(void)
   
    XvMCReqCode = extEntry->base;
    XvMCEventBase = extEntry->eventBase;
-   XvMCErrorBase = extEntry->errorBase;
+   SetResourceTypeErrorValue(XvMCRTContext, extEntry->errorBase + XvMCBadContext);
+   SetResourceTypeErrorValue(XvMCRTSurface, extEntry->errorBase + XvMCBadSurface);
+   SetResourceTypeErrorValue(XvMCRTSubpicture, extEntry->errorBase + XvMCBadSubpicture);
 }
 
 static Bool
diff --git a/damageext/damageext.c b/damageext/damageext.c
index d923434..e4eda5e 100644
--- a/damageext/damageext.c
+++ b/damageext/damageext.c
@@ -29,7 +29,6 @@
 
 static unsigned char	DamageReqCode;
 static int		DamageEventBase;
-static int		DamageErrorBase;
 static RESTYPE		DamageExtType;
 static RESTYPE		DamageExtWinType;
 
@@ -515,8 +514,8 @@ DamageExtensionInit(void)
     {
 	DamageReqCode = (unsigned char)extEntry->base;
 	DamageEventBase = extEntry->eventBase;
-	DamageErrorBase = extEntry->errorBase;
 	EventSwapVector[DamageEventBase + XDamageNotify] =
 			(EventSwapPtr) SDamageNotifyEvent;
+	SetResourceTypeErrorValue(DamageExtType, extEntry->errorBase + BadDamage);
     }
 }
diff --git a/damageext/damageextint.h b/damageext/damageextint.h
index d40ba3e..a235cb9 100644
--- a/damageext/damageextint.h
+++ b/damageext/damageextint.h
@@ -62,7 +62,7 @@ typedef struct _DamageExt {
     int rc = dixLookupResourceByType((pointer *)&(pDamageExt), rid, \
                                      DamageExtType, client, mode); \
     if (rc != Success) \
-        return (rc == BadValue) ? DamageErrorBase + BadDamage : rc; \
+        return rc; \
 }
 
 void
diff --git a/dbe/dbe.c b/dbe/dbe.c
index a49a46d..fba10d6 100644
--- a/dbe/dbe.c
+++ b/dbe/dbe.c
@@ -422,12 +422,12 @@ ProcDbeDeallocateBackBufferName(ClientPtr client)
 				 dbeWindowPrivResType, client,
 				 DixDestroyAccess);
     if (rc != Success)
-	return (rc == BadValue) ? dbeErrorBase + DbeBadBuffer : rc;
+	return rc;
 
     rc = dixLookupResourceByType(&val, stuff->buffer, dbeDrawableResType,
 				 client, DixDestroyAccess);
     if (rc != Success)
-	return (rc == BadValue) ? dbeErrorBase + DbeBadBuffer : rc;
+	return rc;
 
     /* Make sure that the id is valid for the window.
      * This is paranoid code since we already looked up the ID by type
@@ -1672,6 +1672,8 @@ DbeExtensionInit(void)
                             DbeResetProc, StandardMinorOpcode);
 
     dbeErrorBase = extEntry->errorBase;
+    SetResourceTypeErrorValue(dbeWindowPrivResType, dbeErrorBase + DbeBadBuffer);
+    SetResourceTypeErrorValue(dbeDrawableResType, dbeErrorBase + DbeBadBuffer);
 
 } /* DbeExtensionInit() */
 
diff --git a/dix/resource.c b/dix/resource.c
index fb4473a..a6d115f 100644
--- a/dix/resource.c
+++ b/dix/resource.c
@@ -268,6 +268,12 @@ CreateNewResourceType(DeleteType deleteFunc, char *name)
     return next;
 }
 
+void
+SetResourceTypeErrorValue(RESTYPE type, int errorValue)
+{
+    resourceTypes[type & TypeMask].errorValue = errorValue;
+}
+
 RESTYPE
 CreateNewResourceClass(void)
 {
diff --git a/include/resource.h b/include/resource.h
index 96f852a..0c5a59d 100644
--- a/include/resource.h
+++ b/include/resource.h
@@ -157,6 +157,9 @@ typedef Bool (*FindComplexResType)(
 extern _X_EXPORT RESTYPE CreateNewResourceType(
     DeleteType /*deleteFunc*/, char * /*name*/);
 
+extern _X_EXPORT void SetResourceTypeErrorValue(
+    RESTYPE /*type*/, int /*errorValue*/);
+
 extern _X_EXPORT RESTYPE CreateNewResourceClass(void);
 
 extern _X_EXPORT Bool InitClientResources(
diff --git a/randr/randrstr.h b/randr/randrstr.h
index b163a73..a18c834 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -344,7 +344,7 @@ extern _X_EXPORT RESTYPE RRCrtcType, RRModeType, RROutputType;
 	                                 RROutputType, client, a);\
 	if (rc != Success) {\
 	    client->errorValue = id;\
-	    return (rc == BadValue) ? RRErrorBase + BadRROutput : rc;\
+	    return rc;\
 	}\
     }
 
@@ -354,7 +354,7 @@ extern _X_EXPORT RESTYPE RRCrtcType, RRModeType, RROutputType;
 	                                 RRCrtcType, client, a);\
 	if (rc != Success) {\
 	    client->errorValue = id;\
-	    return (rc == BadValue) ? RRErrorBase + BadRRCrtc : rc;\
+	    return rc;\
 	}\
     }
 
@@ -364,7 +364,7 @@ extern _X_EXPORT RESTYPE RRCrtcType, RRModeType, RROutputType;
 	                                 RRModeType, client, a);\
 	if (rc != Success) {\
 	    client->errorValue = id;\
-	    return (rc == BadValue) ? RRErrorBase + BadRRMode : rc;\
+	    return rc;\
 	}\
     }
 
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index 95e74c5..987f772 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -634,6 +634,7 @@ RRCrtcInit (void)
     RRCrtcType = CreateNewResourceType (RRCrtcDestroyResource, "CRTC");
     if (!RRCrtcType)
 	return FALSE;
+    SetResourceTypeErrorValue(RRCrtcType, RRErrorBase + BadRRCrtc);
     return TRUE;
 }
 
@@ -806,7 +807,7 @@ ProcRRSetCrtcConfig (ClientPtr client)
 	{
 	    if (outputs)
 		free(outputs);
-	    return (rc == BadValue) ? RRErrorBase + BadRROutput : rc;
+	    return rc;
 	}
 	/* validate crtc for this output */
 	for (j = 0; j < outputs[i]->numCrtcs; j++)
diff --git a/randr/rrmode.c b/randr/rrmode.c
index e73d1ac..deddd3c 100644
--- a/randr/rrmode.c
+++ b/randr/rrmode.c
@@ -268,6 +268,7 @@ RRModeInit (void)
     RRModeType = CreateNewResourceType (RRModeDestroyResource, "MODE");
     if (!RRModeType)
 	return FALSE;
+    SetResourceTypeErrorValue(RRModeType, RRErrorBase + BadRRMode);
     return TRUE;
 }
 
diff --git a/randr/rroutput.c b/randr/rroutput.c
index 445c318..7822c0d 100644
--- a/randr/rroutput.c
+++ b/randr/rroutput.c
@@ -423,6 +423,7 @@ RROutputInit (void)
     RROutputType = CreateNewResourceType (RROutputDestroyResource, "OUTPUT");
     if (!RROutputType)
 	return FALSE;
+    SetResourceTypeErrorValue(RROutputType, RRErrorBase + BadRROutput);
     return TRUE;
 }
 
diff --git a/record/record.c b/record/record.c
index 1b55d6b..3724dc7 100644
--- a/record/record.c
+++ b/record/record.c
@@ -58,7 +58,6 @@ and Jim Haggerty of Metheus.
 #include "protocol-versions.h"
 
 static RESTYPE RTContext;   /* internal resource type for Record contexts */
-static int RecordErrorBase; /* first Record error number */
 
 /* How many bytes of protocol data to buffer in a context. Don't set to less
  * than 32.
@@ -133,7 +132,7 @@ static int numEnabledRCAPs;
     int rc = dixLookupResourceByType((pointer *)&(_pContext), _contextid, \
                                      RTContext, _client, DixUseAccess); \
     if (rc != Success) \
-	return (rc == BadValue) ? RecordErrorBase + XRecordBadContext : rc; \
+	return rc; \
 }
 
 static int RecordDeleteContext(
@@ -2911,7 +2910,7 @@ RecordExtensionInit(void)
 	DeleteCallback(&ClientStateCallback, RecordAClientStateChange, NULL);
 	return;
     }
-    RecordErrorBase = extentry->errorBase;
+    SetResourceTypeErrorValue(RTContext, extentry->errorBase + XRecordBadContext);
 
 } /* RecordExtensionInit */
 
diff --git a/render/picture.c b/render/picture.c
index 86e2e0f..211fa38 100644
--- a/render/picture.c
+++ b/render/picture.c
@@ -1115,7 +1115,6 @@ ChangePicture (PicturePtr	pPicture,
 			if (error != Success)
 			{
 			    client->errorValue = pid;
-			    error = (error == BadValue) ? RenderErrBase + BadPicture : error;
 			    break;
 			}
 			if (pAlpha->pDrawable == NULL ||
diff --git a/render/picturestr.h b/render/picturestr.h
index 5a796f4..a401108 100644
--- a/render/picturestr.h
+++ b/render/picturestr.h
@@ -412,7 +412,7 @@ extern _X_EXPORT RESTYPE	GlyphSetType;
     int rc = dixLookupResourceByType((pointer)&(pPicture), pid,\
 	                             PictureType, client, mode);\
     if (rc != Success)\
-	return (rc == BadValue) ? RenderErrBase + BadPicture : rc;\
+	return rc;\
 }
 
 #define VERIFY_ALPHA(pPicture, pid, client, mode) {\
diff --git a/render/render.c b/render/render.c
index fc6dbb1..b58dd3e 100644
--- a/render/render.c
+++ b/render/render.c
@@ -233,6 +233,10 @@ RenderClientCallback (CallbackListPtr	*list,
     pRenderClient->minor_version = 0;
 }
 
+#ifdef PANORAMIX
+unsigned long	XRT_PICTURE;
+#endif
+
 void
 RenderExtensionInit (void)
 {
@@ -253,6 +257,13 @@ RenderExtensionInit (void)
     if (!extEntry)
 	return;
     RenderErrBase = extEntry->errorBase;
+#ifdef PANORAMIX
+    if (XRT_PICTURE)
+	SetResourceTypeErrorValue(XRT_PICTURE, RenderErrBase + BadPicture);
+#endif
+    SetResourceTypeErrorValue(PictureType, RenderErrBase + BadPicture);
+    SetResourceTypeErrorValue(PictFormatType, RenderErrBase + BadPictFormat);
+    SetResourceTypeErrorValue(GlyphSetType, RenderErrBase + BadGlyphSet);
 }
 
 static int
@@ -532,7 +543,7 @@ ProcRenderQueryPictIndexValues (ClientPtr client)
     rc = dixLookupResourceByType((pointer *)&pFormat, stuff->format,
 				 PictFormatType, client, DixReadAccess);
     if (rc != Success)
-	return (rc == BadValue) ? RenderErrBase + BadPictFormat : rc;
+	return rc;
 
     if (pFormat->type != PictTypeIndexed)
     {
@@ -601,7 +612,7 @@ ProcRenderCreatePicture (ClientPtr client)
     rc = dixLookupResourceByType((pointer *)&pFormat, stuff->format,
 				 PictFormatType, client, DixReadAccess);
     if (rc != Success)
-	return (rc == BadValue) ? RenderErrBase + BadPictFormat : rc;
+	return rc;
 
     if (pFormat->depth != pDrawable->depth)
 	return BadMatch;
@@ -755,7 +766,7 @@ ProcRenderTrapezoids (ClientPtr client)
 	rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat,
 				     PictFormatType, client, DixReadAccess);
 	if (rc != Success)
-	    return (rc == BadValue) ? RenderErrBase + BadPictFormat : rc;
+	    return rc;
     }
     else
 	pFormat = 0;
@@ -795,7 +806,7 @@ ProcRenderTriangles (ClientPtr client)
 	rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat,
 				     PictFormatType, client, DixReadAccess);
 	if (rc != Success)
-	    return (rc == BadValue) ? RenderErrBase + BadPictFormat : rc;
+	    return rc;
     }
     else
 	pFormat = 0;
@@ -835,7 +846,7 @@ ProcRenderTriStrip (ClientPtr client)
 	rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat,
 				     PictFormatType, client, DixReadAccess);
 	if (rc != Success)
-	    return (rc == BadValue) ? RenderErrBase + BadPictFormat : rc;
+	    return rc;
     }
     else
 	pFormat = 0;
@@ -875,7 +886,7 @@ ProcRenderTriFan (ClientPtr client)
 	rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat,
 				     PictFormatType, client, DixReadAccess);
 	if (rc != Success)
-	    return (rc == BadValue) ? RenderErrBase + BadPictFormat : rc;
+	    return rc;
     }
     else
 	pFormat = 0;
@@ -922,7 +933,7 @@ ProcRenderCreateGlyphSet (ClientPtr client)
     rc = dixLookupResourceByType((pointer *)&format, stuff->format,
 				 PictFormatType, client, DixReadAccess);
     if (rc != Success)
-	return (rc == BadValue) ? RenderErrBase + BadPictFormat : rc;
+	return rc;
 
     switch (format->depth) {
     case 1:
@@ -974,7 +985,7 @@ ProcRenderReferenceGlyphSet (ClientPtr client)
     if (rc != Success)
     {
 	client->errorValue = stuff->existing;
-	return (rc == BadValue) ? RenderErrBase + BadGlyphSet : rc;
+	return rc;
     }
     glyphSet->refcnt++;
     if (!AddResource (stuff->gsid, GlyphSetType, (pointer)glyphSet))
@@ -998,7 +1009,7 @@ ProcRenderFreeGlyphSet (ClientPtr client)
     if (rc != Success)
     {
 	client->errorValue = stuff->glyphset;
-	return (rc == BadValue) ? RenderErrBase + BadGlyphSet : rc;
+	return rc;
     }
     FreeResource (stuff->glyphset, RT_NONE);
     return Success;
@@ -1037,7 +1048,7 @@ ProcRenderAddGlyphs (ClientPtr client)
     if (err != Success)
     {
 	client->errorValue = stuff->glyphset;
-	return (err == BadValue) ? RenderErrBase + BadGlyphSet : err;
+	return err;
     }
 
     err = BadAlloc;
@@ -1238,7 +1249,7 @@ ProcRenderFreeGlyphs (ClientPtr client)
     if (rc != Success)
     {
 	client->errorValue = stuff->glyphset;
-	return (rc == BadValue) ? RenderErrBase + BadGlyphSet : rc;
+	return rc;
     }
     nglyph = bytes_to_int32((client->req_len << 2) - sizeof (xRenderFreeGlyphsReq));
     gids = (CARD32 *) (stuff + 1);
@@ -1300,7 +1311,7 @@ ProcRenderCompositeGlyphs (ClientPtr client)
 	rc = dixLookupResourceByType((pointer *)&pFormat, stuff->maskFormat,
 				     PictFormatType, client, DixReadAccess);
 	if (rc != Success)
-	    return (rc == BadValue) ? RenderErrBase + BadPictFormat : rc;
+	    return rc;
     }
     else
 	pFormat = 0;
@@ -1308,7 +1319,7 @@ ProcRenderCompositeGlyphs (ClientPtr client)
     rc = dixLookupResourceByType((pointer *)&glyphSet, stuff->glyphset,
 				 GlyphSetType, client, DixUseAccess);
     if (rc != Success)
-	return (rc == BadValue) ? RenderErrBase + BadGlyphSet : rc;
+	return rc;
 
     buffer = (CARD8 *) (stuff + 1);
     end = (CARD8 *) stuff + (client->req_len << 2);
@@ -1371,7 +1382,7 @@ ProcRenderCompositeGlyphs (ClientPtr client)
 			free(glyphsBase);
 		    if (listsBase != listsLocal)
 			free(listsBase);
-		    return (rc == BadValue) ? RenderErrBase + BadGlyphSet : rc;
+		    return rc;
 		}
 	    }
 	    buffer += 4;
@@ -2639,7 +2650,7 @@ SProcRenderDispatch (ClientPtr client)
     int rc = dixLookupResourceByType((pointer *)&(pPicture), pid,\
                                      XRT_PICTURE, client, mode);\
     if (rc != Success)\
-	return (rc == BadValue) ? RenderErrBase + BadPicture : rc;\
+	return rc;\
 }
 
 #define VERIFY_XIN_ALPHA(pPicture, pid, client, mode) {\
@@ -2652,8 +2663,6 @@ SProcRenderDispatch (ClientPtr client)
 
 int	    (*PanoramiXSaveRenderVector[RenderNumberRequests])(ClientPtr);
 
-unsigned long	XRT_PICTURE;
-
 static int
 PanoramiXRenderCreatePicture (ClientPtr client)
 {
@@ -3330,6 +3339,8 @@ PanoramiXRenderInit (void)
     
     XRT_PICTURE = CreateNewResourceType (XineramaDeleteResource,
 					 "XineramaPicture");
+    if (RenderErrBase)
+	SetResourceTypeErrorValue(XRT_PICTURE, RenderErrBase + BadPicture);
     for (i = 0; i < RenderNumberRequests; i++)
 	PanoramiXSaveRenderVector[i] = ProcRenderVector[i];
     /*
@@ -3365,6 +3376,7 @@ PanoramiXRenderReset (void)
     int	    i;
     for (i = 0; i < RenderNumberRequests; i++)
 	ProcRenderVector[i] = PanoramiXSaveRenderVector[i];
+    RenderErrBase = 0;
 }
 
 #endif	/* PANORAMIX */
diff --git a/xfixes/xfixes.c b/xfixes/xfixes.c
index 49ed5a0..2f64a04 100644
--- a/xfixes/xfixes.c
+++ b/xfixes/xfixes.c
@@ -259,5 +259,6 @@ XFixesExtensionInit(void)
 	    (EventSwapPtr) SXFixesSelectionNotifyEvent;
 	EventSwapVector[XFixesEventBase + XFixesCursorNotify] =
 	    (EventSwapPtr) SXFixesCursorNotifyEvent;
+	SetResourceTypeErrorValue(RegionResType, XFixesErrorBase + BadRegion);
     }
 }
diff --git a/xfixes/xfixes.h b/xfixes/xfixes.h
index 69d162f..1638350 100644
--- a/xfixes/xfixes.h
+++ b/xfixes/xfixes.h
@@ -37,10 +37,7 @@ extern _X_EXPORT int XFixesErrorBase;
 	int err;							\
 	err = dixLookupResourceByType((pointer *) &pRegion, rid,	\
 				      RegionResType, client, mode);	\
-	if (err == BadValue) {						\
-	    client->errorValue = rid;					\
-	    return XFixesErrorBase + BadRegion;				\
-	} else if (err != Success) {					\
+	if (err != Success) {						\
 	    client->errorValue = rid;					\
 	    return err;							\
 	}								\
commit e291c561821ae86b7dd74269d5cd29bc31703962
Author: Jamey Sharp <jamey at minilop.net>
Date:   Sat Apr 24 23:26:40 2010 -0700

    Return an appropriately-typed error from dixLookupResourceByType.
    
    Rather than always returning BadValue, associate an error status like
    BadWindow with a resource type like RT_WINDOW, and return the
    appropriate one for the requested type.
    
    This patch only touches the core protocol resource types. Others still
    return BadValue and need to be mapped appropriately.
    
    dixLookupResourceByType can now return BadImplementation, if the caller
    asked for a resource type that has not been allocated in the server.
    
    Signed-off-by: Jamey Sharp <jamey at minilop.net>
    Reviewed-by: Adam Jackson <ajax at redhat.com>

diff --git a/Xext/panoramiXprocs.c b/Xext/panoramiXprocs.c
index a181695..dbaae26 100644
--- a/Xext/panoramiXprocs.c
+++ b/Xext/panoramiXprocs.c
@@ -457,7 +457,7 @@ int PanoramiXConfigureWindow(ClientPtr client)
     result = dixLookupResourceByType((pointer *)&pWin, stuff->window,
 				     RT_WINDOW, client, DixWriteAccess);
     if (result != Success)
-	return (result == BadValue) ? BadWindow : result;
+	return result;
 
     result = dixLookupResourceByType((pointer *)&win, stuff->window,
 				     XRT_WINDOW, client, DixWriteAccess);
diff --git a/Xext/saver.c b/Xext/saver.c
index 30c4a8c..63a41d6 100644
--- a/Xext/saver.c
+++ b/Xext/saver.c
@@ -1043,7 +1043,6 @@ ScreenSaverSetAttributes (ClientPtr client)
 		}
 	        else
 		{
-		    ret = (ret == BadValue) ? BadPixmap : ret;
 		    client->errorValue = pixID;
 		    goto PatchUp;
 		}
@@ -1081,7 +1080,6 @@ ScreenSaverSetAttributes (ClientPtr client)
 		}
     	        else
 		{
-		    ret = (ret == BadValue) ? BadPixmap : ret;
 		    client->errorValue = pixID;
 		    goto PatchUp;
 		}
@@ -1163,7 +1161,6 @@ ScreenSaverSetAttributes (ClientPtr client)
 				    client, DixUseAccess);
 	    if (ret != Success)
 	    {
-		ret = (ret == BadValue) ? BadColor : ret;
 		client->errorValue = cmap;
 		goto PatchUp;
 	    }
@@ -1187,7 +1184,6 @@ ScreenSaverSetAttributes (ClientPtr client)
 					RT_CURSOR, client, DixUseAccess);
 	    	if (ret != Success)
 	    	{
-		    ret = (ret == BadValue) ? BadCursor : ret;
 		    client->errorValue = cursorID;
 		    goto PatchUp;
 	    	}
diff --git a/Xext/shape.c b/Xext/shape.c
index 10ac283..f49e9a0 100644
--- a/Xext/shape.c
+++ b/Xext/shape.c
@@ -415,7 +415,7 @@ ProcShapeMask (ClientPtr client)
 	rc = dixLookupResourceByType((pointer *)&pPixmap, stuff->src, RT_PIXMAP,
 			       client, DixReadAccess);
         if (rc != Success)
-	    return (rc == BadValue) ? BadPixmap : rc;
+	    return rc;
 	if (pPixmap->drawable.pScreen != pScreen ||
 	    pPixmap->drawable.depth != 1)
 	    return BadMatch;
diff --git a/Xext/xtest.c b/Xext/xtest.c
index 09c4677..263d0c1 100644
--- a/Xext/xtest.c
+++ b/Xext/xtest.c
@@ -153,7 +153,7 @@ ProcXTestCompareCursor(ClientPtr client)
         if (rc != Success)
         {
             client->errorValue = stuff->cursor;
-            return (rc == BadValue) ? BadCursor : rc;
+            return rc;
         }
     }
     rep.type = X_Reply;
diff --git a/Xi/exevents.c b/Xi/exevents.c
index b24204d..41b396c 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1445,7 +1445,7 @@ GrabButton(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr modifier_device,
 	if (rc != Success)
 	{
 	    client->errorValue = param->cursor;
-	    return (rc == BadValue) ? BadCursor : rc;
+	    return rc;
 	}
 	access_mode |= DixForceAccess;
     }
@@ -1543,7 +1543,7 @@ GrabWindow(ClientPtr client, DeviceIntPtr dev, int type,
 	if (rc != Success)
 	{
 	    client->errorValue = param->cursor;
-	    return (rc == BadValue) ? BadCursor : rc;
+	    return rc;
 	}
 	access_mode |= DixForceAccess;
     }
diff --git a/Xi/xichangecursor.c b/Xi/xichangecursor.c
index f071e84..e72cfac 100644
--- a/Xi/xichangecursor.c
+++ b/Xi/xichangecursor.c
@@ -103,7 +103,7 @@ int ProcXIChangeCursor(ClientPtr client)
 	rc = dixLookupResourceByType((pointer *)&pCursor, stuff->cursor,
 				     RT_CURSOR, client, DixUseAccess);
 	if (rc != Success)
-	    return (rc == BadValue) ? BadCursor : rc;
+	    return rc;
     }
 
     ChangeWindowDeviceCursor(pWin, pDev, pCursor);
diff --git a/Xi/xipassivegrab.c b/Xi/xipassivegrab.c
index a62fe79..2966145 100644
--- a/Xi/xipassivegrab.c
+++ b/Xi/xipassivegrab.c
@@ -147,7 +147,7 @@ ProcXIPassiveGrabDevice(ClientPtr client)
 	if (status != Success)
 	{
 	    client->errorValue = stuff->cursor;
-	    return (status == BadValue) ? BadCursor : status;
+	    return status;
 	}
     }
 
diff --git a/composite/compext.c b/composite/compext.c
index 3bb9a37..ed43775 100644
--- a/composite/compext.c
+++ b/composite/compext.c
@@ -140,10 +140,7 @@ ProcCompositeQueryVersion (ClientPtr client)
 	int err;							\
 	err = dixLookupResourceByType((pointer *) &pWindow, wid,	\
 				      RT_WINDOW, client, mode);		\
-	if (err == BadValue) {						\
-	    client->errorValue = wid;					\
-	    return BadWindow;						\
-	} else if (err != Success) {					\
+	if (err != Success) {						\
 	    client->errorValue = wid;					\
 	    return err;							\
 	}								\
diff --git a/dix/cursor.c b/dix/cursor.c
index a512309..7ff0a93 100644
--- a/dix/cursor.c
+++ b/dix/cursor.c
@@ -316,14 +316,14 @@ AllocGlyphCursor(Font source, unsigned sourceChar, Font mask, unsigned maskChar,
     if (rc != Success)
     {
 	client->errorValue = source;
-	return (rc == BadValue) ? BadFont : rc;
+	return rc;
     }
     rc = dixLookupResourceByType((pointer *)&maskfont, mask, RT_FONT, client,
 				 DixUseAccess);
     if (rc != Success && mask != None)
     {
 	client->errorValue = mask;
-	return (rc == BadValue) ? BadFont : rc;
+	return rc;
     }
     if (sourcefont != maskfont)
 	pShare = (GlyphSharePtr)NULL;
diff --git a/dix/dispatch.c b/dix/dispatch.c
index c9e3188..c86011a 100644
--- a/dix/dispatch.c
+++ b/dix/dispatch.c
@@ -1240,7 +1240,7 @@ ProcCloseFont(ClientPtr client)
     else
     {
 	client->errorValue = stuff->id;
-        return (rc == BadValue) ? BadFont : rc;
+        return rc;
     }
 }
 
@@ -1453,7 +1453,7 @@ ProcFreePixmap(ClientPtr client)
     else 
     {
 	client->errorValue = stuff->id;
-	return (rc == BadValue) ? BadPixmap : rc;
+	return rc;
     }
 }
 
@@ -2407,7 +2407,7 @@ ProcFreeColormap(ClientPtr client)
     else 
     {
 	client->errorValue = stuff->id;
-	return (rc == BadValue) ? BadColor : rc;
+	return rc;
     }
 }
 
@@ -2428,7 +2428,7 @@ ProcCopyColormapAndFree(ClientPtr client)
     if (rc == Success)
 	return CopyColormapAndFree(mid, pSrcMap, client->index);
     client->errorValue = stuff->srcCmap;
-    return (rc == BadValue) ? BadColor : rc;
+    return rc;
 }
 
 int
@@ -2445,15 +2445,18 @@ ProcInstallColormap(ClientPtr client)
 	goto out;
 
     rc = XaceHook(XACE_SCREEN_ACCESS, client, pcmp->pScreen, DixSetAttrAccess);
-    if (rc != Success)
+    if (rc != Success) {
+	if (rc == BadValue)
+	    rc = BadColor;
 	goto out;
+    }
 
     (*(pcmp->pScreen->InstallColormap)) (pcmp);
     return Success;
 
 out:
     client->errorValue = stuff->id;
-    return (rc == BadValue) ? BadColor : rc;
+    return rc;
 }
 
 int
@@ -2470,8 +2473,11 @@ ProcUninstallColormap(ClientPtr client)
 	goto out;
 
     rc = XaceHook(XACE_SCREEN_ACCESS, client, pcmp->pScreen, DixSetAttrAccess);
-    if (rc != Success)
+    if (rc != Success) {
+	if (rc == BadValue)
+	    rc = BadColor;
 	goto out;
+    }
 
     if(pcmp->mid != pcmp->pScreen->defColormap)
 	(*(pcmp->pScreen->UninstallColormap)) (pcmp);
@@ -2479,7 +2485,7 @@ ProcUninstallColormap(ClientPtr client)
 
 out:
     client->errorValue = stuff->id;
-    return (rc == BadValue) ? BadColor : rc;
+    return rc;
 }
 
 int
@@ -2552,7 +2558,7 @@ ProcAllocColor (ClientPtr client)
     else
     {
         client->errorValue = stuff->cmap;
-        return (rc == BadValue) ? BadColor : rc;
+        return rc;
     }
 }
 
@@ -2598,7 +2604,7 @@ ProcAllocNamedColor (ClientPtr client)
     else
     {
         client->errorValue = stuff->cmap;
-        return (rc == BadValue) ? BadColor : rc;
+        return rc;
     }
 }
 
@@ -2662,7 +2668,7 @@ ProcAllocColorCells (ClientPtr client)
     else
     {
         client->errorValue = stuff->cmap;
-        return (rc == BadValue) ? BadColor : rc;
+        return rc;
     }
 }
 
@@ -2724,7 +2730,7 @@ ProcAllocColorPlanes(ClientPtr client)
     else
     {
         client->errorValue = stuff->cmap;
-        return (rc == BadValue) ? BadColor : rc;
+        return rc;
     }
 }
 
@@ -2751,7 +2757,7 @@ ProcFreeColors(ClientPtr client)
     else
     {
         client->errorValue = stuff->cmap;
-        return (rc == BadValue) ? BadColor : rc;
+        return rc;
     }
 }
 
@@ -2778,7 +2784,7 @@ ProcStoreColors (ClientPtr client)
     else
     {
         client->errorValue = stuff->cmap;
-        return (rc == BadValue) ? BadColor : rc;
+        return rc;
     }
 }
 
@@ -2808,7 +2814,7 @@ ProcStoreNamedColor (ClientPtr client)
     else
     {
         client->errorValue = stuff->cmap;
-        return (rc == BadValue) ? BadColor : rc;
+        return rc;
     }
 }
 
@@ -2855,7 +2861,7 @@ ProcQueryColors(ClientPtr client)
     else
     {
         client->errorValue = stuff->cmap;
-        return (rc == BadValue) ? BadColor : rc;
+        return rc;
     }
 } 
 
@@ -2894,7 +2900,7 @@ ProcLookupColor(ClientPtr client)
     else
     {
         client->errorValue = stuff->cmap;
-        return (rc == BadValue) ? BadColor : rc;
+        return rc;
     }
 }
 
@@ -2920,7 +2926,7 @@ ProcCreateCursor (ClientPtr client)
 			   DixReadAccess);
     if (rc != Success) {
 	client->errorValue = stuff->source;
-	return (rc == BadValue) ? BadPixmap : rc;
+	return rc;
     }
 
     rc = dixLookupResourceByType((pointer *)&msk, stuff->mask, RT_PIXMAP, client,
@@ -2930,7 +2936,7 @@ ProcCreateCursor (ClientPtr client)
 	if (stuff->mask != None)
 	{
 	    client->errorValue = stuff->mask;
-	    return (rc == BadValue) ? BadPixmap : rc;
+	    return rc;
 	}
     }
     else if (  src->drawable.width != msk->drawable.width
@@ -3031,7 +3037,7 @@ ProcFreeCursor (ClientPtr client)
     else 
     {
 	client->errorValue = stuff->id;
-	return (rc == BadValue) ? BadCursor : rc;
+	return rc;
     }
 }
 
diff --git a/dix/dixfonts.c b/dix/dixfonts.c
index 585754b..ba1d0e2 100644
--- a/dix/dixfonts.c
+++ b/dix/dixfonts.c
@@ -1238,7 +1238,6 @@ doPolyText(ClientPtr client, PTclosurePtr c)
 					  client, DixUseAccess);
 	    if (err != Success)
 	    {
-		err = (err == BadValue) ? BadFont : err;
 		/* restore pFont and fid for step 4 (described below) */
 		pFont = oldpFont;
 		fid = oldfid;
diff --git a/dix/dixutils.c b/dix/dixutils.c
index 5955eb8..51dbd14 100644
--- a/dix/dixutils.c
+++ b/dix/dixutils.c
@@ -231,9 +231,7 @@ dixLookupWindow(WindowPtr *pWin, XID id, ClientPtr client, Mask access)
 int
 dixLookupGC(GCPtr *pGC, XID id, ClientPtr client, Mask access)
 {
-    int rc;
-    rc = dixLookupResourceByType((pointer *)pGC, id, RT_GC, client, access);
-    return (rc == BadValue) ? BadGC : rc;
+    return dixLookupResourceByType((pointer *)pGC, id, RT_GC, client, access);
 }
 
 int
@@ -243,10 +241,10 @@ dixLookupFontable(FontPtr *pFont, XID id, ClientPtr client, Mask access)
     GC *pGC;
     client->errorValue = id;		/* EITHER font or gc */
     rc = dixLookupResourceByType((pointer *) pFont, id, RT_FONT, client, access);
-    if (rc != BadValue)
+    if (rc != BadFont)
 	return rc;
     rc = dixLookupResourceByType((pointer *) &pGC, id, RT_GC, client, access);
-    if (rc == BadValue)
+    if (rc == BadGC)
 	return BadFont;
     if (rc == Success)
 	*pFont = pGC->font;
diff --git a/dix/events.c b/dix/events.c
index 39ad400..9e05dc9 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4697,7 +4697,7 @@ ProcChangeActivePointerGrab(ClientPtr client)
 	if (rc != Success)
 	{
 	    client->errorValue = stuff->cursor;
-	    return (rc == BadValue) ? BadCursor : rc;
+	    return rc;
 	}
     }
 
@@ -4820,7 +4820,7 @@ GrabDevice(ClientPtr client, DeviceIntPtr dev,
 	if (rc != Success)
 	{
 	    client->errorValue = curs;
-	    return (rc == BadValue) ? BadCursor : rc;
+	    return rc;
 	}
 	access_mode |= DixForceAccess;
     }
@@ -5345,7 +5345,7 @@ ProcGrabButton(ClientPtr client)
 	if (rc != Success)
 	{
 	    client->errorValue = stuff->cursor;
-	    return (rc == BadValue) ? BadCursor : rc;
+	    return rc;
 	}
 	access_mode |= DixForceAccess;
     }
@@ -5608,7 +5608,7 @@ ProcRecolorCursor(ClientPtr client)
     if (rc != Success)
     {
 	client->errorValue = stuff->cursor;
-	return (rc == BadValue) ? BadCursor : rc;
+	return rc;
     }
 
     pCursor->foreRed = stuff->foreRed;
diff --git a/dix/gc.c b/dix/gc.c
index 6281f25..65d05eb 100644
--- a/dix/gc.c
+++ b/dix/gc.c
@@ -458,8 +458,6 @@ ChangeGCXIDs(ClientPtr client, GC *pGC, BITS32 mask, CARD32 *pC32)
 	if (rc != Success)
 	{
 	    client->errorValue = vals[offset].val;
-	    if (rc == BadValue)
-		rc = (xidfields[i].type == RT_PIXMAP) ? BadPixmap : BadFont;
 	    return rc;
 	}
     }
diff --git a/dix/resource.c b/dix/resource.c
index 143b51a..fb4473a 100644
--- a/dix/resource.c
+++ b/dix/resource.c
@@ -183,7 +183,54 @@ RESTYPE lastResourceType;
 static RESTYPE lastResourceClass;
 RESTYPE TypeMask;
 
-static DeleteType *DeleteFuncs = (DeleteType *)NULL;
+struct ResourceType {
+    DeleteType deleteFunc;
+    int errorValue;
+};
+
+static struct ResourceType *resourceTypes;
+static const struct ResourceType predefTypes[] = {
+    [RT_NONE & (RC_LASTPREDEF - 1)] = {
+	.deleteFunc = (DeleteType)NoopDDA,
+	.errorValue = BadValue,
+    },
+    [RT_WINDOW & (RC_LASTPREDEF - 1)] = {
+	.deleteFunc = DeleteWindow,
+	.errorValue = BadWindow,
+    },
+    [RT_PIXMAP & (RC_LASTPREDEF - 1)] = {
+	.deleteFunc = dixDestroyPixmap,
+	.errorValue = BadPixmap,
+    },
+    [RT_GC & (RC_LASTPREDEF - 1)] = {
+	.deleteFunc = FreeGC,
+	.errorValue = BadGC,
+    },
+    [RT_FONT & (RC_LASTPREDEF - 1)] = {
+	.deleteFunc = CloseFont,
+	.errorValue = BadFont,
+    },
+    [RT_CURSOR & (RC_LASTPREDEF - 1)] = {
+	.deleteFunc = FreeCursor,
+	.errorValue = BadCursor,
+    },
+    [RT_COLORMAP & (RC_LASTPREDEF - 1)] = {
+	.deleteFunc = FreeColormap,
+	.errorValue = BadColor,
+    },
+    [RT_CMAPENTRY & (RC_LASTPREDEF - 1)] = {
+	.deleteFunc = FreeClientPixels,
+	.errorValue = BadColor,
+    },
+    [RT_OTHERCLIENT & (RC_LASTPREDEF - 1)] = {
+	.deleteFunc = OtherClientGone,
+	.errorValue = BadValue,
+    },
+    [RT_PASSIVEGRAB & (RC_LASTPREDEF - 1)] = {
+	.deleteFunc = DeletePassiveGrab,
+	.errorValue = BadValue,
+    },
+};
 
 CallbackListPtr ResourceStateCallback;
 
@@ -200,20 +247,20 @@ RESTYPE
 CreateNewResourceType(DeleteType deleteFunc, char *name)
 {
     RESTYPE next = lastResourceType + 1;
-    DeleteType *funcs;
+    struct ResourceType *types;
 
     if (next & lastResourceClass)
 	return 0;
-    funcs = (DeleteType *)realloc(DeleteFuncs,
-				   (next + 1) * sizeof(DeleteType));
-    if (!funcs)
+    types = realloc(resourceTypes, (next + 1) * sizeof(*resourceTypes));
+    if (!types)
 	return 0;
     if (!dixRegisterPrivateOffset(next, -1))
 	return 0;
 
     lastResourceType = next;
-    DeleteFuncs = funcs;
-    DeleteFuncs[next] = deleteFunc;
+    resourceTypes = types;
+    resourceTypes[next].deleteFunc = deleteFunc;
+    resourceTypes[next].errorValue = BadValue;
 
     /* Called even if name is NULL, to remove any previous entry */
     RegisterResourceName(next, name);
@@ -251,21 +298,11 @@ InitClientResources(ClientPtr client)
 	lastResourceType = RT_LASTPREDEF;
 	lastResourceClass = RC_LASTPREDEF;
 	TypeMask = RC_LASTPREDEF - 1;
-	if (DeleteFuncs)
-	    free(DeleteFuncs);
-	DeleteFuncs = malloc((lastResourceType + 1) * sizeof(DeleteType));
-	if (!DeleteFuncs)
+	free(resourceTypes);
+	resourceTypes = malloc(sizeof(predefTypes));
+	if (!resourceTypes)
 	    return FALSE;
-	DeleteFuncs[RT_NONE & TypeMask] = (DeleteType)NoopDDA;
-	DeleteFuncs[RT_WINDOW & TypeMask] = DeleteWindow;
-	DeleteFuncs[RT_PIXMAP & TypeMask] = dixDestroyPixmap;
-	DeleteFuncs[RT_GC & TypeMask] = FreeGC;
-	DeleteFuncs[RT_FONT & TypeMask] = CloseFont;
-	DeleteFuncs[RT_CURSOR & TypeMask] = FreeCursor;
-	DeleteFuncs[RT_COLORMAP & TypeMask] = FreeColormap;
-	DeleteFuncs[RT_CMAPENTRY & TypeMask] = FreeClientPixels;
-	DeleteFuncs[RT_OTHERCLIENT & TypeMask] = OtherClientGone;
-	DeleteFuncs[RT_PASSIVEGRAB & TypeMask] = DeletePassiveGrab;
+	memcpy(resourceTypes, predefTypes, sizeof(predefTypes));
     }
     clientTable[i = client->index].resources =
 	malloc(INITBUCKETS*sizeof(ResourcePtr));
@@ -462,7 +499,7 @@ AddResource(XID id, RESTYPE type, pointer value)
     res = malloc(sizeof(ResourceRec));
     if (!res)
     {
-	(*DeleteFuncs[type & TypeMask])(value, id);
+	(*resourceTypes[type & TypeMask].deleteFunc)(value, id);
 	return FALSE;
     }
     res->next = *head;
@@ -557,7 +594,7 @@ FreeResource(XID id, RESTYPE skipDeleteFuncType)
 		CallResourceStateCallback(ResourceStateFreeing, res);
 
 		if (rtype != skipDeleteFuncType)
-		    (*DeleteFuncs[rtype & TypeMask])(res->value, res->id);
+		    (*resourceTypes[rtype & TypeMask].deleteFunc)(res->value, res->id);
 		free(res);
 		if (*eltptr != elements)
 		    prev = head; /* prev may no longer be valid */
@@ -594,7 +631,7 @@ FreeResourceByType(XID id, RESTYPE type, Bool skipFree)
 		CallResourceStateCallback(ResourceStateFreeing, res);
 
 		if (!skipFree)
-		    (*DeleteFuncs[type & TypeMask])(res->value, res->id);
+		    (*resourceTypes[type & TypeMask].deleteFunc)(res->value, res->id);
 		free(res);
 		break;
 	    }
@@ -761,7 +798,7 @@ FreeClientNeverRetainResources(ClientPtr client)
 		CallResourceStateCallback(ResourceStateFreeing, this);
 
 		elements = *eltptr;
-		(*DeleteFuncs[rtype & TypeMask])(this->value, this->id);
+		(*resourceTypes[rtype & TypeMask].deleteFunc)(this->value, this->id);
 		free(this);
 		if (*eltptr != elements)
 		    prev = &resources[j]; /* prev may no longer be valid */
@@ -815,7 +852,7 @@ FreeClientResources(ClientPtr client)
 
 	    CallResourceStateCallback(ResourceStateFreeing, this);
 
-	    (*DeleteFuncs[rtype & TypeMask])(this->value, this->id);
+	    (*resourceTypes[rtype & TypeMask].deleteFunc)(this->value, this->id);
 	    free(this);
 	}
     }
@@ -873,6 +910,8 @@ dixLookupResourceByType(pointer *result, XID id, RESTYPE rtype,
     ResourcePtr res = NULL;
 
     *result = NULL;
+    if ((rtype & TypeMask) > lastResourceType)
+	return BadImplementation;
 
     if ((cid < MAXCLIENTS) && clientTable[cid].buckets) {
 	res = clientTable[cid].resources[Hash(cid, id)];
@@ -882,12 +921,14 @@ dixLookupResourceByType(pointer *result, XID id, RESTYPE rtype,
 		break;
     }
     if (!res)
-	return BadValue;
+	return resourceTypes[rtype & TypeMask].errorValue;
 
     if (client) {
 	client->errorValue = id;
 	cid = XaceHook(XACE_RESOURCE_ACCESS, client, id, res->type,
 		       res->value, RT_NONE, NULL, mode);
+	if (cid == BadValue)
+	    return resourceTypes[rtype & TypeMask].errorValue;
 	if (cid != Success)
 	    return cid;
     }
diff --git a/dix/window.c b/dix/window.c
index 20cf452..00854c6 100644
--- a/dix/window.c
+++ b/dix/window.c
@@ -1056,7 +1056,7 @@ ChangeWindowAttributes(WindowPtr pWin, Mask vmask, XID *vlist, ClientPtr client)
 		}
 		else
 		{
-		    error = (rc == BadValue) ? BadPixmap : rc;
+		    error = rc;
 		    client->errorValue = pixID;
 		    goto PatchUp;
 		}
@@ -1116,7 +1116,7 @@ ChangeWindowAttributes(WindowPtr pWin, Mask vmask, XID *vlist, ClientPtr client)
 	    }
 	    else
 	    {
-		error = (rc == BadValue) ? BadPixmap : rc;
+		error = rc;
 		client->errorValue = pixID;
 		goto PatchUp;
 	    }
@@ -1264,7 +1264,7 @@ ChangeWindowAttributes(WindowPtr pWin, Mask vmask, XID *vlist, ClientPtr client)
 				   client, DixUseAccess);
 	    if (rc != Success)
 	    {
-		error = (rc == BadValue) ? BadColor : rc;
+		error = rc;
 		client->errorValue = cmap;
 		goto PatchUp;
 	    }
@@ -1340,7 +1340,7 @@ ChangeWindowAttributes(WindowPtr pWin, Mask vmask, XID *vlist, ClientPtr client)
 				       RT_CURSOR, client, DixUseAccess);
 		if (rc != Success)
 		{
-		    error = (rc == BadValue) ? BadCursor : rc;
+		    error = rc;
 		    client->errorValue = cursorID;
 		    goto PatchUp;
 		}
diff --git a/hw/xfree86/dixmods/extmod/xf86dga2.c b/hw/xfree86/dixmods/extmod/xf86dga2.c
index 6587af9..906f4d5 100644
--- a/hw/xfree86/dixmods/extmod/xf86dga2.c
+++ b/hw/xfree86/dixmods/extmod/xf86dga2.c
@@ -436,7 +436,7 @@ ProcXDGAInstallColormap(ClientPtr client)
     rc = dixLookupResourceByType((pointer *)&cmap, stuff->cmap, RT_COLORMAP,
 				 client, DixInstallAccess);
     if (rc != Success)
-        return (rc == BadValue) ? BadColor : rc;
+        return rc;
     DGAInstallCmap(cmap);
     return Success;
 }
@@ -878,7 +878,7 @@ ProcXF86DGAInstallColormap(ClientPtr client)
 	DGAInstallCmap(pcmp);
         return Success;
     } else {
-        return (rc == BadValue) ? BadColor : rc;
+        return rc;
     }
 }
 
diff --git a/render/picture.c b/render/picture.c
index aab9391..86e2e0f 100644
--- a/render/picture.c
+++ b/render/picture.c
@@ -1176,7 +1176,6 @@ ChangePicture (PicturePtr	pPicture,
 			if (error != Success)
 			{
 			    client->errorValue = pid;
-			    error = (error == BadValue) ? BadPixmap : error;
 			    break;
 			}
 		    }
diff --git a/render/render.c b/render/render.c
index 9aabcfb..fc6dbb1 100644
--- a/render/render.c
+++ b/render/render.c
@@ -1856,7 +1856,7 @@ ProcRenderCreateAnimCursor (ClientPtr client)
 	if (ret != Success)
 	{
 	    free(cursors);
-	    return (ret == BadValue) ? BadCursor : ret;
+	    return ret;
 	}
 	deltas[i] = elt->delay;
 	elt++;
diff --git a/xfixes/cursor.c b/xfixes/cursor.c
index e963e37..52bdb27 100644
--- a/xfixes/cursor.c
+++ b/xfixes/cursor.c
@@ -70,10 +70,7 @@ static void deleteCursorHideCountsForScreen (ScreenPtr pScreen);
 	int err;							\
 	err = dixLookupResourceByType((pointer *) &pCursor, cursor,	\
 				      RT_CURSOR, client, access);	\
-	if (err == BadValue) {						\
-	    client->errorValue = cursor;				\
-	    return BadCursor;						\
-	} else if (err != Success) {					\
+	if (err != Success) {						\
 	    client->errorValue = cursor;				\
 	    return err;							\
 	}								\
@@ -882,7 +879,7 @@ ProcXFixesHideCursor (ClientPtr client)
 			    client, DixGetAttrAccess);
     if (ret != Success) {
 	client->errorValue = stuff->window;
-	return (ret == BadValue) ? BadWindow : ret;
+	return ret;
     }
 
     /* 
@@ -945,7 +942,7 @@ ProcXFixesShowCursor (ClientPtr client)
 			   client, DixGetAttrAccess);
     if (rc != Success) {
 	client->errorValue = stuff->window;
-	return (rc == BadValue) ? BadWindow : rc;
+	return rc;
     }
 
     /* 
diff --git a/xfixes/region.c b/xfixes/region.c
index 5f0c2c4..7a71c78 100644
--- a/xfixes/region.c
+++ b/xfixes/region.c
@@ -119,7 +119,7 @@ ProcXFixesCreateRegionFromBitmap (ClientPtr client)
     if (rc != Success)
     {
 	client->errorValue = stuff->bitmap;
-	return (rc == BadValue) ? BadPixmap : rc;
+	return rc;
     }
     if (pPixmap->drawable.depth != 1)
 	return BadMatch;
@@ -164,7 +164,7 @@ ProcXFixesCreateRegionFromWindow (ClientPtr client)
     if (rc != Success)
     {
 	client->errorValue = stuff->window;
-	return (rc == BadValue) ? BadWindow : rc;
+	return rc;
     }
     switch (stuff->kind) {
     case WindowRegionBounding:
@@ -675,7 +675,7 @@ ProcXFixesSetWindowShapeRegion (ClientPtr client)
     if (rc != Success)
     {
 	client->errorValue = stuff->dest;
-	return (rc == BadValue) ? BadWindow : rc;
+	return rc;
     }
     VERIFY_REGION_OR_NONE(pRegion, stuff->region, client, DixWriteAccess);
     pScreen = pWin->drawable.pScreen;
commit 90e612dcbe370da095d317fac62c80ac2447fa0b
Author: Jamey Sharp <jamey at minilop.net>
Date:   Sat May 15 15:51:32 2010 -0700

    Use WriteEventsToClient rather than TryClientEvents where possible.
    
    If filter is NoEventMask (aka CantBeFiltered), grab is null, and the
    first event is not in the set of "critical events", then TryClientEvents
    simply calls WriteEventsToClient. In that case, it returns 0 for fake or
    dead clients, and 1 otherwise. Inline for this special case.
    
    Signed-off-by: Jamey Sharp <jamey at minilop.net>
    Reviewed-by: Julien Cristau <jcristau at debian.org>
    Reviewed-by: Adam Jackson <ajax at redhat.com>

diff --git a/Xext/xvmain.c b/Xext/xvmain.c
index 45d5946..f6d39d0 100644
--- a/Xext/xvmain.c
+++ b/Xext/xvmain.c
@@ -535,8 +535,7 @@ XvdiSendVideoNotify(XvPortPtr pPort, DrawablePtr pDraw, int reason)
       event.u.videoNotify.drawable = pDraw->id;
       event.u.videoNotify.port = pPort->id;
       event.u.videoNotify.reason = reason;
-      TryClientEvents(pn->client, NULL, (xEventPtr)&event, 1,
-		      NoEventMask, NoEventMask, NullGrab);
+      WriteEventsToClient(pn->client, 1, (xEventPtr)&event);
       pn = pn->next;
     }
 
@@ -563,8 +562,7 @@ XvdiSendPortNotify(
       event.u.portNotify.port = pPort->id;
       event.u.portNotify.attribute = attribute;
       event.u.portNotify.value = value;
-      TryClientEvents(pn->client, NULL, (xEventPtr)&event, 1,
-		      NoEventMask, NoEventMask, NullGrab);
+      WriteEventsToClient(pn->client, 1, (xEventPtr)&event);
       pn = pn->next;
     }
 
diff --git a/dix/selection.c b/dix/selection.c
index 4f592d1..f52638c 100644
--- a/dix/selection.c
+++ b/dix/selection.c
@@ -189,8 +189,7 @@ ProcSetSelectionOwner(ClientPtr client)
 	    event.u.selectionClear.time = time.milliseconds;
 	    event.u.selectionClear.window = pSel->window;
 	    event.u.selectionClear.atom = pSel->selection;
-	    TryClientEvents(pSel->client, NULL, &event, 1, NoEventMask,
-			    NoEventMask /* CantBeFiltered */, NullGrab);
+	    WriteEventsToClient(pSel->client, 1, &event);
 	}
     }
     else if (rc == BadMatch)
@@ -296,9 +295,11 @@ ProcConvertSelection(ClientPtr client)
 	event.u.selectionRequest.selection = stuff->selection;
 	event.u.selectionRequest.target = stuff->target;
 	event.u.selectionRequest.property = stuff->property;
-	if (TryClientEvents(pSel->client, NULL, &event, 1, NoEventMask,
-			    NoEventMask /* CantBeFiltered */, NullGrab))
+	if (pSel->client && pSel->client != serverClient && !pSel->client->clientGone)
+	{
+	    WriteEventsToClient(pSel->client, 1, &event);
 	    return Success;
+	}
     }
 
     event.u.u.type = SelectionNotify;
@@ -307,7 +308,6 @@ ProcConvertSelection(ClientPtr client)
     event.u.selectionNotify.selection = stuff->selection;
     event.u.selectionNotify.target = stuff->target;
     event.u.selectionNotify.property = None;
-    TryClientEvents(client, NULL, &event, 1, NoEventMask,
-		    NoEventMask /* CantBeFiltered */, NullGrab);
+    WriteEventsToClient(client, 1, &event);
     return Success;
 }
diff --git a/mi/miexpose.c b/mi/miexpose.c
index a50dc5e..57968dd 100644
--- a/mi/miexpose.c
+++ b/mi/miexpose.c
@@ -374,6 +374,8 @@ miSendGraphicsExpose (ClientPtr client, RegionPtr pRgn, XID drawable,
 	    pe->u.graphicsExposure.majorEvent = major;
 	    pe->u.graphicsExposure.minorEvent = minor;
 	}
+	/* GraphicsExpose is a "critical event", which TryClientEvents
+	 * handles specially. */
 	TryClientEvents(client, NULL, pEvent, numRects,
 			    (Mask)0, NoEventMask, NullGrab);
 	free(pEvent);
@@ -386,8 +388,7 @@ miSendGraphicsExpose (ClientPtr client, RegionPtr pRgn, XID drawable,
 	event.u.noExposure.drawable = drawable;
 	event.u.noExposure.majorEvent = major;
 	event.u.noExposure.minorEvent = minor;
-	TryClientEvents(client, NULL, &event, 1,
-	    (Mask)0, NoEventMask, NullGrab);
+	WriteEventsToClient(client, 1, &event);
     }
 }
 
commit 8033fb6c9792820a82fbdff6a14ff8a7a141ba74
Author: Jamey Sharp <jamey at minilop.net>
Date:   Sat May 15 13:12:44 2010 -0700

    Set event sequence number in WriteEventsToClient instead of at callers.
    
    TryClientEvents already did this; this commit just moves the assignment
    one level down so that no event source has to worry about sequence
    numbers.
    
    ...No event source, that is, except XKB, which inexplicably calls
    WriteToClient directly for several events.
    
    Signed-off-by: Jamey Sharp <jamey at minilop.net>
    Reviewed-by: Julien Cristau <jcristau at debian.org>
    Reviewed-by: Adam Jackson <ajax at redhat.com>

diff --git a/Xext/saver.c b/Xext/saver.c
index 42fc632..30c4a8c 100644
--- a/Xext/saver.c
+++ b/Xext/saver.c
@@ -480,7 +480,6 @@ SendScreenSaverNotify (ScreenPtr pScreen, int state, Bool forced)
     ScreenSaverEventPtr		pEv;
     unsigned long		mask;
     xScreenSaverNotifyEvent	ev;
-    ClientPtr			client;
     int				kind;
 
     UpdateCurrentTimeIf ();
@@ -499,18 +498,16 @@ SendScreenSaverNotify (ScreenPtr pScreen, int state, Bool forced)
 	kind = ScreenSaverInternal;
     for (pEv = pPriv->events; pEv; pEv = pEv->next)
     {
-	client = pEv->client;
 	if (!(pEv->mask & mask))
 	    continue;
 	ev.type = ScreenSaverNotify + ScreenSaverEventBase;
 	ev.state = state;
-	ev.sequenceNumber = client->sequence;
 	ev.timestamp = currentTime.milliseconds;
 	ev.root = WindowTable[pScreen->myNum]->drawable.id;
 	ev.window = savedScreenInfo[pScreen->myNum].wid;
 	ev.kind = kind;
 	ev.forced = forced;
-	WriteEventsToClient (client, 1, (xEvent *) &ev);
+	WriteEventsToClient (pEv->client, 1, (xEvent *) &ev);
     }
 }
 
diff --git a/Xext/security.c b/Xext/security.c
index 16aac05..32730e2 100644
--- a/Xext/security.c
+++ b/Xext/security.c
@@ -198,12 +198,10 @@ SecurityDeleteAuthorization(
     while ((pEventClient = pAuth->eventClients))
     {
 	/* send revocation event event */
-	ClientPtr client = rClient(pEventClient);
 	xSecurityAuthorizationRevokedEvent are;
 	are.type = SecurityEventBase + XSecurityAuthorizationRevoked;
-	are.sequenceNumber = client->sequence;
 	are.authId = pAuth->id;
-	WriteEventsToClient(client, 1, (xEvent *)&are);
+	WriteEventsToClient(rClient(pEventClient), 1, (xEvent *)&are);
 	FreeResource(pEventClient->resource, RT_NONE);
     }
 
diff --git a/Xext/shape.c b/Xext/shape.c
index 10437f4..10ac283 100644
--- a/Xext/shape.c
+++ b/Xext/shape.c
@@ -885,7 +885,6 @@ void
 SendShapeNotify (WindowPtr pWin, int which)
 {
     ShapeEventPtr	*pHead, pShapeEvent;
-    ClientPtr		client;
     xShapeNotifyEvent	se;
     BoxRec		extents;
     RegionPtr		region;
@@ -940,18 +939,16 @@ SendShapeNotify (WindowPtr pWin, int which)
 	return;
     }
     for (pShapeEvent = *pHead; pShapeEvent; pShapeEvent = pShapeEvent->next) {
-	client = pShapeEvent->client;
 	se.type = ShapeNotify + ShapeEventBase;
 	se.kind = which;
 	se.window = pWin->drawable.id;
-	se.sequenceNumber = client->sequence;
 	se.x = extents.x1;
 	se.y = extents.y1;
 	se.width = extents.x2 - extents.x1;
 	se.height = extents.y2 - extents.y1;
 	se.time = currentTime.milliseconds;
 	se.shaped = shaped;
-	WriteEventsToClient (client, 1, (xEvent *) &se);
+	WriteEventsToClient (pShapeEvent->client, 1, (xEvent *) &se);
     }
 }
 
diff --git a/Xext/shm.c b/Xext/shm.c
index 25043fa..b2c4208 100644
--- a/Xext/shm.c
+++ b/Xext/shm.c
@@ -943,7 +943,6 @@ ProcShmPutImage(ClientPtr client)
 
 	ev.type = ShmCompletionCode;
 	ev.drawable = stuff->drawable;
-	ev.sequenceNumber = client->sequence;
 	ev.minorEvent = X_ShmPutImage;
 	ev.majorEvent = ShmReqCode;
 	ev.shmseg = stuff->shmseg;
diff --git a/Xext/sync.c b/Xext/sync.c
index 3729f1b..f7ac405 100644
--- a/Xext/sync.c
+++ b/Xext/sync.c
@@ -372,7 +372,6 @@ SyncSendAlarmNotifyEvents(SyncAlarm *pAlarm)
 
     ane.type = SyncEventBase + XSyncAlarmNotify;
     ane.kind = XSyncAlarmNotify;
-    ane.sequenceNumber = pAlarm->client->sequence;
     ane.alarm = pAlarm->alarm_id;
     if (pTrigger->pCounter)
     {
@@ -395,10 +394,7 @@ SyncSendAlarmNotifyEvents(SyncAlarm *pAlarm)
 
     /* send to other interested clients */
     for (pcl = pAlarm->pEventClients; pcl; pcl = pcl->next)
-    {
-	ane.sequenceNumber = pcl->client->sequence;
 	WriteEventsToClient(pcl->client, 1, (xEvent *) &ane);
-    }
 }
 
 
@@ -423,7 +419,6 @@ SyncSendCounterNotifyEvents(ClientPtr client, SyncAwait **ppAwait,
 	SyncTrigger *pTrigger = &(*ppAwait)->trigger;
 	pev->type = SyncEventBase + XSyncCounterNotify;
 	pev->kind = XSyncCounterNotify;
-	pev->sequenceNumber = client->sequence;
 	pev->counter = pTrigger->pCounter->id;
 	pev->wait_value_lo = XSyncValueLow32(pTrigger->test_value);
 	pev->wait_value_hi = XSyncValueHigh32(pTrigger->test_value);
diff --git a/Xext/xcalibrate.c b/Xext/xcalibrate.c
index 8659384..bff1c31 100644
--- a/Xext/xcalibrate.c
+++ b/Xext/xcalibrate.c
@@ -54,7 +54,6 @@ xcalibrate_event_hook (int x, int y, int pressure, void *closure)
   xXCalibrateRawTouchscreenEvent	ev;
 
   ev.type = XCalibrateEventBase + X_XCalibrateRawTouchscreen;
-  ev.sequenceNumber = pClient->sequence;
   ev.x = x;
   ev.y = y;
   ev.pressure = pressure;
diff --git a/Xext/xvdisp.c b/Xext/xvdisp.c
index fd633f1..250a994 100644
--- a/Xext/xvdisp.c
+++ b/Xext/xvdisp.c
@@ -1100,7 +1100,6 @@ ProcXvShmPutImage(ClientPtr client)
 
         ev.type = ShmCompletionCode;
         ev.drawable = stuff->drawable;
-        ev.sequenceNumber = client->sequence;
         ev.minorEvent = xv_ShmPutImage;
         ev.majorEvent = XvReqCode;
         ev.shmseg = stuff->shmseg;
diff --git a/damageext/damageext.c b/damageext/damageext.c
index c80554e..d923434 100644
--- a/damageext/damageext.c
+++ b/damageext/damageext.c
@@ -50,7 +50,6 @@ DamageExtNotify (DamageExtPtr pDamageExt, BoxPtr pBoxes, int nBoxes)
     UpdateCurrentTimeIf ();
     ev.type = DamageEventBase + XDamageNotify;
     ev.level = pDamageExt->level;
-    ev.sequenceNumber = pClient->sequence;
     ev.drawable = pDamageExt->drawable;
     ev.damage = pDamageExt->id;
     ev.timestamp = currentTime.milliseconds;
diff --git a/dix/dispatch.c b/dix/dispatch.c
index fe9ddb2..c9e3188 100644
--- a/dix/dispatch.c
+++ b/dix/dispatch.c
@@ -3741,7 +3741,6 @@ SendErrorToClient(ClientPtr client, unsigned majorCode, unsigned minorCode,
 
     memset(&rep, 0, sizeof(xError));
     rep.type = X_Error;
-    rep.sequenceNumber = client->sequence;
     rep.errorCode = errorCode;
     rep.majorCode = majorCode;
     rep.minorCode = minorCode;
diff --git a/dix/events.c b/dix/events.c
index a00ecd9..39ad400 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -1841,7 +1841,6 @@ int
 TryClientEvents (ClientPtr client, DeviceIntPtr dev, xEvent *pEvents,
                  int count, Mask mask, Mask filter, GrabPtr grab)
 {
-    int i;
     int type;
 
 #ifdef DEBUG_EVENTS
@@ -1908,7 +1907,6 @@ TryClientEvents (ClientPtr client, DeviceIntPtr dev, xEvent *pEvents,
             {
                 xEvent release = *pEvents;
                 release.u.u.type = KeyRelease;
-                release.u.u.sequenceNumber = client->sequence;
                 WriteEventsToClient(client, 1, &release);
 #ifdef DEBUG_EVENTS
                 ErrorF(" (plus fake core release for repeat)");
@@ -1929,7 +1927,6 @@ TryClientEvents (ClientPtr client, DeviceIntPtr dev, xEvent *pEvents,
             {
                 deviceKeyButtonPointer release = *(deviceKeyButtonPointer *)pEvents;
                 release.type = DeviceKeyRelease;
-                release.sequenceNumber = client->sequence;
 #ifdef DEBUG_EVENTS
                 ErrorF(" (plus fake xi1 release for repeat)");
 #endif
@@ -1943,14 +1940,6 @@ TryClientEvents (ClientPtr client, DeviceIntPtr dev, xEvent *pEvents,
         }
     }
 
-    type &= 0177;
-    if (type != KeymapNotify)
-    {
-        /* all extension events must have a sequence number */
-        for (i = 0; i < count; i++)
-            pEvents[i].u.u.sequenceNumber = client->sequence;
-    }
-
     if (BitIsOn(criticalEvents, type))
     {
         if (client->smart_priority < SMART_MAX_PRIORITY)
@@ -5672,6 +5661,10 @@ WriteEventsToClient(ClientPtr pClient, int count, xEvent *events)
     if (!pClient || pClient == serverClient || pClient->clientGone)
 	return;
 
+    for (i = 0; i < count; i++)
+	if ((events[i].u.u.type & 0x7f) != KeymapNotify)
+	    events[i].u.u.sequenceNumber = pClient->sequence;
+
     /* Let XKB rewrite the state, as it depends on client preferences. */
     XkbFilterEvents(pClient, count, events);
 
diff --git a/dix/inpututils.c b/dix/inpututils.c
index e3b44fc..8e75372 100644
--- a/dix/inpututils.c
+++ b/dix/inpututils.c
@@ -88,7 +88,6 @@ do_butmap_change(DeviceIntPtr dev, CARD8 *map, int len, ClientPtr client)
         if (!XIShouldNotify(clients[i], dev))
             continue;
 
-        core_mn.u.u.sequenceNumber = clients[i]->sequence;
         WriteEventsToClient(clients[i], 1, &core_mn);
     }
 
diff --git a/glx/glxdri2.c b/glx/glxdri2.c
index 9df682e..b971102 100644
--- a/glx/glxdri2.c
+++ b/glx/glxdri2.c
@@ -187,7 +187,6 @@ __glXdriSwapEvent(ClientPtr client, void *data, int type, CARD64 ust,
 	/* unknown swap completion type */
 	break;
     }
-    wire.sequenceNumber = client->sequence;
     wire.drawable = drawable->drawId;
     wire.ust_hi = ust >> 32;
     wire.ust_lo = ust & 0xffffffff;
diff --git a/hw/xfree86/dixmods/extmod/xf86vmode.c b/hw/xfree86/dixmods/extmod/xf86vmode.c
index 0b7f75e..754fe37 100644
--- a/hw/xfree86/dixmods/extmod/xf86vmode.c
+++ b/hw/xfree86/dixmods/extmod/xf86vmode.c
@@ -331,7 +331,6 @@ SendXF86VidModeNotify(ScreenPtr pScreen, int state, Bool forced)
     XF86VidModeEventPtr		pEv;
     unsigned long		mask;
     xXF86VidModeNotifyEvent	ev;
-    ClientPtr			client;
     int				kind;
 
     UpdateCurrentTimeIf ();
@@ -343,17 +342,15 @@ SendXF86VidModeNotify(ScreenPtr pScreen, int state, Bool forced)
     kind = XF86VidModeModeChange;
     for (pEv = pPriv->events; pEv; pEv = pEv->next)
     {
-	client = pEv->client;
 	if (!(pEv->mask & mask))
 	    continue;
 	ev.type = XF86VidModeNotify + XF86VidModeEventBase;
 	ev.state = state;
-	ev.sequenceNumber = client->sequence;
 	ev.timestamp = currentTime.milliseconds;
 	ev.root = WindowTable[pScreen->myNum]->drawable.id;
 	ev.kind = kind;
 	ev.forced = forced;
-	WriteEventsToClient (client, 1, (xEvent *) &ev);
+	WriteEventsToClient (pEv->client, 1, (xEvent *) &ev);
     }
 }
 
diff --git a/hw/xfree86/dri2/dri2ext.c b/hw/xfree86/dri2/dri2ext.c
index 444751d..e6d98f5 100644
--- a/hw/xfree86/dri2/dri2ext.c
+++ b/hw/xfree86/dri2/dri2ext.c
@@ -161,7 +161,6 @@ DRI2InvalidateBuffersEvent(DrawablePtr pDraw, void *priv)
     ClientPtr client = priv;
 
     event.type = DRI2EventBase + DRI2_InvalidateBuffers;
-    event.sequenceNumber = client->sequence;
     event.drawable = pDraw->id;
 
     WriteEventsToClient(client, 1, (xEvent *)&event);
@@ -363,7 +362,6 @@ DRI2SwapEvent(ClientPtr client, void *data, int type, CARD64 ust, CARD64 msc,
     DrawablePtr pDrawable = data;
 
     event.type = DRI2EventBase + DRI2_BufferSwapComplete;
-    event.sequenceNumber = client->sequence;
     event.event_type = type;
     event.drawable = pDrawable->id;
     event.ust_hi = (CARD64)ust >> 32;
diff --git a/hw/xquartz/applewm.c b/hw/xquartz/applewm.c
index 8c248ed..0845f67 100644
--- a/hw/xquartz/applewm.c
+++ b/hw/xquartz/applewm.c
@@ -341,7 +341,6 @@ ProcAppleWMSelectInput (register ClientPtr client)
 void
 AppleWMSendEvent (int type, unsigned int mask, int which, int arg) {
     WMEventPtr      *pHead, pEvent;
-    ClientPtr       client;
     xAppleWMNotifyEvent se;
     int             i;
 
@@ -349,15 +348,13 @@ AppleWMSendEvent (int type, unsigned int mask, int which, int arg) {
     if (i != Success || !pHead)
         return;
     for (pEvent = *pHead; pEvent; pEvent = pEvent->next) {
-        client = pEvent->client;
         if ((pEvent->mask & mask) == 0)
             continue;
         se.type = type + WMEventBase;
         se.kind = which;
         se.arg = arg;
-        se.sequenceNumber = client->sequence;
         se.time = currentTime.milliseconds;
-        WriteEventsToClient (client, 1, (xEvent *) &se);
+        WriteEventsToClient (pEvent->client, 1, (xEvent *) &se);
     }
 }
 
diff --git a/hw/xquartz/xpr/appledri.c b/hw/xquartz/xpr/appledri.c
index 0fbe850..3afe244 100644
--- a/hw/xquartz/xpr/appledri.c
+++ b/hw/xquartz/xpr/appledri.c
@@ -192,22 +192,16 @@ static void surface_notify(
 {
     DRISurfaceNotifyArg *arg = _arg;
     int client_index = (int) x_cvt_vptr_to_uint(data);
-    ClientPtr client;
     xAppleDRINotifyEvent se;
 
     if (client_index < 0 || client_index >= currentMaxClients)
         return;
 
-    client = clients[client_index];
-    if (client == NULL)
-        return;
-
     se.type = DRIEventBase + AppleDRISurfaceNotify;
     se.kind = arg->kind;
     se.arg = arg->id;
-    se.sequenceNumber = client->sequence;
     se.time = currentTime.milliseconds;
-    WriteEventsToClient (client, 1, (xEvent *) &se);
+    WriteEventsToClient (clients[client_index], 1, (xEvent *) &se);
 }
 
 static int
diff --git a/hw/xwin/winwindowswm.c b/hw/xwin/winwindowswm.c
index b534bd5..99329c3 100755
--- a/hw/xwin/winwindowswm.c
+++ b/hw/xwin/winwindowswm.c
@@ -319,7 +319,6 @@ winWindowsWMSendEvent (int type, unsigned int mask, int which, int arg,
       se.y = y;
       se.w = w;
       se.h = h;
-      se.sequenceNumber = client->sequence;
       se.time = currentTime.milliseconds;
       WriteEventsToClient (client, 1, (xEvent *) &se);
     }
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index 8543535..95e74c5 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -254,7 +254,6 @@ RRDeliverCrtcEvent (ClientPtr client, WindowPtr pWin, RRCrtcPtr crtc)
     
     ce.type = RRNotify + RREventBase;
     ce.subCode = RRNotify_CrtcChange;
-    ce.sequenceNumber = client->sequence;
     ce.timestamp = pScrPriv->lastSetTime.milliseconds;
     ce.window = pWin->drawable.id;
     ce.crtc = crtc->id;
diff --git a/randr/rroutput.c b/randr/rroutput.c
index e9ab2b9..445c318 100644
--- a/randr/rroutput.c
+++ b/randr/rroutput.c
@@ -337,7 +337,6 @@ RRDeliverOutputEvent(ClientPtr client, WindowPtr pWin, RROutputPtr output)
     
     oe.type = RRNotify + RREventBase;
     oe.subCode = RRNotify_OutputChange;
-    oe.sequenceNumber = client->sequence;
     oe.timestamp = pScrPriv->lastSetTime.milliseconds;
     oe.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
     oe.window = pWin->drawable.id;
diff --git a/randr/rrproperty.c b/randr/rrproperty.c
index 3aab37a..5e37577 100644
--- a/randr/rrproperty.c
+++ b/randr/rrproperty.c
@@ -40,7 +40,6 @@ DeliverPropertyEvent(WindowPtr pWin, void *value)
 	if (!(pRREvent->mask & RROutputPropertyNotifyMask))
 	    continue;
 
-	event->sequenceNumber = pRREvent->client->sequence;
 	event->window = pRREvent->window->drawable.id;
 	WriteEventsToClient(pRREvent->client, 1, (xEvent *)event);
     }
diff --git a/randr/rrscreen.c b/randr/rrscreen.c
index 051d514..a940f8a 100644
--- a/randr/rrscreen.c
+++ b/randr/rrscreen.c
@@ -102,13 +102,11 @@ RRDeliverScreenEvent (ClientPtr client, WindowPtr pWin, ScreenPtr pScreen)
     se.type = RRScreenChangeNotify + RREventBase;
     se.rotation = (CARD8) (crtc ? crtc->rotation : RR_Rotate_0);
     se.timestamp = pScrPriv->lastSetTime.milliseconds;
-    se.sequenceNumber = client->sequence;
     se.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
     se.root =  pRoot->drawable.id;
     se.window = pWin->drawable.id;
     se.subpixelOrder = PictureGetSubpixelOrder (pScreen);
 
-    se.sequenceNumber = client->sequence;
     se.sizeID = RR10CurrentSizeID (pScreen);
 
     if (se.rotation & (RR_Rotate_90 | RR_Rotate_270)) {
diff --git a/xfixes/cursor.c b/xfixes/cursor.c
index e963069..e963e37 100644
--- a/xfixes/cursor.c
+++ b/xfixes/cursor.c
@@ -169,7 +169,6 @@ CursorDisplayCursor (DeviceIntPtr pDev,
 		xXFixesCursorNotifyEvent	ev;
 		ev.type = XFixesEventBase + XFixesCursorNotify;
 		ev.subtype = XFixesDisplayCursorNotify;
-		ev.sequenceNumber = e->pClient->sequence;
 		ev.window = e->pWindow->drawable.id;
 		ev.cursorSerial = pCursor->serialNumber;
 		ev.timestamp = currentTime.milliseconds;
diff --git a/xfixes/select.c b/xfixes/select.c
index ffd1c69..3aa26d3 100644
--- a/xfixes/select.c
+++ b/xfixes/select.c
@@ -85,7 +85,6 @@ XFixesSelectionCallback (CallbackListPtr *callbacks, pointer data, pointer args)
 	    memset(&ev, 0, sizeof(xXFixesSelectionNotifyEvent));
 	    ev.type = XFixesEventBase + XFixesSelectionNotify;
 	    ev.subtype = subtype;
-	    ev.sequenceNumber = e->pClient->sequence;
 	    ev.window = e->pWindow->drawable.id;
 	    if (subtype == XFixesSetSelectionOwnerNotify)
 		ev.owner = selection->window;
diff --git a/xkb/xkbEvents.c b/xkb/xkbEvents.c
index 0a6a76c..8028502 100644
--- a/xkb/xkbEvents.c
+++ b/xkb/xkbEvents.c
@@ -102,7 +102,6 @@ XkbSendLegacyMapNotify(DeviceIntPtr kbd, CARD16 xkb_event, CARD16 changed,
         if (!XIShouldNotify(clients[i], kbd))
             continue;
 
-        core_mn.u.u.sequenceNumber = clients[i]->sequence;
         if (keymap_changed) {
             core_mn.u.mappingNotify.request = MappingKeyboard;
 
commit 4b9600a4167427a8fe88bca9b738c9a99cac9469
Author: Jamey Sharp <jamey at minilop.net>
Date:   Sat May 15 12:31:34 2010 -0700

    Make WriteEventsToClient/WriteToClient no-op on fake or dead clients.
    
    This matches the test in TryClientEvents, and is a superset of tests
    done by the callers of these functions. The consequence of forgetting
    these tests is a server crash, so they're always desirable. In my
    opinion, it's better to not require the callers to remember to do these
    checks.
    
    For callers that don't do very much work before calling WriteToClient or
    WriteEventsToClient, I've removed the redundant checks.
    
    hw/xquartz/xpr/appledri.c has an interesting case: While its check for
    "client == NULL" appears redundant with the test in WriteEventsToClient,
    it dereferences client to get the sequence number.
    
    Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=27497
    Signed-off-by: Jamey Sharp <jamey at minilop.net>
    Cc: Chris Wilson <chris at chris-wilson.co.uk>
    Reviewed-by: Julien Cristau <jcristau at debian.org>
    Reviewed-by: Adam Jackson <ajax at redhat.com>

diff --git a/Xext/saver.c b/Xext/saver.c
index 4b43a30..42fc632 100644
--- a/Xext/saver.c
+++ b/Xext/saver.c
@@ -500,8 +500,6 @@ SendScreenSaverNotify (ScreenPtr pScreen, int state, Bool forced)
     for (pEv = pPriv->events; pEv; pEv = pEv->next)
     {
 	client = pEv->client;
-	if (client->clientGone)
-	    continue;
 	if (!(pEv->mask & mask))
 	    continue;
 	ev.type = ScreenSaverNotify + ScreenSaverEventBase;
diff --git a/Xext/security.c b/Xext/security.c
index 7995ff2..16aac05 100644
--- a/Xext/security.c
+++ b/Xext/security.c
@@ -199,15 +199,11 @@ SecurityDeleteAuthorization(
     {
 	/* send revocation event event */
 	ClientPtr client = rClient(pEventClient);
-
-	if (!client->clientGone)
-	{
-	    xSecurityAuthorizationRevokedEvent are;
-	    are.type = SecurityEventBase + XSecurityAuthorizationRevoked;
-	    are.sequenceNumber = client->sequence;
-	    are.authId = pAuth->id;
-	    WriteEventsToClient(client, 1, (xEvent *)&are);
-	}
+	xSecurityAuthorizationRevokedEvent are;
+	are.type = SecurityEventBase + XSecurityAuthorizationRevoked;
+	are.sequenceNumber = client->sequence;
+	are.authId = pAuth->id;
+	WriteEventsToClient(client, 1, (xEvent *)&are);
 	FreeResource(pEventClient->resource, RT_NONE);
     }
 
diff --git a/Xext/shape.c b/Xext/shape.c
index cd75658..10437f4 100644
--- a/Xext/shape.c
+++ b/Xext/shape.c
@@ -941,8 +941,6 @@ SendShapeNotify (WindowPtr pWin, int which)
     }
     for (pShapeEvent = *pHead; pShapeEvent; pShapeEvent = pShapeEvent->next) {
 	client = pShapeEvent->client;
-	if (client == serverClient || client->clientGone)
-	    continue;
 	se.type = ShapeNotify + ShapeEventBase;
 	se.kind = which;
 	se.window = pWin->drawable.id;
diff --git a/Xext/sync.c b/Xext/sync.c
index d46087a..3729f1b 100644
--- a/Xext/sync.c
+++ b/Xext/sync.c
@@ -390,17 +390,14 @@ SyncSendAlarmNotifyEvents(SyncAlarm *pAlarm)
     ane.state = pAlarm->state;
 
     /* send to owner */
-    if (pAlarm->events && !pAlarm->client->clientGone)
+    if (pAlarm->events)
 	WriteEventsToClient(pAlarm->client, 1, (xEvent *) &ane);
 
     /* send to other interested clients */
     for (pcl = pAlarm->pEventClients; pcl; pcl = pcl->next)
     {
-	if (!pcl->client->clientGone)
-	{
-	    ane.sequenceNumber = pcl->client->sequence;
-	    WriteEventsToClient(pcl->client, 1, (xEvent *) &ane);
-	}
+	ane.sequenceNumber = pcl->client->sequence;
+	WriteEventsToClient(pcl->client, 1, (xEvent *) &ane);
     }
 }
 
diff --git a/Xext/xcalibrate.c b/Xext/xcalibrate.c
index 364b92a..8659384 100644
--- a/Xext/xcalibrate.c
+++ b/Xext/xcalibrate.c
@@ -59,8 +59,7 @@ xcalibrate_event_hook (int x, int y, int pressure, void *closure)
   ev.y = y;
   ev.pressure = pressure;
 
-  if (!pClient->clientGone)
-    WriteEventsToClient (pClient, 1, (xEvent *) &ev);
+  WriteEventsToClient (pClient, 1, (xEvent *) &ev);
 }
 
 static int
diff --git a/damageext/damageext.c b/damageext/damageext.c
index af4fef6..c80554e 100644
--- a/damageext/damageext.c
+++ b/damageext/damageext.c
@@ -69,8 +69,7 @@ DamageExtNotify (DamageExtPtr pDamageExt, BoxPtr pBoxes, int nBoxes)
 	    ev.area.y = pBoxes[i].y1;
 	    ev.area.width = pBoxes[i].x2 - pBoxes[i].x1;
 	    ev.area.height = pBoxes[i].y2 - pBoxes[i].y1;
-	    if (!pClient->clientGone)
-		WriteEventsToClient (pClient, 1, (xEvent *) &ev);
+	    WriteEventsToClient (pClient, 1, (xEvent *) &ev);
 	}
     }
     else
@@ -79,8 +78,7 @@ DamageExtNotify (DamageExtPtr pDamageExt, BoxPtr pBoxes, int nBoxes)
 	ev.area.y = 0;
 	ev.area.width = pDrawable->width;
 	ev.area.height = pDrawable->height;
-	if (!pClient->clientGone)
-	    WriteEventsToClient (pClient, 1, (xEvent *) &ev);
+	WriteEventsToClient (pClient, 1, (xEvent *) &ev);
     }
     /* Composite extension marks clients with manual Subwindows as critical */
     if (pDamageClient->critical > 0)
diff --git a/dix/events.c b/dix/events.c
index 3ed344d..a00ecd9 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -5669,6 +5669,9 @@ WriteEventsToClient(ClientPtr pClient, int count, xEvent *events)
     int       i,
               eventlength = sizeof(xEvent);
 
+    if (!pClient || pClient == serverClient || pClient->clientGone)
+	return;
+
     /* Let XKB rewrite the state, as it depends on client preferences. */
     XkbFilterEvents(pClient, count, events);
 
diff --git a/hw/xfree86/dixmods/extmod/xf86vmode.c b/hw/xfree86/dixmods/extmod/xf86vmode.c
index 665f743..0b7f75e 100644
--- a/hw/xfree86/dixmods/extmod/xf86vmode.c
+++ b/hw/xfree86/dixmods/extmod/xf86vmode.c
@@ -344,8 +344,6 @@ SendXF86VidModeNotify(ScreenPtr pScreen, int state, Bool forced)
     for (pEv = pPriv->events; pEv; pEv = pEv->next)
     {
 	client = pEv->client;
-	if (client->clientGone)
-	    continue;
 	if (!(pEv->mask & mask))
 	    continue;
 	ev.type = XF86VidModeNotify + XF86VidModeEventBase;
diff --git a/hw/xfree86/dri2/dri2ext.c b/hw/xfree86/dri2/dri2ext.c
index 44a47cc..444751d 100644
--- a/hw/xfree86/dri2/dri2ext.c
+++ b/hw/xfree86/dri2/dri2ext.c
@@ -160,9 +160,6 @@ DRI2InvalidateBuffersEvent(DrawablePtr pDraw, void *priv)
     xDRI2InvalidateBuffers event;
     ClientPtr client = priv;
 
-    if (client->clientGone)
-	return;
-
     event.type = DRI2EventBase + DRI2_InvalidateBuffers;
     event.sequenceNumber = client->sequence;
     event.drawable = pDraw->id;
diff --git a/hw/xquartz/applewm.c b/hw/xquartz/applewm.c
index 53d167e..8c248ed 100644
--- a/hw/xquartz/applewm.c
+++ b/hw/xquartz/applewm.c
@@ -350,11 +350,8 @@ AppleWMSendEvent (int type, unsigned int mask, int which, int arg) {
         return;
     for (pEvent = *pHead; pEvent; pEvent = pEvent->next) {
         client = pEvent->client;
-        if ((pEvent->mask & mask) == 0
-            || client == serverClient || client->clientGone)
-        {
+        if ((pEvent->mask & mask) == 0)
             continue;
-        }
         se.type = type + WMEventBase;
         se.kind = which;
         se.arg = arg;
diff --git a/hw/xquartz/xpr/appledri.c b/hw/xquartz/xpr/appledri.c
index 71cfb59..0fbe850 100644
--- a/hw/xquartz/xpr/appledri.c
+++ b/hw/xquartz/xpr/appledri.c
@@ -199,7 +199,7 @@ static void surface_notify(
         return;
 
     client = clients[client_index];
-    if (client == NULL || client == serverClient || client->clientGone)
+    if (client == NULL)
         return;
 
     se.type = DRIEventBase + AppleDRISurfaceNotify;
diff --git a/hw/xwin/winwindowswm.c b/hw/xwin/winwindowswm.c
index d09e983..b534bd5 100755
--- a/hw/xwin/winwindowswm.c
+++ b/hw/xwin/winwindowswm.c
@@ -304,8 +304,7 @@ winWindowsWMSendEvent (int type, unsigned int mask, int which, int arg,
 #if CYGMULTIWINDOW_DEBUG
       ErrorF ("winWindowsWMSendEvent - x%08x\n", (int) client);
 #endif
-      if ((pEvent->mask & mask) == 0
-	  || client == serverClient || client->clientGone)
+      if ((pEvent->mask & mask) == 0)
 	{
 	  continue;
 	}
diff --git a/os/io.c b/os/io.c
index 8335102..02e1ca3 100644
--- a/os/io.c
+++ b/os/io.c
@@ -698,15 +698,17 @@ SetCriticalOutputPending(void)
 int
 WriteToClient (ClientPtr who, int count, const void *__buf)
 {
-    OsCommPtr oc = (OsCommPtr)who->osPrivate;
-    ConnectionOutputPtr oco = oc->output;
+    OsCommPtr oc;
+    ConnectionOutputPtr oco;
     int padBytes;
     const char *buf = __buf;
 #ifdef DEBUG_COMMUNICATION
     Bool multicount = FALSE;
 #endif
-    if (!count)
+    if (!count || !who || who == serverClient || who->clientGone)
 	return(0);
+    oc = who->osPrivate;
+    oco = oc->output;
 #ifdef DEBUG_COMMUNICATION
     {
 	char info[128];
diff --git a/randr/rrproperty.c b/randr/rrproperty.c
index ff0bca0..3aab37a 100644
--- a/randr/rrproperty.c
+++ b/randr/rrproperty.c
@@ -29,7 +29,6 @@ DeliverPropertyEvent(WindowPtr pWin, void *value)
 {
     xRROutputPropertyNotifyEvent *event = value;
     RREventPtr *pHead, pRREvent;
-    ClientPtr client;
 
     dixLookupResourceByType((pointer *)&pHead, pWin->drawable.id,
 			    RREventType, serverClient, DixReadAccess);
@@ -38,14 +37,10 @@ DeliverPropertyEvent(WindowPtr pWin, void *value)
 
     for (pRREvent = *pHead; pRREvent; pRREvent = pRREvent->next)
     {
-	client = pRREvent->client;
-	if (client == serverClient || client->clientGone)
-	    continue;
-
 	if (!(pRREvent->mask & RROutputPropertyNotifyMask))
 	    continue;
 
-	event->sequenceNumber = client->sequence;
+	event->sequenceNumber = pRREvent->client->sequence;
 	event->window = pRREvent->window->drawable.id;
 	WriteEventsToClient(pRREvent->client, 1, (xEvent *)event);
     }
diff --git a/xfixes/cursor.c b/xfixes/cursor.c
index d5f8b29..e963069 100644
--- a/xfixes/cursor.c
+++ b/xfixes/cursor.c
@@ -164,8 +164,7 @@ CursorDisplayCursor (DeviceIntPtr pDev,
 	CursorCurrent[pDev->id] = pCursor;
 	for (e = cursorEvents; e; e = e->next)
 	{
-	    if ((e->eventMask & XFixesDisplayCursorNotifyMask) &&
-		!e->pClient->clientGone)
+	    if ((e->eventMask & XFixesDisplayCursorNotifyMask))
 	    {
 		xXFixesCursorNotifyEvent	ev;
 		ev.type = XFixesEventBase + XFixesCursorNotify;
diff --git a/xfixes/select.c b/xfixes/select.c
index 6d86f63..ffd1c69 100644
--- a/xfixes/select.c
+++ b/xfixes/select.c
@@ -78,8 +78,7 @@ XFixesSelectionCallback (CallbackListPtr *callbacks, pointer data, pointer args)
     for (e = selectionEvents; e; e = e->next)
     {
 	if (e->selection == selection->selection && 
-	    (e->eventMask & eventMask) &&
-	    !e->pClient->clientGone)
+	    (e->eventMask & eventMask))
 	{
 	    xXFixesSelectionNotifyEvent	ev;
 
commit ee9cd2df4a5af66c6b7073563785b8aef61fcdb8
Author: Jamey Sharp <jamey at minilop.net>
Date:   Sat May 15 13:37:34 2010 -0700

    xv: TryClientEvents already checks client and sets sequenceNumber.
    
    So don't bother doing those steps again.
    
    Signed-off-by: Jamey Sharp <jamey at minilop.net>
    Reviewed-by: Julien Cristau <jcristau at debian.org>
    Reviewed-by: Adam Jackson <ajax at redhat.com>

diff --git a/Xext/xvmain.c b/Xext/xvmain.c
index 72678f7..45d5946 100644
--- a/Xext/xvmain.c
+++ b/Xext/xvmain.c
@@ -530,17 +530,13 @@ XvdiSendVideoNotify(XvPortPtr pPort, DrawablePtr pDraw, int reason)
 
   while (pn) 
     {
-      if (pn->client)
-	{
-	  event.u.u.type = XvEventBase + XvVideoNotify;
-	  event.u.u.sequenceNumber = pn->client->sequence;
-	  event.u.videoNotify.time = currentTime.milliseconds;
-	  event.u.videoNotify.drawable = pDraw->id;
-	  event.u.videoNotify.port = pPort->id;
-	  event.u.videoNotify.reason = reason;
-	  TryClientEvents(pn->client, NULL, (xEventPtr)&event, 1,
-                          NoEventMask, NoEventMask, NullGrab);
-	}
+      event.u.u.type = XvEventBase + XvVideoNotify;
+      event.u.videoNotify.time = currentTime.milliseconds;
+      event.u.videoNotify.drawable = pDraw->id;
+      event.u.videoNotify.port = pPort->id;
+      event.u.videoNotify.reason = reason;
+      TryClientEvents(pn->client, NULL, (xEventPtr)&event, 1,
+		      NoEventMask, NoEventMask, NullGrab);
       pn = pn->next;
     }
 
@@ -562,17 +558,13 @@ XvdiSendPortNotify(
 
   while (pn) 
     {
-      if (pn->client)
-	{
-	  event.u.u.type = XvEventBase + XvPortNotify;
-	  event.u.u.sequenceNumber = pn->client->sequence;
-	  event.u.portNotify.time = currentTime.milliseconds;
-	  event.u.portNotify.port = pPort->id;
-	  event.u.portNotify.attribute = attribute;
-	  event.u.portNotify.value = value;
-	  TryClientEvents(pn->client, NULL, (xEventPtr)&event, 1,
-                          NoEventMask, NoEventMask, NullGrab);
-	}
+      event.u.u.type = XvEventBase + XvPortNotify;
+      event.u.portNotify.time = currentTime.milliseconds;
+      event.u.portNotify.port = pPort->id;
+      event.u.portNotify.attribute = attribute;
+      event.u.portNotify.value = value;
+      TryClientEvents(pn->client, NULL, (xEventPtr)&event, 1,
+		      NoEventMask, NoEventMask, NullGrab);
       pn = pn->next;
     }
 
commit e1e7deefb59cfdd82c9de46a7ca241d42436b2f8
Author: Jamey Sharp <jamey at minilop.net>
Date:   Tue May 18 16:49:21 2010 -0700

    mi/misprite.c: Delete unused private lookups.
    
    Signed-off-by: Jamey Sharp <jamey at minilop.net>
    Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/mi/misprite.c b/mi/misprite.c
index 385f67a..3d10bc8 100644
--- a/mi/misprite.c
+++ b/mi/misprite.c
@@ -257,12 +257,9 @@ static void
 miSpriteReportDamage (DamagePtr pDamage, RegionPtr pRegion, void *closure)
 {
     ScreenPtr		    pScreen = closure;
-    miSpriteScreenPtr	    pScreenPriv;
     miCursorInfoPtr         pCursorInfo;
     DeviceIntPtr            pDev;
 
-    pScreenPriv = dixLookupPrivate(&pScreen->devPrivates, miSpriteScreenKey);
-
     for (pDev = inputInfo.devices; pDev; pDev = pDev->next)
     {
         if (DevHasCursor(pDev))
@@ -394,7 +391,6 @@ miSpriteGetImage (DrawablePtr pDrawable, int sx, int sy, int w, int h,
                   char *pdstLine)
 {
     ScreenPtr	    pScreen = pDrawable->pScreen;
-    miSpriteScreenPtr    pScreenPriv;
     DeviceIntPtr    pDev;
     miCursorInfoPtr pCursorInfo;
 
@@ -402,7 +398,6 @@ miSpriteGetImage (DrawablePtr pDrawable, int sx, int sy, int w, int h,
 
     if (pDrawable->type == DRAWABLE_WINDOW)
     {
-        pScreenPriv = dixLookupPrivate(&pScreen->devPrivates,miSpriteScreenKey);
         for(pDev = inputInfo.devices; pDev; pDev = pDev->next)
         {
             if (DevHasCursor(pDev))
@@ -430,7 +425,6 @@ miSpriteGetSpans (DrawablePtr pDrawable, int wMax, DDXPointPtr ppt,
                   int *pwidth, int nspans, char *pdstStart)
 {
     ScreenPtr		    pScreen = pDrawable->pScreen;
-    miSpriteScreenPtr	    pScreenPriv;
     DeviceIntPtr            pDev;
     miCursorInfoPtr         pCursorInfo;
 
@@ -438,8 +432,6 @@ miSpriteGetSpans (DrawablePtr pDrawable, int wMax, DDXPointPtr ppt,
 
     if (pDrawable->type == DRAWABLE_WINDOW)
     {
-        pScreenPriv = dixLookupPrivate(&pScreen->devPrivates,miSpriteScreenKey);
-
         for(pDev = inputInfo.devices; pDev; pDev = pDev->next)
         {
             if (DevHasCursor(pDev))
@@ -484,7 +476,6 @@ miSpriteSourceValidate (DrawablePtr pDrawable, int x, int y, int width,
                         int height)
 {
     ScreenPtr		    pScreen = pDrawable->pScreen;
-    miSpriteScreenPtr	    pScreenPriv;
     DeviceIntPtr            pDev;
     miCursorInfoPtr         pCursorInfo;
 
@@ -492,8 +483,6 @@ miSpriteSourceValidate (DrawablePtr pDrawable, int x, int y, int width,
 
     if (pDrawable->type == DRAWABLE_WINDOW)
     {
-	pScreenPriv = dixLookupPrivate(&pScreen->devPrivates,miSpriteScreenKey);
-
 	for(pDev = inputInfo.devices; pDev; pDev = pDev->next)
 	{
 	    if (DevHasCursor(pDev))
@@ -520,14 +509,11 @@ static void
 miSpriteCopyWindow (WindowPtr pWindow, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
 {
     ScreenPtr	pScreen = pWindow->drawable.pScreen;
-    miSpriteScreenPtr	    pScreenPriv;
     DeviceIntPtr            pDev;
     miCursorInfoPtr         pCursorInfo;
 
     SCREEN_PROLOGUE (pScreen, CopyWindow);
 
-    pScreenPriv = dixLookupPrivate(&pScreen->devPrivates, miSpriteScreenKey);
-
     for(pDev = inputInfo.devices; pDev; pDev = pDev->next)
     {
         if (DevHasCursor(pDev))
@@ -893,10 +879,8 @@ miSpriteSetCursor (DeviceIntPtr pDev, ScreenPtr pScreen,
 static void
 miSpriteMoveCursor (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
 {
-    miSpriteScreenPtr	pScreenPriv;
     CursorPtr pCursor;
 
-    pScreenPriv = dixLookupPrivate(&pScreen->devPrivates, miSpriteScreenKey);
     if (!IsMaster(pDev) && !pDev->u.master)
         return;
 
@@ -1068,7 +1052,6 @@ miSpriteRestoreCursor (DeviceIntPtr pDev, ScreenPtr pScreen)
 static void
 miSpriteComputeSaved (DeviceIntPtr pDev, ScreenPtr pScreen)
 {
-    miSpriteScreenPtr   pScreenPriv;
     int		    x, y, w, h;
     int		    wpad, hpad;
     CursorPtr	    pCursor;
@@ -1077,7 +1060,6 @@ miSpriteComputeSaved (DeviceIntPtr pDev, ScreenPtr pScreen)
     if (!IsMaster(pDev) && !pDev->u.master)
         return;
 
-    pScreenPriv = dixLookupPrivate(&pScreen->devPrivates, miSpriteScreenKey);
     pCursorInfo = MISPRITE(pDev);
 
     pCursor = pCursorInfo->pCursor;
commit 936b09f2a3e31afe41050c00736bbb6b812c7003
Author: Jamey Sharp <jamey at minilop.net>
Date:   Tue May 18 16:48:08 2010 -0700

    Replace miSpriteCursorFuncRec with direct calls to midispcur.c.
    
    Nobody wraps the mi software-cursor sprite rendering implementations.
    
    Signed-off-by: Jamey Sharp <jamey at minilop.net>
    Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/mi/midispcur.c b/mi/midispcur.c
index 1acc469..61e3133 100644
--- a/mi/midispcur.c
+++ b/mi/midispcur.c
@@ -97,44 +97,6 @@ typedef struct {
 #endif
 } miDCCursorRec, *miDCCursorPtr;
 
-/*
- * sprite/cursor method table
- */
-
-static Bool	miDCRealizeCursor(ScreenPtr pScreen, CursorPtr pCursor);
-static Bool	miDCUnrealizeCursor(ScreenPtr pScreen, CursorPtr pCursor);
-static Bool	miDCPutUpCursor(DeviceIntPtr pDev, ScreenPtr pScreen, 
-                                CursorPtr pCursor, int x, int y, 
-                                unsigned long source, unsigned long mask);
-static Bool	miDCSaveUnderCursor(DeviceIntPtr pDev, ScreenPtr pScreen, 
-                                    int x, int y,
-				    int w, int h);
-static Bool	miDCRestoreUnderCursor(DeviceIntPtr pDev, ScreenPtr pScreen, 
-                                       int x, int y,
-				       int w, int h);
-static Bool	miDCMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen, 
-                               CursorPtr pCursor, int x, int y, 
-                               int w, int h, int dx, int dy,
-			       unsigned long source, unsigned long mask);
-static Bool	miDCChangeSave(DeviceIntPtr pDev, ScreenPtr pScreen, 
-                               int x, int y, int w, int h,	
-                               int dx, int dy);
-
-static Bool     miDCDeviceInitialize(DeviceIntPtr pDev, ScreenPtr pScreen);
-static void     miDCDeviceCleanup(DeviceIntPtr pDev, ScreenPtr pScreen);
-
-static miSpriteCursorFuncRec miDCFuncs = {
-    miDCRealizeCursor,
-    miDCUnrealizeCursor,
-    miDCPutUpCursor,
-    miDCSaveUnderCursor,
-    miDCRestoreUnderCursor,
-    miDCMoveCursor,
-    miDCChangeSave,
-    miDCDeviceInitialize,
-    miDCDeviceCleanup
-};
-
 Bool
 miDCInitialize (ScreenPtr pScreen, miPointerScreenFuncPtr screenFuncs)
 {
@@ -150,7 +112,7 @@ miDCInitialize (ScreenPtr pScreen, miPointerScreenFuncPtr screenFuncs)
 
     dixSetPrivate(&pScreen->devPrivates, miDCScreenKey, pScreenPriv);
 
-    if (!miSpriteInitialize (pScreen, &miDCFuncs, screenFuncs))
+    if (!miSpriteInitialize (pScreen, screenFuncs))
     {
 	free((pointer) pScreenPriv);
 	return FALSE;
@@ -170,7 +132,7 @@ miDCCloseScreen (int index, ScreenPtr pScreen)
     return (*pScreen->CloseScreen) (index, pScreen);
 }
 
-static Bool
+Bool
 miDCRealizeCursor (ScreenPtr pScreen, CursorPtr pCursor)
 {
     if (pCursor->bits->refcnt <= 1)
@@ -329,7 +291,7 @@ miDCRealize (ScreenPtr pScreen, CursorPtr pCursor)
     return pPriv;
 }
 
-static Bool
+Bool
 miDCUnrealizeCursor (ScreenPtr pScreen, CursorPtr pCursor)
 {
     miDCCursorPtr   pPriv;
@@ -426,7 +388,7 @@ miDCMakeGC(WindowPtr pWin)
 }
 
 
-static Bool
+Bool
 miDCPutUpCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor,
                  int x, int y, unsigned long source, unsigned long mask)
 {
@@ -471,7 +433,7 @@ miDCPutUpCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor,
     return TRUE;
 }
 
-static Bool
+Bool
 miDCSaveUnderCursor (DeviceIntPtr pDev, ScreenPtr pScreen,
                      int x, int y, int w, int h)
 {
@@ -505,7 +467,7 @@ miDCSaveUnderCursor (DeviceIntPtr pDev, ScreenPtr pScreen,
     return TRUE;
 }
 
-static Bool
+Bool
 miDCRestoreUnderCursor (DeviceIntPtr pDev, ScreenPtr pScreen,
                         int x, int y, int w, int h)
 {
@@ -532,7 +494,7 @@ miDCRestoreUnderCursor (DeviceIntPtr pDev, ScreenPtr pScreen,
     return TRUE;
 }
 
-static Bool
+Bool
 miDCChangeSave (DeviceIntPtr pDev, ScreenPtr pScreen,
                 int x, int y, int w, int h, int dx, int dy)
 {
@@ -665,7 +627,7 @@ miDCChangeSave (DeviceIntPtr pDev, ScreenPtr pScreen,
     return TRUE;
 }
 
-static Bool
+Bool
 miDCMoveCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor,
                 int x, int y, int w, int h, int dx, int dy,
                 unsigned long source, unsigned long mask)
@@ -764,7 +726,7 @@ miDCMoveCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor,
     return TRUE;
 }
 
-static Bool
+Bool
 miDCDeviceInitialize(DeviceIntPtr pDev, ScreenPtr pScreen)
 {
     miDCBufferPtr   pBuffer;
@@ -839,7 +801,7 @@ failure:
     return FALSE;
 }
 
-static void
+void
 miDCDeviceCleanup(DeviceIntPtr pDev, ScreenPtr pScreen)
 {
     miDCBufferPtr   pBuffer;
diff --git a/mi/misprite.c b/mi/misprite.c
index 9f10a2b..385f67a 100644
--- a/mi/misprite.c
+++ b/mi/misprite.c
@@ -94,7 +94,6 @@ typedef struct {
     ColormapPtr     pInstalledMap;
     ColormapPtr     pColormap;
     VisualPtr	    pVisual;
-    miSpriteCursorFuncPtr    funcs;
     DamagePtr	    pDamage;		/* damage tracking structure */
     Bool            damageRegistered;
 } miSpriteScreenRec, *miSpriteScreenPtr;
@@ -289,7 +288,6 @@ miSpriteReportDamage (DamagePtr pDamage, RegionPtr pRegion, void *closure)
 
 Bool
 miSpriteInitialize (ScreenPtr               pScreen,
-                    miSpriteCursorFuncPtr   cursorFuncs,
                     miPointerScreenFuncPtr  screenFuncs)
 {
     miSpriteScreenPtr	pScreenPriv;
@@ -336,7 +334,6 @@ miSpriteInitialize (ScreenPtr               pScreen,
 
     pScreenPriv->pInstalledMap = NULL;
     pScreenPriv->pColormap = NULL;
-    pScreenPriv->funcs = cursorFuncs;
     pScreenPriv->colors[SOURCE_COLOR].red = 0;
     pScreenPriv->colors[SOURCE_COLOR].green = 0;
     pScreenPriv->colors[SOURCE_COLOR].blue = 0;
@@ -760,10 +757,8 @@ miSpriteFindColors (miCursorInfoPtr pDevCursor, ScreenPtr pScreen)
 static Bool
 miSpriteRealizeCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
 {
-    miSpriteScreenPtr	pScreenPriv;
     miCursorInfoPtr pCursorInfo;
 
-    pScreenPriv = dixLookupPrivate(&pScreen->devPrivates, miSpriteScreenKey);
     if (!IsMaster(pDev) && !pDev->u.master)
         return FALSE;
 
@@ -772,27 +767,21 @@ miSpriteRealizeCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
     if (pCursor == pCursorInfo->pCursor)
 	pCursorInfo->checkPixels = TRUE;
 
-    return (*pScreenPriv->funcs->RealizeCursor) (pScreen, pCursor);
+    return miDCRealizeCursor(pScreen, pCursor);
 }
 
 static Bool
 miSpriteUnrealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
 {
-    miSpriteScreenPtr	pScreenPriv;
-
-    pScreenPriv = dixLookupPrivate(&pScreen->devPrivates, miSpriteScreenKey);
-    return (*pScreenPriv->funcs->UnrealizeCursor) (pScreen, pCursor);
+    return miDCUnrealizeCursor(pScreen, pCursor);
 }
 
 static void
 miSpriteSetCursor (DeviceIntPtr pDev, ScreenPtr pScreen,
                    CursorPtr pCursor, int x, int y)
 {
-    miSpriteScreenPtr	pScreenPriv;
     miCursorInfoPtr pPointer;
 
-    pScreenPriv = dixLookupPrivate(&pScreen->devPrivates, miSpriteScreenKey);
-
     if (!IsMaster(pDev) && !pDev->u.master)
         return;
 
@@ -861,7 +850,7 @@ miSpriteSetCursor (DeviceIntPtr pDev, ScreenPtr pScreen,
 		pointer->saved.y1 -= dy;
 		pointer->saved.x2 -= dx;
 		pointer->saved.y2 -= dy;
-		(void) (*pScreenPriv->funcs->ChangeSave) (pScreen,
+		(void) miDCChangeSave(pScreen,
 				pointer->saved.x1,
  				pointer->saved.y1,
                                 pointer->saved.x2 -
@@ -870,7 +859,7 @@ miSpriteSetCursor (DeviceIntPtr pDev, ScreenPtr pScreen,
                                 pointer->saved.y1,
 				dx, dy);
 	    }
-	    (void) (*pScreenPriv->funcs->MoveCursor) (pScreen, pCursor,
+	    (void) miDCMoveCursor(pScreen, pCursor,
 				  pointer->saved.x1,
  				  pointer->saved.y1,
                                   pointer->saved.x2 -
@@ -920,12 +909,9 @@ miSpriteMoveCursor (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
 static Bool
 miSpriteDeviceCursorInitialize(DeviceIntPtr pDev, ScreenPtr pScreen)
 {
-    miSpriteScreenPtr pScreenPriv;
     miCursorInfoPtr pCursorInfo;
     int ret = FALSE;
 
-    pScreenPriv = dixLookupPrivate(&pScreen->devPrivates, miSpriteScreenKey);
-
     pCursorInfo = malloc(sizeof(miCursorInfoRec));
     if (!pCursorInfo)
         return FALSE;
@@ -940,7 +926,7 @@ miSpriteDeviceCursorInitialize(DeviceIntPtr pDev, ScreenPtr pScreen)
     pCursorInfo->checkPixels = TRUE;
     pCursorInfo->pScreen = FALSE;
 
-    ret = (*pScreenPriv->funcs->DeviceCursorInitialize)(pDev, pScreen);
+    ret = miDCDeviceInitialize(pDev, pScreen);
     if (!ret)
     {
         free(pCursorInfo);
@@ -954,13 +940,7 @@ static void
 miSpriteDeviceCursorCleanup(DeviceIntPtr pDev, ScreenPtr pScreen)
 {
     if (DevHasCursor(pDev))
-    {
-        miSpriteScreenPtr pScreenPriv;
-        pScreenPriv = dixLookupPrivate(&pScreen->devPrivates,
-                                       miSpriteScreenKey);
-
-        (*pScreenPriv->funcs->DeviceCursorCleanup)(pDev, pScreen);
-    }
+        miDCDeviceCleanup(pDev, pScreen);
 }
 
 /*
@@ -984,16 +964,16 @@ miSpriteRemoveCursor (DeviceIntPtr pDev, ScreenPtr pScreen)
     miSpriteIsDown(pCursorInfo);
     pCursorInfo->pCacheWin = NullWindow;
     miSpriteDisableDamage(pScreen, pScreenPriv);
-    if (!(*pScreenPriv->funcs->RestoreUnderCursor) (pDev,
-                                         pScreen,
-					 pCursorInfo->saved.x1,
-                                         pCursorInfo->saved.y1,
-                                         pCursorInfo->saved.x2 -
-                                         pCursorInfo->saved.x1,
-                                         pCursorInfo->saved.y2 -
-                                         pCursorInfo->saved.y1))
+    if (!miDCRestoreUnderCursor(pDev,
+                                pScreen,
+                                pCursorInfo->saved.x1,
+                                pCursorInfo->saved.y1,
+                                pCursorInfo->saved.x2 -
+                                pCursorInfo->saved.x1,
+                                pCursorInfo->saved.y2 -
+                                pCursorInfo->saved.y1))
     {
-	miSpriteIsUp(pCursorInfo);
+        miSpriteIsUp(pCursorInfo);
     }
     miSpriteEnableDamage(pScreen, pScreenPriv);
     DamageDrawInternal (pScreen, FALSE);
@@ -1026,14 +1006,14 @@ miSpriteSaveUnderCursor(DeviceIntPtr pDev, ScreenPtr pScreen)
     y = pCursorInfo->y - (int)pCursor->bits->yhot;
     miSpriteDisableDamage(pScreen, pScreenPriv);
 
-    (*pScreenPriv->funcs->SaveUnderCursor) (pDev,
-                                      pScreen,
-				      pCursorInfo->saved.x1,
-				      pCursorInfo->saved.y1,
-                                      pCursorInfo->saved.x2 -
-                                      pCursorInfo->saved.x1,
-                                      pCursorInfo->saved.y2 -
-                                      pCursorInfo->saved.y1);
+    miDCSaveUnderCursor(pDev,
+                        pScreen,
+                        pCursorInfo->saved.x1,
+                        pCursorInfo->saved.y1,
+                        pCursorInfo->saved.x2 -
+                        pCursorInfo->saved.x1,
+                        pCursorInfo->saved.y2 -
+                        pCursorInfo->saved.y1);
     SPRITE_DEBUG(("SaveUnderCursor %d\n", pDev->id));
     miSpriteEnableDamage(pScreen, pScreenPriv);
     DamageDrawInternal (pScreen, FALSE);
@@ -1069,7 +1049,7 @@ miSpriteRestoreCursor (DeviceIntPtr pDev, ScreenPtr pScreen)
     SPRITE_DEBUG(("RestoreCursor %d\n", pDev->id));
     if (pCursorInfo->checkPixels)
         miSpriteFindColors (pCursorInfo, pScreen);
-    if ((*pScreenPriv->funcs->PutUpCursor) (pDev, pScreen,
+    if (miDCPutUpCursor(pDev, pScreen,
                 pCursor, x, y,
                 pScreenPriv->colors[SOURCE_COLOR].pixel,
                 pScreenPriv->colors[MASK_COLOR].pixel))
diff --git a/mi/misprite.h b/mi/misprite.h
index 72dc06f..78bf52c 100644
--- a/mi/misprite.h
+++ b/mi/misprite.h
@@ -32,76 +32,26 @@ used in advertising or otherwise to promote the sale, use or other dealings
 in this Software without prior written authorization from The Open Group.
 */
 
-typedef struct {
-    Bool	(*RealizeCursor)(
-		ScreenPtr /*pScreen*/,
-		CursorPtr /*pCursor*/
-);
-    Bool	(*UnrealizeCursor)(
-		ScreenPtr /*pScreen*/,
-		CursorPtr /*pCursor*/
-);
-    Bool	(*PutUpCursor)(
-                DeviceIntPtr /*pDev*/,
-		ScreenPtr /*pScreen*/,
-		CursorPtr /*pCursor*/,
-		int /*x*/,
-		int /*y*/,
-		unsigned long /*source*/,
-		unsigned long /*mask*/
-);
-    Bool	(*SaveUnderCursor)(
-                DeviceIntPtr /*pDev*/,
-		ScreenPtr /*pScreen*/,
-		int /*x*/,
-		int /*y*/,
-		int /*w*/,
-		int /*h*/
-);
-    Bool	(*RestoreUnderCursor)(
-                DeviceIntPtr /*pDev*/,
-		ScreenPtr /*pScreen*/,
-		int /*x*/,
-		int /*y*/,
-		int /*w*/,
-		int /*h*/
-);
-    Bool	(*MoveCursor)(
-                DeviceIntPtr /*pDev*/,
-		ScreenPtr /*pScreen*/,
-		CursorPtr /*pCursor*/,
-		int /*x*/,
-		int /*y*/,
-		int /*w*/,
-		int /*h*/,
-		int /*dx*/,
-		int /*dy*/,
-		unsigned long /*source*/,
-		unsigned long /*mask*/
-);
-    Bool	(*ChangeSave)(
-                DeviceIntPtr /*pDev*/,
-		ScreenPtr /*pScreen*/,
-		int /*x*/,
-		int /*y*/,
-		int /*w*/,
-		int /*h*/,
-		int /*dx*/,
-		int /*dy*/
-);
-    Bool	(*DeviceCursorInitialize)(
-                DeviceIntPtr /*pDev*/,
-		ScreenPtr /*pScreen*/
-);
-    void	(*DeviceCursorCleanup)(
-                DeviceIntPtr /*pDev*/,
-		ScreenPtr /*pScreen*/
-);
-
-} miSpriteCursorFuncRec, *miSpriteCursorFuncPtr;
-
 extern Bool miSpriteInitialize(
     ScreenPtr /*pScreen*/,
-    miSpriteCursorFuncPtr /*cursorFuncs*/,
     miPointerScreenFuncPtr /*screenFuncs*/
 );
+
+extern Bool miDCRealizeCursor(ScreenPtr pScreen, CursorPtr pCursor);
+extern Bool miDCUnrealizeCursor(ScreenPtr pScreen, CursorPtr pCursor);
+extern Bool miDCPutUpCursor(DeviceIntPtr pDev, ScreenPtr pScreen,
+                            CursorPtr pCursor, int x, int y,
+                            unsigned long source, unsigned long mask);
+extern Bool miDCSaveUnderCursor(DeviceIntPtr pDev, ScreenPtr pScreen,
+                                int x, int y, int w, int h);
+extern Bool miDCRestoreUnderCursor(DeviceIntPtr pDev, ScreenPtr pScreen,
+                                   int x, int y, int w, int h);
+extern Bool miDCMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen,
+                           CursorPtr pCursor, int x, int y,
+                           int w, int h, int dx, int dy,
+                           unsigned long source, unsigned long mask);
+extern Bool miDCChangeSave(DeviceIntPtr pDev, ScreenPtr pScreen,
+                           int x, int y, int w, int h,
+                           int dx, int dy);
+extern Bool miDCDeviceInitialize(DeviceIntPtr pDev, ScreenPtr pScreen);
+extern void miDCDeviceCleanup(DeviceIntPtr pDev, ScreenPtr pScreen);
commit d88ba7721d2d3b58cdc664fd4c23a3c5e2a5f909
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue May 18 11:12:49 2010 +1000

    xfree86: Add option parsing for percent options.
    
    In some cases, an option of "50%" would be preferable over fixed value
    configuration - especially if the actual values are autoprobed.
    Add a new set of functions to parse percent values from configurations.
    
    The percent value parsing differs slightly - if the option is not to marked
    as used (e.g. xf86CheckPercentOption()), no warning is emitted to the log
    file if the value is not a percent value. This allows double-options (either
    as % or as absolute number) without warnings.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Dan Nicholson <dbn.lists at gmail.com>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/hw/xfree86/common/xf86Configure.c b/hw/xfree86/common/xf86Configure.c
index ef61e46..c590bda 100644
--- a/hw/xfree86/common/xf86Configure.c
+++ b/hw/xfree86/common/xf86Configure.c
@@ -339,6 +339,8 @@ optionTypeToSting(OptionValueType type)
         return "[<bool>]";
     case OPTV_FREQ:
         return "<freq>";
+    case OPTV_PERCENT:
+        return "<percent>";
     default:
         return "";
     }
@@ -384,7 +386,8 @@ configureDeviceSection (int screennum)
 	    "        ### Available Driver options are:-\n"
 	    "        ### Values: <i>: integer, <f>: float, "
 			"<bool>: \"True\"/\"False\",\n"
-	    "        ### <string>: \"String\", <freq>: \"<f> Hz/kHz/MHz\"\n"
+	    "        ### <string>: \"String\", <freq>: \"<f> Hz/kHz/MHz\",\n"
+	    "        ### <percent>: \"<f>%\"\n"
 	    "        ### [arg]: arg optional\n";
 	ptr->dev_comment = xstrdup(descrip);
 	if (ptr->dev_comment) {
diff --git a/hw/xfree86/common/xf86Opt.h b/hw/xfree86/common/xf86Opt.h
index ce3d767..d75d3bf 100644
--- a/hw/xfree86/common/xf86Opt.h
+++ b/hw/xfree86/common/xf86Opt.h
@@ -51,6 +51,7 @@ typedef enum {
     OPTV_ANYSTR,                /* Any string, including an empty one */
     OPTV_REAL,
     OPTV_BOOLEAN,
+    OPTV_PERCENT,
     OPTV_FREQ
 } OptionValueType;
 
@@ -72,10 +73,12 @@ extern _X_EXPORT int xf86SetIntOption(pointer optlist, const char *name, int def
 extern _X_EXPORT double xf86SetRealOption(pointer optlist, const char *name, double deflt);
 extern _X_EXPORT char *xf86SetStrOption(pointer optlist, const char *name, char *deflt);
 extern _X_EXPORT int xf86SetBoolOption(pointer list, const char *name, int deflt );
+extern _X_EXPORT double xf86SetPercentOption(pointer list, const char *name, double deflt );
 extern _X_EXPORT int xf86CheckIntOption(pointer optlist, const char *name, int deflt);
 extern _X_EXPORT double xf86CheckRealOption(pointer optlist, const char *name, double deflt);
 extern _X_EXPORT char *xf86CheckStrOption(pointer optlist, const char *name, char *deflt);
 extern _X_EXPORT int xf86CheckBoolOption(pointer list, const char *name, int deflt );
+extern _X_EXPORT double xf86CheckPercentOption(pointer list, const char *name, double deflt );
 extern _X_EXPORT pointer xf86AddNewOption(pointer head, const char *name, const char *val );
 extern _X_EXPORT pointer xf86NewOption(char *name, char *value );
 extern _X_EXPORT pointer xf86NextOption(pointer list );
@@ -109,5 +112,6 @@ extern _X_EXPORT char *xf86NormalizeName(const char *s);
 extern _X_EXPORT pointer xf86ReplaceIntOption(pointer optlist,  const char *name, const int val);
 extern _X_EXPORT pointer xf86ReplaceRealOption(pointer optlist,  const char *name, const double val);
 extern _X_EXPORT pointer xf86ReplaceBoolOption(pointer optlist, const char *name, const Bool val);
+extern _X_EXPORT pointer xf86ReplacePercentOption(pointer optlist, const char *name, const double val);
 extern _X_EXPORT pointer xf86ReplaceStrOption(pointer optlist,  const char *name, const char* val);
 #endif
diff --git a/hw/xfree86/common/xf86Option.c b/hw/xfree86/common/xf86Option.c
index 699204c..8be893c 100644
--- a/hw/xfree86/common/xf86Option.c
+++ b/hw/xfree86/common/xf86Option.c
@@ -223,6 +223,18 @@ LookupBoolOption(pointer optlist, const char *name, int deflt, Bool markUsed)
     return deflt;
 }
 
+static int
+LookupPercentOption(pointer optlist, const char *name, double deflt, Bool markUsed)
+{
+    OptionInfoRec o;
+
+    o.name = name;
+    o.type = OPTV_PERCENT;
+    if (ParseOptionValue(-1, optlist, &o, markUsed))
+	deflt = o.value.realnum;
+    return deflt;
+}
+
 /* These xf86Set* functions are intended for use by non-screen specific code */
 
 int
@@ -252,6 +264,12 @@ xf86SetBoolOption(pointer optlist, const char *name, int deflt)
     return LookupBoolOption(optlist, name, deflt, TRUE);
 }
 
+double
+xf86SetPercentOption(pointer optlist, const char *name, double deflt)
+{
+    return LookupPercentOption(optlist, name, deflt, TRUE);
+}
+
 /*
  * These are like the Set*Option functions, but they don't mark the options
  * as used.
@@ -283,6 +301,12 @@ xf86CheckBoolOption(pointer optlist, const char *name, int deflt)
     return LookupBoolOption(optlist, name, deflt, FALSE);
 }
 
+
+double
+xf86CheckPercentOption(pointer optlist, const char *name, double deflt)
+{
+    return LookupPercentOption(optlist, name, deflt, FALSE);
+}
 /*
  * addNewOption() has the required property of replacing the option value
  * if the option is already present.
@@ -310,6 +334,14 @@ xf86ReplaceBoolOption(pointer optlist, const char *name, const Bool val)
 }
 
 pointer
+xf86ReplacePercentOption(pointer optlist, const char *name, const double val)
+{
+    char tmp[16];
+    sprintf(tmp, "%lf%%", val);
+    return xf86AddNewOption(optlist,name,tmp);
+}
+
+pointer
 xf86ReplaceStrOption(pointer optlist, const char *name, const char* val)
 {
       return xf86AddNewOption(optlist,name,val);
@@ -533,6 +565,21 @@ ParseOptionValue(int scrnIndex, pointer options, OptionInfoPtr p,
 		p->found = FALSE;
 	    }
 	    break;
+	case OPTV_PERCENT:
+	    {
+		char tmp = 0;
+		/* awkward match, but %% doesn't increase the match counter,
+		 * hence 100 looks the same as 100% to the caller of sccanf
+		 */
+		if (sscanf(s, "%lf%c", &p->value.realnum, &tmp) != 2 || tmp != '%') {
+		    xf86DrvMsg(scrnIndex, X_WARNING,
+			       "Option \"%s\" requires a percent value\n", p->name);
+		    p->found = FALSE;
+		} else {
+		    p->found = TRUE;
+		}
+	    }
+	    break;
 	case OPTV_FREQ:	
 	    if (*s == '\0') {
 		xf86DrvMsg(scrnIndex, X_WARNING,
diff --git a/hw/xfree86/common/xf86ShowOpts.c b/hw/xfree86/common/xf86ShowOpts.c
index ff4b651..eac25d7 100644
--- a/hw/xfree86/common/xf86ShowOpts.c
+++ b/hw/xfree86/common/xf86ShowOpts.c
@@ -70,6 +70,8 @@ optionTypeToSting(OptionValueType type)
         return "<bool>";
     case OPTV_FREQ:
         return "<freq>";
+    case OPTV_PERCENT:
+        return "<percent>";
     default:
         return "<undef>";
     }
diff --git a/hw/xfree86/doc/sgml/DESIGN.sgml b/hw/xfree86/doc/sgml/DESIGN.sgml
index e95df79..8999e0c 100644
--- a/hw/xfree86/doc/sgml/DESIGN.sgml
+++ b/hw/xfree86/doc/sgml/DESIGN.sgml
@@ -2528,6 +2528,7 @@ Next, the higher level functions that most drivers would use.
           OPTV_ANYSTR,  /* Any string, including an empty one */
           OPTV_REAL,
           OPTV_BOOLEAN,
+          OPTV_PERCENT,
           OPTV_FREQ
       } OptionValueType;
 
@@ -2555,6 +2556,11 @@ Next, the higher level functions that most drivers would use.
       &s.code;freq.units&e.code; is set to &s.code;0&e.code;, and
       &s.code;freq.freq&e.code; is unscaled.
 
+      &s.code;OPTV_PERCENT&e.code; can be used for option values that are
+      specified in percent (e.g. "20%"). These values are a floating point
+      number with a percent sign appended. If the percent sign is missing,
+      the parser will fail to match the value.
+
       Typical usage is to setup an array of
       &s.code;OptionInfoRecs&e.code; with all fields initialised.
       The &s.code;value&e.code; and &s.code;found&e.code; fields get
diff --git a/hw/xwin/winconfig.c b/hw/xwin/winconfig.c
index 971d381..c2dd056 100644
--- a/hw/xwin/winconfig.c
+++ b/hw/xwin/winconfig.c
@@ -673,6 +673,18 @@ winSetRealOption (pointer optlist, const char *name, double deflt)
     deflt = o.value.realnum;
   return deflt;
 }
+
+double
+winSetPercentOption (pointer optlist, const char *name, double deflt)
+{
+  OptionInfoRec o;
+
+  o.name = name;
+  o.type = OPTV_PERCENT;
+  if (ParseOptionValue (-1, optlist, &o))
+    deflt = o.value.realnum;
+  return deflt;
+}
 #endif
 
 
@@ -851,6 +863,31 @@ ParseOptionValue (int scrnIndex, pointer options, OptionInfoPtr p)
 	      p->found = FALSE;
 	    }
 	  break;
+	case OPTV_PERCENT:
+	  if (*s == '\0')
+	    {
+	      winDrvMsg (scrnIndex, X_WARNING,
+			 "Option \"%s\" requires a percent value\n",
+			 p->name);
+	      p->found = FALSE;
+	    }
+	  else
+	    {
+	       double percent = strtod (s, &end);
+
+	       if (end != s && winNameCompare (end, "%"))
+		 {
+		   p->found = TRUE;
+		   p->value.realnum = percent;
+		 }
+	       else
+		 {
+		   winDrvMsg (scrnIndex, X_WARNING,
+			      "Option \"%s\" requires a frequency value\n",
+			       p->name);
+		   p->found = FALSE;
+		 }
+	    }
 	case OPTV_FREQ:
 	  if (*s == '\0')
 	    {
diff --git a/hw/xwin/winconfig.h b/hw/xwin/winconfig.h
index 058884a..4699ca8 100644
--- a/hw/xwin/winconfig.h
+++ b/hw/xwin/winconfig.h
@@ -256,6 +256,7 @@ typedef enum
   OPTV_ANYSTR,			/* Any string, including an empty one */
   OPTV_REAL,
   OPTV_BOOLEAN,
+  OPTV_PERCENT,
   OPTV_FREQ
 }
 OptionValueType;
@@ -289,6 +290,7 @@ char *winSetStrOption (pointer optlist, const char *name, char *deflt);
 int winSetBoolOption (pointer optlist, const char *name, int deflt);
 int winSetIntOption (pointer optlist, const char *name, int deflt);
 double winSetRealOption (pointer optlist, const char *name, double deflt);
+double winSetPercentOption (pointer optlist, const char *name, double deflt);
 #ifdef XWIN_XF86CONFIG
 XF86OptionPtr winFindOption (XF86OptionPtr list, const char *name);
 char *winFindOptionValue (XF86OptionPtr list, const char *name);


More information about the xorg-commit mailing list