Add XCBRequestCheck function needed for Plan 7.
authorJosh Triplett <josh@freedesktop.org>
Sun, 30 Jul 2006 21:41:19 +0000 (14:41 -0700)
committerJosh Triplett <josh@freedesktop.org>
Sun, 30 Jul 2006 21:42:55 +0000 (14:42 -0700)
src/xcb.h
src/xcb_in.c

index f720469..abab165 100644 (file)
--- a/src/xcb.h
+++ b/src/xcb.h
@@ -272,6 +272,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.
index 6433f0e..d1118fd 100644 (file)
@@ -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;