summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosh Triplett <josh@freedesktop.org>2006-07-30 14:41:19 -0700
committerJosh Triplett <josh@freedesktop.org>2006-07-30 14:42:55 -0700
commit685d8c76c25fd9f236fa1a74bae61699eaa78579 (patch)
treecb17072d2d9f73843bce157f719a8e5bcc7c0d01
parentb3a2f83f1e4d3567fcd4494e7bae31e99645ef85 (diff)
Add XCBRequestCheck function needed for Plan 7.
-rw-r--r--src/xcb.h18
-rw-r--r--src/xcb_in.c18
2 files changed, 36 insertions, 0 deletions
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;