From 685d8c76c25fd9f236fa1a74bae61699eaa78579 Mon Sep 17 00:00:00 2001 From: Josh Triplett Date: Sun, 30 Jul 2006 14:41:19 -0700 Subject: [PATCH] Add XCBRequestCheck function needed for Plan 7. --- src/xcb.h | 18 ++++++++++++++++++ src/xcb_in.c | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/xcb.h b/src/xcb.h index f720469..abab165 100644 --- a/src/xcb.h +++ b/src/xcb.h @@ -273,6 +273,24 @@ XCBGenericEvent *XCBWaitForEvent(XCBConnection *c); XCBGenericEvent *XCBPollForEvent(XCBConnection *c, int *error); /** + * @brief Return the error for a request, or NULL if none can ever arrive. + * @param c: The connection to the X server. + * @param cookie: The request cookie. + * @return The error for the request, or NULL if none can ever arrive. + * + * The XCBVoidCookie cookie supplied to this function must have resulted from + * a call to XCB[RequestName]Checked(). This function will block until one of + * two conditions happens. If an error is received, it will be returned. If + * a reply to a subsequent request has already arrived, no error can arrive + * for this request, so this function will return NULL. + * + * Note that this function will perform a sync if needed to ensure that the + * sequence number will advance beyond that provided in cookie; this is a + * convenience to avoid races in determining whether the sync is needed. + */ +XCBGenericError *XCBRequestCheck(XCBConnection *c, XCBVoidCookie cookie); + +/** * @brief Returns the last sequence number that the server is known to * have processed. * @param c: The connection to the X server. diff --git a/src/xcb_in.c b/src/xcb_in.c index 6433f0e..d1118fd 100644 --- a/src/xcb_in.c +++ b/src/xcb_in.c @@ -402,6 +402,24 @@ XCBGenericEvent *XCBPollForEvent(XCBConnection *c, int *error) return ret; } +XCBGenericError *XCBRequestCheck(XCBConnection *c, XCBVoidCookie cookie) +{ + /* FIXME: this could hold the lock to avoid syncing unnecessarily, but + * that would require factoring the locking out of XCBGetInputFocus, + * XCBGetInputFocusReply, and XCBWaitForReply. */ + XCBGenericError *ret; + void *reply; + if(XCB_SEQUENCE_COMPARE(cookie.request,>,c->in.request_expected) + && XCB_SEQUENCE_COMPARE(cookie.request,>,c->in.request_completed)) + { + free(XCBGetInputFocusReply(c, XCBGetInputFocus(c), &ret)); + assert(!ret); + } + reply = XCBWaitForReply(c, cookie.request, &ret); + assert(!reply); + return ret; +} + unsigned int XCBGetRequestRead(XCBConnection *c) { unsigned int ret; -- 2.7.4