1602e473dSmrg/*
2602e473dSmrg * Copyright (C) 2001-2004 Bart Massey and Jamey Sharp.
3602e473dSmrg * All Rights Reserved.
4602e473dSmrg *
5602e473dSmrg * Permission is hereby granted, free of charge, to any person obtaining a
6602e473dSmrg * copy of this software and associated documentation files (the "Software"),
7602e473dSmrg * to deal in the Software without restriction, including without limitation
8602e473dSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9602e473dSmrg * and/or sell copies of the Software, and to permit persons to whom the
10602e473dSmrg * Software is furnished to do so, subject to the following conditions:
11602e473dSmrg *
12602e473dSmrg * The above copyright notice and this permission notice shall be included in
13602e473dSmrg * all copies or substantial portions of the Software.
14602e473dSmrg *
15602e473dSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16602e473dSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17602e473dSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18602e473dSmrg * AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
19602e473dSmrg * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20602e473dSmrg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21602e473dSmrg *
22602e473dSmrg * Except as contained in this notice, the names of the authors or their
23602e473dSmrg * institutions shall not be used in advertising or otherwise to promote the
24602e473dSmrg * sale, use or other dealings in this Software without prior written
25602e473dSmrg * authorization from the authors.
26602e473dSmrg */
27602e473dSmrg
28602e473dSmrg#ifndef __XCBEXT_H
29602e473dSmrg#define __XCBEXT_H
30602e473dSmrg
31602e473dSmrg#include "xcb.h"
32602e473dSmrg
33602e473dSmrg#ifdef __cplusplus
34602e473dSmrgextern "C" {
35602e473dSmrg#endif
36602e473dSmrg
37602e473dSmrg/* xcb_ext.c */
38602e473dSmrg
39602e473dSmrgstruct xcb_extension_t {
40602e473dSmrg    const char *name;
41602e473dSmrg    int global_id;
42602e473dSmrg};
43602e473dSmrg
44602e473dSmrg
45602e473dSmrg/* xcb_out.c */
46602e473dSmrg
47602e473dSmrgtypedef struct {
48602e473dSmrg    size_t count;
49602e473dSmrg    xcb_extension_t *ext;
50602e473dSmrg    uint8_t opcode;
51602e473dSmrg    uint8_t isvoid;
52602e473dSmrg} xcb_protocol_request_t;
53602e473dSmrg
54602e473dSmrgenum xcb_send_request_flags_t {
55602e473dSmrg    XCB_REQUEST_CHECKED = 1 << 0,
56602e473dSmrg    XCB_REQUEST_RAW = 1 << 1,
571016ad83Smrg    XCB_REQUEST_DISCARD_REPLY = 1 << 2,
581016ad83Smrg    XCB_REQUEST_REPLY_FDS = 1 << 3
59602e473dSmrg};
60602e473dSmrg
611c7386f4Smrg/**
621c7386f4Smrg * @brief Send a request to the server.
63245c37e9Smrg * @param c The connection to the X server.
64245c37e9Smrg * @param flags A combination of flags from the xcb_send_request_flags_t enumeration.
65245c37e9Smrg * @param vector Data to send; must have two iovecs before start for internal use.
66245c37e9Smrg * @param request Information about the request to be sent.
671c7386f4Smrg * @return The request's sequence number on success, 0 otherwise.
681c7386f4Smrg *
691c7386f4Smrg * This function sends a new request to the X server. The data of the request is
701c7386f4Smrg * given as an array of @c iovecs in the @p vector argument. The length of that
717204935cSmrg * array and the necessary management information are given in the @p request
721c7386f4Smrg * argument.
731c7386f4Smrg *
741c7386f4Smrg * When this function returns, the request might or might not be sent already.
751c7386f4Smrg * Use xcb_flush() to make sure that it really was sent.
761c7386f4Smrg *
777204935cSmrg * Please note that this function is not the preferred way for sending requests.
781c7386f4Smrg * It's better to use the generated wrapper functions.
791c7386f4Smrg *
801c7386f4Smrg * Please note that xcb might use index -1 and -2 of the @p vector array internally,
811c7386f4Smrg * so they must be valid!
821c7386f4Smrg */
83602e473dSmrgunsigned int xcb_send_request(xcb_connection_t *c, int flags, struct iovec *vector, const xcb_protocol_request_t *request);
84602e473dSmrg
857204935cSmrg/**
867204935cSmrg * @brief Send a request to the server.
87245c37e9Smrg * @param c The connection to the X server.
88245c37e9Smrg * @param flags A combination of flags from the xcb_send_request_flags_t enumeration.
89245c37e9Smrg * @param vector Data to send; must have two iovecs before start for internal use.
90245c37e9Smrg * @param request Information about the request to be sent.
91245c37e9Smrg * @param num_fds Number of additional file descriptors to send to the server
92245c37e9Smrg * @param fds Additional file descriptors that should be send to the server.
937204935cSmrg * @return The request's sequence number on success, 0 otherwise.
947204935cSmrg *
957204935cSmrg * This function sends a new request to the X server. The data of the request is
967204935cSmrg * given as an array of @c iovecs in the @p vector argument. The length of that
977204935cSmrg * array and the necessary management information are given in the @p request
987204935cSmrg * argument.
997204935cSmrg *
1007204935cSmrg * If @p num_fds is non-zero, @p fds points to an array of file descriptors that
1017204935cSmrg * will be sent to the X server along with this request. After this function
1027204935cSmrg * returns, all file descriptors sent are owned by xcb and will be closed
1037204935cSmrg * eventually.
1047204935cSmrg *
1057204935cSmrg * When this function returns, the request might or might not be sent already.
1067204935cSmrg * Use xcb_flush() to make sure that it really was sent.
1077204935cSmrg *
1087204935cSmrg * Please note that this function is not the preferred way for sending requests.
1097204935cSmrg *
1107204935cSmrg * Please note that xcb might use index -1 and -2 of the @p vector array internally,
1117204935cSmrg * so they must be valid!
1127204935cSmrg */
1137204935cSmrgunsigned int xcb_send_request_with_fds(xcb_connection_t *c, int flags, struct iovec *vector,
1147204935cSmrg                const xcb_protocol_request_t *request, unsigned int num_fds, int *fds);
1157204935cSmrg
116709d36bbSmrg/**
117709d36bbSmrg * @brief Send a request to the server, with 64-bit sequence number returned.
118245c37e9Smrg * @param c The connection to the X server.
119245c37e9Smrg * @param flags A combination of flags from the xcb_send_request_flags_t enumeration.
120245c37e9Smrg * @param vector Data to send; must have two iovecs before start for internal use.
121245c37e9Smrg * @param request Information about the request to be sent.
122709d36bbSmrg * @return The request's sequence number on success, 0 otherwise.
123709d36bbSmrg *
124709d36bbSmrg * This function sends a new request to the X server. The data of the request is
125709d36bbSmrg * given as an array of @c iovecs in the @p vector argument. The length of that
1267204935cSmrg * array and the necessary management information are given in the @p request
127709d36bbSmrg * argument.
128709d36bbSmrg *
129709d36bbSmrg * When this function returns, the request might or might not be sent already.
130709d36bbSmrg * Use xcb_flush() to make sure that it really was sent.
131709d36bbSmrg *
1327204935cSmrg * Please note that this function is not the preferred way for sending requests.
133709d36bbSmrg * It's better to use the generated wrapper functions.
134709d36bbSmrg *
135709d36bbSmrg * Please note that xcb might use index -1 and -2 of the @p vector array internally,
136709d36bbSmrg * so they must be valid!
137709d36bbSmrg */
138709d36bbSmrguint64_t xcb_send_request64(xcb_connection_t *c, int flags, struct iovec *vector, const xcb_protocol_request_t *request);
139709d36bbSmrg
1407204935cSmrg/**
1417204935cSmrg * @brief Send a request to the server, with 64-bit sequence number returned.
142245c37e9Smrg * @param c The connection to the X server.
143245c37e9Smrg * @param flags A combination of flags from the xcb_send_request_flags_t enumeration.
144245c37e9Smrg * @param vector Data to send; must have two iovecs before start for internal use.
145245c37e9Smrg * @param request Information about the request to be sent.
146245c37e9Smrg * @param num_fds Number of additional file descriptors to send to the server
147245c37e9Smrg * @param fds Additional file descriptors that should be send to the server.
1487204935cSmrg * @return The request's sequence number on success, 0 otherwise.
1497204935cSmrg *
1507204935cSmrg * This function sends a new request to the X server. The data of the request is
1517204935cSmrg * given as an array of @c iovecs in the @p vector argument. The length of that
1527204935cSmrg * array and the necessary management information are given in the @p request
1537204935cSmrg * argument.
1547204935cSmrg *
1557204935cSmrg * If @p num_fds is non-zero, @p fds points to an array of file descriptors that
1567204935cSmrg * will be sent to the X server along with this request. After this function
1577204935cSmrg * returns, all file descriptors sent are owned by xcb and will be closed
1587204935cSmrg * eventually.
1597204935cSmrg *
1607204935cSmrg * When this function returns, the request might or might not be sent already.
1617204935cSmrg * Use xcb_flush() to make sure that it really was sent.
1627204935cSmrg *
1637204935cSmrg * Please note that this function is not the preferred way for sending requests.
1647204935cSmrg * It's better to use the generated wrapper functions.
1657204935cSmrg *
1667204935cSmrg * Please note that xcb might use index -1 and -2 of the @p vector array internally,
1677204935cSmrg * so they must be valid!
1687204935cSmrg */
1697204935cSmrguint64_t xcb_send_request_with_fds64(xcb_connection_t *c, int flags, struct iovec *vector,
1707204935cSmrg                const xcb_protocol_request_t *request, unsigned int num_fds, int *fds);
1717204935cSmrg
1721c7386f4Smrg/**
1731c7386f4Smrg * @brief Send a file descriptor to the server in the next call to xcb_send_request.
174245c37e9Smrg * @param c The connection to the X server.
175245c37e9Smrg * @param fd The file descriptor to send.
1761c7386f4Smrg *
1771c7386f4Smrg * After this function returns, the file descriptor given is owned by xcb and
1781c7386f4Smrg * will be closed eventually.
1791c7386f4Smrg *
1807204935cSmrg * @deprecated This function cannot be used in a thread-safe way. Two threads
1817204935cSmrg * that run xcb_send_fd(); xcb_send_request(); could mix up their file
1827204935cSmrg * descriptors. Instead, xcb_send_request_with_fds() should be used.
1831c7386f4Smrg */
1841016ad83Smrgvoid xcb_send_fd(xcb_connection_t *c, int fd);
1851016ad83Smrg
1861c7386f4Smrg/**
1871c7386f4Smrg * @brief Take over the write side of the socket
188245c37e9Smrg * @param c The connection to the X server.
189245c37e9Smrg * @param return_socket Callback function that will be called when xcb wants
1901c7386f4Smrg *                        to use the socket again.
191245c37e9Smrg * @param closure Argument to the callback function.
192245c37e9Smrg * @param flags A combination of flags from the xcb_send_request_flags_t enumeration.
193245c37e9Smrg * @param sent Location to the sequence number of the last sequence request.
1941c7386f4Smrg *              Must not be NULL.
1951c7386f4Smrg * @return 1 on success, else 0.
1961c7386f4Smrg *
1971c7386f4Smrg * xcb_take_socket allows external code to ask XCB for permission to
198602e473dSmrg * take over the write side of the socket and send raw data with
199602e473dSmrg * xcb_writev. xcb_take_socket provides the sequence number of the last
200602e473dSmrg * request XCB sent. The caller of xcb_take_socket must supply a
201602e473dSmrg * callback which XCB can call when it wants the write side of the
202602e473dSmrg * socket back to make a request. This callback synchronizes with the
20321298544Smrg * external socket owner and flushes any output queues if appropriate.
20421298544Smrg * If you are sending requests which won't cause a reply, please note the
20521298544Smrg * comment for xcb_writev which explains some sequence number wrap issues.
2061c7386f4Smrg *
2071c7386f4Smrg * All replies that are generated while the socket is owned externally have
2081c7386f4Smrg * @p flags applied to them. For example, use XCB_REQUEST_CHECK if you don't
2091c7386f4Smrg * want errors to go to xcb's normal error handling, but instead having to be
2101c7386f4Smrg * picked up via xcb_wait_for_reply(), xcb_poll_for_reply() or
2111c7386f4Smrg * xcb_request_check().
2121c7386f4Smrg */
213602e473dSmrgint xcb_take_socket(xcb_connection_t *c, void (*return_socket)(void *closure), void *closure, int flags, uint64_t *sent);
214602e473dSmrg
2151c7386f4Smrg/**
2161c7386f4Smrg * @brief Send raw data to the X server.
217245c37e9Smrg * @param c The connection to the X server.
218245c37e9Smrg * @param vector Array of data to be sent.
219245c37e9Smrg * @param count Number of entries in @p vector.
220245c37e9Smrg * @param requests Number of requests that are being sent.
2211c7386f4Smrg * @return 1 on success, else 0.
2221c7386f4Smrg *
2231c7386f4Smrg * You must own the write-side of the socket (you've called
224602e473dSmrg * xcb_take_socket, and haven't returned from return_socket yet) to call
225602e473dSmrg * xcb_writev. Also, the iovec must have at least 1 byte of data in it.
22621298544Smrg * You have to make sure that xcb can detect sequence number wraps correctly.
22721298544Smrg * This means that the first request you send after xcb_take_socket must cause a
22821298544Smrg * reply (e.g. just insert a GetInputFocus request). After every (1 << 16) - 1
22921298544Smrg * requests without a reply, you have to insert a request which will cause a
23021298544Smrg * reply. You can again use GetInputFocus for this. You do not have to wait for
23121298544Smrg * any of the GetInputFocus replies, but can instead handle them via
2321c7386f4Smrg * xcb_discard_reply().
2331c7386f4Smrg */
234602e473dSmrgint xcb_writev(xcb_connection_t *c, struct iovec *vector, int count, uint64_t requests);
235602e473dSmrg
236602e473dSmrg
237602e473dSmrg/* xcb_in.c */
238602e473dSmrg
2391c7386f4Smrg/**
2401c7386f4Smrg * @brief Wait for the reply of a given request.
241245c37e9Smrg * @param c The connection to the X server.
242245c37e9Smrg * @param request Sequence number of the request as returned by xcb_send_request().
243245c37e9Smrg * @param e Location to store errors in, or NULL. Ignored for unchecked requests.
2441c7386f4Smrg *
2451c7386f4Smrg * Returns the reply to the given request or returns null in the event of
2461c7386f4Smrg * errors. Blocks until the reply or error for the request arrives, or an I/O
2471c7386f4Smrg * error occurs.
2481c7386f4Smrg */
249602e473dSmrgvoid *xcb_wait_for_reply(xcb_connection_t *c, unsigned int request, xcb_generic_error_t **e);
2501c7386f4Smrg
251709d36bbSmrg/**
252709d36bbSmrg * @brief Wait for the reply of a given request, with 64-bit sequence number
253245c37e9Smrg * @param c The connection to the X server.
254245c37e9Smrg * @param request 64-bit sequence number of the request as returned by xcb_send_request64().
255245c37e9Smrg * @param e Location to store errors in, or NULL. Ignored for unchecked requests.
256709d36bbSmrg *
257709d36bbSmrg * Returns the reply to the given request or returns null in the event of
258709d36bbSmrg * errors. Blocks until the reply or error for the request arrives, or an I/O
259709d36bbSmrg * error occurs.
260709d36bbSmrg *
261709d36bbSmrg * Unlike its xcb_wait_for_reply() counterpart, the given sequence number is not
262709d36bbSmrg * automatically "widened" to 64-bit.
263709d36bbSmrg */
264709d36bbSmrgvoid *xcb_wait_for_reply64(xcb_connection_t *c, uint64_t request, xcb_generic_error_t **e);
265709d36bbSmrg
2661c7386f4Smrg/**
2671c7386f4Smrg * @brief Poll for the reply of a given request.
268245c37e9Smrg * @param c The connection to the X server.
269245c37e9Smrg * @param request Sequence number of the request as returned by xcb_send_request().
270245c37e9Smrg * @param reply Location to store the reply in, must not be NULL.
271245c37e9Smrg * @param error Location to store errors in, or NULL. Ignored for unchecked requests.
2721c7386f4Smrg * @return 1 when the reply to the request was returned, else 0.
2731c7386f4Smrg *
2741c7386f4Smrg * Checks if the reply to the given request already received. Does not block.
2751c7386f4Smrg */
276602e473dSmrgint xcb_poll_for_reply(xcb_connection_t *c, unsigned int request, void **reply, xcb_generic_error_t **error);
2771c7386f4Smrg
278709d36bbSmrg/**
279709d36bbSmrg * @brief Poll for the reply of a given request, with 64-bit sequence number.
280245c37e9Smrg * @param c The connection to the X server.
281245c37e9Smrg * @param request 64-bit sequence number of the request as returned by xcb_send_request().
282245c37e9Smrg * @param reply Location to store the reply in, must not be NULL.
283245c37e9Smrg * @param error Location to store errors in, or NULL. Ignored for unchecked requests.
284709d36bbSmrg * @return 1 when the reply to the request was returned, else 0.
285709d36bbSmrg *
286709d36bbSmrg * Checks if the reply to the given request already received. Does not block.
287709d36bbSmrg *
288709d36bbSmrg * Unlike its xcb_poll_for_reply() counterpart, the given sequence number is not
289709d36bbSmrg * automatically "widened" to 64-bit.
290709d36bbSmrg */
291709d36bbSmrgint xcb_poll_for_reply64(xcb_connection_t *c, uint64_t request, void **reply, xcb_generic_error_t **error);
292709d36bbSmrg
2931c7386f4Smrg/**
2941c7386f4Smrg * @brief Don't use this, only needed by the generated code.
295245c37e9Smrg * @param c The connection to the X server.
296245c37e9Smrg * @param reply A reply that was received from the server
297245c37e9Smrg * @param replylen The size of the reply.
2981c7386f4Smrg * @return Pointer to the location where received file descriptors are stored.
2991c7386f4Smrg */
3001016ad83Smrgint *xcb_get_reply_fds(xcb_connection_t *c, void *reply, size_t replylen);
301602e473dSmrg
302602e473dSmrg
303602e473dSmrg/* xcb_util.c */
304602e473dSmrg
3051c7386f4Smrg/**
306245c37e9Smrg * @param mask The mask to check
3071c7386f4Smrg * @return The number of set bits in the mask
3081c7386f4Smrg */
309602e473dSmrgint xcb_popcount(uint32_t mask);
3101c7386f4Smrg
3111c7386f4Smrg/**
312245c37e9Smrg * @param list The base of an array
313245c37e9Smrg * @param len The length of the array
3141c7386f4Smrg * @return The sum of all entries in the array.
3151c7386f4Smrg */
31621298544Smrgint xcb_sumof(uint8_t *list, int len);
317602e473dSmrg
318602e473dSmrg#ifdef __cplusplus
319602e473dSmrg}
320602e473dSmrg#endif
321602e473dSmrg
322602e473dSmrg#endif
323