[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;