[xlibs-commit] X11/src XlibInt.c,3.42.2.1,3.42.2.2

Jamey Sharp xlibs-commit@pdx.freedesktop.org
Mon, 17 Nov 2003 23:29:45 -0800


Committed by: jamey

Update of /cvs/xlibs/X11/src
In directory pdx:/tmp/cvs-serv17059/src

Modified Files:
      Tag: XCL
	XlibInt.c 
Log Message:
Various and sundry fixes to end-of-file detection in XCB. The apps I've tested
all terminate when their X server dies now.

Remove XCBPollEvent, because it had no means for reporting errors.
XCBEventQueueLength causes a read first now, so it may be used with
XCBWaitEvent for the same purpose.

Make use of XCB's shiny new 32-bit sequence number tracking code, since XCL
can't do it at the Xlib level any more.

Removed XCBEventQueueIsEmpty and XCBListIsEmpty, because they were redundant
and therefore a maintenance hassle.


Index: XlibInt.c
===================================================================
RCS file: /cvs/xlibs/X11/src/XlibInt.c,v
retrieving revision 3.42.2.1
retrieving revision 3.42.2.2
diff -u -d -r3.42.2.1 -r3.42.2.2
--- XlibInt.c	13 Nov 2003 19:28:34 -0000	3.42.2.1
+++ XlibInt.c	18 Nov 2003 07:29:42 -0000	3.42.2.2
@@ -240,6 +240,8 @@
 
 static void _XHandleEvent(Display *dpy, XCBGenericEvent *e)
 {
+	if(!e)
+		_XIOError(dpy);
 	if(e->response_type == X_Error)
 		_XError(dpy, (xError *) e);
 	else
@@ -252,11 +254,14 @@
     register Display *dpy,
     int mode)
 {
-	XCBGenericEvent *e;
+	XCBConnection *c = XCBConnectionOfDisplay(dpy);
+	int ret;
 	if(mode == QueuedAfterFlush)
 		_XFlush(dpy);
-	while((e = XCBPollEvent(XCBConnectionOfDisplay(dpy))))
-		_XHandleEvent(dpy, e);
+	while((ret = XCBEventQueueLength(c)) > 0)
+		_XHandleEvent(dpy, XCBWaitEvent(c));
+	if(ret < 0)
+		_XIOError(dpy);
 	return dpy->qlen;
 }
 
@@ -266,14 +271,9 @@
 void _XReadEvents(
 	register Display *dpy)
 {
-	XCBGenericEvent *e;
 	_XFlush(dpy);
-	e = XCBWaitEvent(XCBConnectionOfDisplay(dpy));
-	if(!e)
-		_XIOError(dpy);
-	do
-		_XHandleEvent(dpy, e);
-	while((e = XCBPollEvent(XCBConnectionOfDisplay(dpy))));
+	_XHandleEvent(dpy, XCBWaitEvent(XCBConnectionOfDisplay(dpy)));
+	_XEventsQueued(dpy, QueuedAfterReading);
 }
 
 static void _XFreeReplyData(Display *dpy, Bool force)
@@ -559,29 +559,22 @@
     register Display *dpy,
     register xGenericReply *rep)
 {
-    register unsigned long	newseq, lastseq;
+    unsigned long newseq;
+    unsigned int xcb_seqnum = XCBGetLastSeqnumRead(XCBConnectionOfDisplay(dpy));
 
-    lastseq = dpy->last_request_read;
     /*
      * KeymapNotify has no sequence number, but is always guaranteed
      * to immediately follow another event, except when generated via
      * SendEvent (hmmm).
      */
     if ((rep->type & 0x7f) == KeymapNotify)
-	return(lastseq);
+	return(dpy->last_request_read);
 
-    newseq = (lastseq & ~((unsigned long)0xffff)) | rep->sequenceNumber;
+    newseq = (xcb_seqnum & ~((unsigned long)0xffff)) | rep->sequenceNumber;
 
-    if (newseq < lastseq) {
-	newseq += 0x10000;
-	if (newseq > dpy->request) {
-	    (void) fprintf (stderr, 
-	    "Xlib: sequence lost (0x%lx > 0x%lx) in reply type 0x%x!\n",
-			    newseq, dpy->request, 
-			    (unsigned int) rep->type);
-	    newseq -= 0x10000;
-	}
-    }
+    if (newseq > xcb_seqnum)
+	newseq -= 0x10000;
+    assert(newseq <= dpy->request);
 
     dpy->last_request_read = newseq;
     return(newseq);
@@ -601,8 +594,8 @@
 	XCBGenericError *error;
 
 	free(dpy->xcl->reply_data);
-	XCBAddReplyData(XCBConnectionOfDisplay(dpy), dpy->request);
 	_XFlush(dpy);
+	XCBAddReplyData(XCBConnectionOfDisplay(dpy), dpy->request);
 
 	dpy->xcl->reply_data = XCBWaitSeqnum(XCBConnectionOfDisplay(dpy), dpy->request, &error);
 	dpy->last_request_read = dpy->request;