From: Josh Triplett Date: Sun, 30 Jul 2006 21:41:19 +0000 (-0700) Subject: Add XCBRequestCheck function needed for Plan 7. X-Git-Tag: 1.8.1~277 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=685d8c76c25fd9f236fa1a74bae61699eaa78579;p=profile%2Fivi%2Flibxcb.git Add XCBRequestCheck function needed for Plan 7. --- 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;