Blame man/xcb-requests.man

Packit Service 612474
.TH xcb-requests __libmansuffix__ __xorgversion__ "XCB examples"
Packit Service 612474
.ad l
Packit Service 612474
.SH NAME
Packit Service 612474
xcb-requests \- about request manpages
Packit Service 612474
.SH DESCRIPTION
Packit Service 612474
Every request in X11, like \fIMapWindow\fP, corresponds to a number of
Packit Service 612474
functions and data structures in XCB. For \fIMapWindow\fP, XCB provides the
Packit Service 612474
function \fIxcb_map_window\fP, which fills the \fIxcb_map_window_request_t\fP
Packit Service 612474
data structure and writes that to the X11 connection. Since the \fIMapWindow\fP
Packit Service 612474
request does not have a reply, this is the most simple case.
Packit Service 612474
Packit Service 612474
.SH REPLIES
Packit Service 612474
Packit Service 612474
Many requests have replies. For each reply, XCB provides at least a
Packit Service 612474
corresponding data structure and a function to return a pointer to a filled
Packit Service 612474
data structure. Let's take the \fIInternAtom\fP request as an example: XCB
Packit Service 612474
provides the \fIxcb_intern_atom_reply_t\fP data structure and
Packit Service 612474
\fIxcb_intern_atom_reply\fP function. For replies which are more complex (for
Packit Service 612474
example lists, such as in \fIxcb_list_fonts\fP), accessor functions are
Packit Service 612474
provided.
Packit Service 612474
Packit Service 612474
.SH COOKIES
Packit Service 612474
Packit Service 612474
XCB returns a cookie for each request you send. This is an XCB-specific data
Packit Service 612474
structure containing the sequence number with which the request was sent to the
Packit Service 612474
X11 server. To get any reply, you have to provide that cookie (so that XCB
Packit Service 612474
knows which of the waiting replies you want). Here is an example to illustrate
Packit Service 612474
the use of cookies:
Packit Service 612474
Packit Service 612474
.nf
Packit Service 612474
.sp
Packit Service 612474
void my_example(xcb_connection *conn) {
Packit Service 612474
    xcb_intern_atom_cookie_t cookie;
Packit Service 612474
    xcb_intern_atom_reply_t *reply;
Packit Service 612474
Packit Service 612474
    cookie = xcb_intern_atom(conn, 0, strlen("_NET_WM_NAME"), "_NET_WM_NAME");
Packit Service 612474
    /* ... do other work here if possible ... */
Packit Service 612474
    if ((reply = xcb_intern_atom_reply(conn, cookie, NULL))) {
Packit Service 612474
        printf("The _NET_WM_NAME atom has ID %u\\n", reply->atom);
Packit Service 612474
    }
Packit Service 612474
    free(reply);
Packit Service 612474
}
Packit Service 612474
.fi
Packit Service 612474
Packit Service 612474
.SH CHECKED VS. UNCHECKED
Packit Service 612474
Packit Service 612474
The checked and unchecked suffixes for functions determine which kind of error
Packit Service 612474
handling is used for this specific request.
Packit Service 612474
Packit Service 612474
For requests which have no reply (for example \fIxcb_map_window\fP), errors
Packit Service 612474
will be delivered to the event loop (you will receive an X11 event of type 0
Packit Service 612474
when calling \fIxcb_poll_for_event\fP).
Packit Service 612474
If you want to explicitly check for errors in a blocking fashion, call the
Packit Service 612474
_checked version of the function (for example \fIxcb_map_window_checked\fP) and
Packit Service 612474
use \fIxcb_request_check\fP.
Packit Service 612474
Packit Service 612474
For requests which have a reply (for example \fIxcb_intern_atom\fP), errors
Packit Service 612474
will be checked when calling the reply function. To get errors in the event
Packit Service 612474
loop instead, use the _unchecked version of the function (for example
Packit Service 612474
\fIxcb_intern_atom_unchecked\fP).
Packit Service 612474
Packit Service 612474
Here is an example which illustrates the four different ways of handling errors:
Packit Service 612474
Packit Service 612474
.nf
Packit Service 612474
.sp
Packit Service 612474
/*
Packit Service 612474
 * Request without a reply, handling errors in the event loop (default)
Packit Service 612474
 *
Packit Service 612474
 */
Packit Service 612474
void my_example(xcb_connection *conn, xcb_window_t window) {
Packit Service 612474
    /* This is a request without a reply. Errors will be delivered to the event
Packit Service 612474
     * loop. Getting an error to xcb_map_window most likely is a bug in our
Packit Service 612474
     * program, so we don't need to check for that in a blocking way. */
Packit Service 612474
    xcb_map_window(conn, window);
Packit Service 612474
Packit Service 612474
    /* ... of course your event loop would not be in the same function ... */
Packit Service 612474
    while ((event = xcb_wait_for_event(conn)) != NULL) {
Packit Service 612474
        if (event->response_type == 0) {
Packit Service 612474
            fprintf("Received X11 error %d\\n", error->error_code);
Packit Service 612474
            free(event);
Packit Service 612474
            continue;
Packit Service 612474
        }
Packit Service 612474
Packit Service 612474
        /* ... handle a normal event ... */
Packit Service 612474
    }
Packit Service 612474
}
Packit Service 612474
Packit Service 612474
/*
Packit Service 612474
 * Request without a reply, handling errors directly
Packit Service 612474
 *
Packit Service 612474
 */
Packit Service 612474
void my_example(xcb_connection *conn, xcb_window_t deco, xcb_window_t window) {
Packit Service 612474
    /* A reparenting window manager wants to know whether a new window was
Packit Service 612474
     * successfully reparented. If not (because the window got destroyed
Packit Service 612474
     * already, for example), it does not make sense to map an empty window
Packit Service 612474
     * decoration at all, so we need to know this right now. */
Packit Service 612474
    xcb_void_cookie_t cookie = xcb_reparent_window_checked(conn, window,
Packit Service 612474
                                                           deco, 0, 0);
Packit Service 612474
    xcb_generic_error_t *error;
Packit Service 612474
    if ((error = xcb_request_check(conn, cookie))) {
Packit Service 612474
        fprintf(stderr, "Could not reparent the window\\n");
Packit Service 612474
        free(error);
Packit Service 612474
        return;
Packit Service 612474
    }
Packit Service 612474
Packit Service 612474
    /* ... do window manager stuff here ... */
Packit Service 612474
}
Packit Service 612474
Packit Service 612474
/*
Packit Service 612474
 * Request with a reply, handling errors directly (default)
Packit Service 612474
 *
Packit Service 612474
 */
Packit Service 612474
void my_example(xcb_connection *conn, xcb_window_t window) {
Packit Service 612474
    xcb_intern_atom_cookie_t cookie;
Packit Service 612474
    xcb_intern_atom_reply_t *reply;
Packit Service 612474
    xcb_generic_error_t *error;
Packit Service 612474
Packit Service 612474
    cookie = xcb_intern_atom(c, 0, strlen("_NET_WM_NAME"), "_NET_WM_NAME");
Packit Service 612474
    /* ... do other work here if possible ... */
Packit Service 612474
    if ((reply = xcb_intern_atom_reply(c, cookie, &error))) {
Packit Service 612474
        printf("The _NET_WM_NAME atom has ID %u\\n", reply->atom);
Packit Service 612474
        free(reply);
Packit Service 612474
    } else {
Packit Service 612474
        fprintf(stderr, "X11 Error %d\\n", error->error_code);
Packit Service 612474
        free(error);
Packit Service 612474
    }
Packit Service 612474
}
Packit Service 612474
Packit Service 612474
/*
Packit Service 612474
 * Request with a reply, handling errors in the event loop
Packit Service 612474
 *
Packit Service 612474
 */
Packit Service 612474
void my_example(xcb_connection *conn, xcb_window_t window) {
Packit Service 612474
    xcb_intern_atom_cookie_t cookie;
Packit Service 612474
    xcb_intern_atom_reply_t *reply;
Packit Service 612474
Packit Service 612474
    cookie = xcb_intern_atom_unchecked(c, 0, strlen("_NET_WM_NAME"),
Packit Service 612474
                                       "_NET_WM_NAME");
Packit Service 612474
    /* ... do other work here if possible ... */
Packit Service 612474
    if ((reply = xcb_intern_atom_reply(c, cookie, NULL))) {
Packit Service 612474
        printf("The _NET_WM_NAME atom has ID %u\\n", reply->atom);
Packit Service 612474
        free(reply);
Packit Service 612474
    }
Packit Service 612474
Packit Service 612474
    /* ... of course your event loop would not be in the same function ... */
Packit Service 612474
    while ((event = xcb_wait_for_event(conn)) != NULL) {
Packit Service 612474
        if (event->response_type == 0) {
Packit Service 612474
            fprintf("Received X11 error %d\\n", error->error_code);
Packit Service 612474
            free(event);
Packit Service 612474
            continue;
Packit Service 612474
        }
Packit Service 612474
Packit Service 612474
        /* ... handle a normal event ... */
Packit Service 612474
    }
Packit Service 612474
}
Packit Service 612474
.fi
Packit Service 612474
Packit Service 612474
.SH SEE ALSO
Packit Service 612474
.BR xcb_map_window (__libmansuffix__),
Packit Service 612474
.BR xcb_intern_atom (__libmansuffix__),
Packit Service 612474
.BR xcb_list_fonts (__libmansuffix__),
Packit Service 612474
.BR xcb_poll_for_event (__libmansuffix__),
Packit Service 612474
.BR xcb_request_check (__libmansuffix__)
Packit Service 612474
.SH AUTHOR
Packit Service 612474
Michael Stapelberg <michael+xcb at stapelberg dot de>