diff options
author | Josh Triplett <josh@freedesktop.org> | 2006-07-30 14:41:19 -0700 |
---|---|---|
committer | Josh Triplett <josh@freedesktop.org> | 2006-07-30 14:42:55 -0700 |
commit | 685d8c76c25fd9f236fa1a74bae61699eaa78579 (patch) | |
tree | cb17072d2d9f73843bce157f719a8e5bcc7c0d01 | |
parent | b3a2f83f1e4d3567fcd4494e7bae31e99645ef85 (diff) |
Add XCBRequestCheck function needed for Plan 7.
-rw-r--r-- | src/xcb.h | 18 | ||||
-rw-r--r-- | src/xcb_in.c | 18 |
2 files changed, 36 insertions, 0 deletions
@@ -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; |