1 module xcb.xcbext;
2 
3 import xcb.xcb;
4 
5 import core.sys.posix.sys.uio : iovec;
6 
7 extern (C):
8 
9 /* xcb_ext.c */
10 
11 struct xcb_extension_t {
12 	const(char)* name;
13 	int global_id;
14 }
15 
16 /* xcb_out.c */
17 
18 struct xcb_protocol_request_t {
19 	size_t count;
20 	xcb_extension_t* ext;
21 	ubyte opcode;
22 	ubyte isvoid;
23 }
24 
25 enum xcb_send_request_flags_t {
26 	XCB_REQUEST_CHECKED = 1 << 0,
27 	XCB_REQUEST_RAW = 1 << 1,
28 	XCB_REQUEST_DISCARD_REPLY = 1 << 2,
29 	XCB_REQUEST_REPLY_FDS = 1 << 3
30 }
31 
32 alias XCB_REQUEST_CHECKED = xcb_send_request_flags_t.XCB_REQUEST_CHECKED;
33 alias XCB_REQUEST_RAW = xcb_send_request_flags_t.XCB_REQUEST_RAW;
34 alias XCB_REQUEST_DISCARD_REPLY = xcb_send_request_flags_t.XCB_REQUEST_DISCARD_REPLY;
35 alias XCB_REQUEST_REPLY_FDS = xcb_send_request_flags_t.XCB_REQUEST_REPLY_FDS;
36 
37 /**
38  * @brief Send a request to the server.
39  * @param c: The connection to the X server.
40  * @param flags: A combination of flags from the xcb_send_request_flags_t enumeration.
41  * @param vector: Data to send; must have two iovecs before start for internal use.
42  * @param request: Information about the request to be sent.
43  * @return The request's sequence number on success, 0 otherwise.
44  *
45  * This function sends a new request to the X server. The data of the request is
46  * given as an array of @c iovecs in the @p vector argument. The length of that
47  * array and the neccessary management information are given in the @p request
48  * argument.
49  *
50  * When this function returns, the request might or might not be sent already.
51  * Use xcb_flush() to make sure that it really was sent.
52  *
53  * Please note that this function is not the prefered way for sending requests.
54  * It's better to use the generated wrapper functions.
55  *
56  * Please note that xcb might use index -1 and -2 of the @p vector array internally,
57  * so they must be valid!
58  */
59 uint xcb_send_request(xcb_connection_t* c, int flags, iovec* vector, const(xcb_protocol_request_t)* request);
60 
61 /**
62  * @brief Send a request to the server, with 64-bit sequence number returned.
63  * @param c: The connection to the X server.
64  * @param flags: A combination of flags from the xcb_send_request_flags_t enumeration.
65  * @param vector: Data to send; must have two iovecs before start for internal use.
66  * @param request: Information about the request to be sent.
67  * @return The request's sequence number on success, 0 otherwise.
68  *
69  * This function sends a new request to the X server. The data of the request is
70  * given as an array of @c iovecs in the @p vector argument. The length of that
71  * array and the neccessary management information are given in the @p request
72  * argument.
73  *
74  * When this function returns, the request might or might not be sent already.
75  * Use xcb_flush() to make sure that it really was sent.
76  *
77  * Please note that this function is not the prefered way for sending requests.
78  * It's better to use the generated wrapper functions.
79  *
80  * Please note that xcb might use index -1 and -2 of the @p vector array internally,
81  * so they must be valid!
82  */
83 ulong xcb_send_request64(xcb_connection_t* c, int flags, iovec* vector, const(xcb_protocol_request_t)* request);
84 
85 /**
86  * @brief Send a file descriptor to the server in the next call to xcb_send_request.
87  * @param c: The connection to the X server.
88  * @param fd: The file descriptor to send.
89  *
90  * After this function returns, the file descriptor given is owned by xcb and
91  * will be closed eventually.
92  *
93  * FIXME: How the heck is this supposed to work in a thread-safe way? There is a
94  * race between two threads doing xcb_send_fd(); xcb_send_request(); at the same
95  * time.
96  */
97 void xcb_send_fd(xcb_connection_t* c, int fd);
98 
99 /**
100  * @brief Take over the write side of the socket
101  * @param c: The connection to the X server.
102  * @param return_socket: Callback function that will be called when xcb wants
103  *                        to use the socket again.
104  * @param closure: Argument to the callback function.
105  * @param flags: A combination of flags from the xcb_send_request_flags_t enumeration.
106  * @param sent: Location to the sequence number of the last sequence request.
107  *              Must not be NULL.
108  * @return 1 on success, else 0.
109  *
110  * xcb_take_socket allows external code to ask XCB for permission to
111  * take over the write side of the socket and send raw data with
112  * xcb_writev. xcb_take_socket provides the sequence number of the last
113  * request XCB sent. The caller of xcb_take_socket must supply a
114  * callback which XCB can call when it wants the write side of the
115  * socket back to make a request. This callback synchronizes with the
116  * external socket owner and flushes any output queues if appropriate.
117  * If you are sending requests which won't cause a reply, please note the
118  * comment for xcb_writev which explains some sequence number wrap issues.
119  *
120  * All replies that are generated while the socket is owned externally have
121  * @p flags applied to them. For example, use XCB_REQUEST_CHECK if you don't
122  * want errors to go to xcb's normal error handling, but instead having to be
123  * picked up via xcb_wait_for_reply(), xcb_poll_for_reply() or
124  * xcb_request_check().
125  */
126 
127 private alias return_socket_t = void function(void* closure);
128 
129 int xcb_take_socket(xcb_connection_t* c, return_socket_t return_socket, void* closure, int flags, ulong* sent);
130 
131 /**
132  * @brief Send raw data to the X server.
133  * @param c: The connection to the X server.
134  * @param vector: Array of data to be sent.
135  * @param count: Number of entries in @p vector.
136  * @param requests: Number of requests that are being sent.
137  * @return 1 on success, else 0.
138  *
139  * You must own the write-side of the socket (you've called
140  * xcb_take_socket, and haven't returned from return_socket yet) to call
141  * xcb_writev. Also, the iovec must have at least 1 byte of data in it.
142  * You have to make sure that xcb can detect sequence number wraps correctly.
143  * This means that the first request you send after xcb_take_socket must cause a
144  * reply (e.g. just insert a GetInputFocus request). After every (1 << 16) - 1
145  * requests without a reply, you have to insert a request which will cause a
146  * reply. You can again use GetInputFocus for this. You do not have to wait for
147  * any of the GetInputFocus replies, but can instead handle them via
148  * xcb_discard_reply().
149  */
150 int xcb_writev(xcb_connection_t* c, iovec* vector, int count, ulong requests);
151 
152 /* xcb_in.c */
153 
154 /**
155  * @brief Wait for the reply of a given request.
156  * @param c: The connection to the X server.
157  * @param request: Sequence number of the request as returned by xcb_send_request().
158  * @param e: Location to store errors in, or NULL. Ignored for unchecked requests.
159  *
160  * Returns the reply to the given request or returns null in the event of
161  * errors. Blocks until the reply or error for the request arrives, or an I/O
162  * error occurs.
163  */
164 void* xcb_wait_for_reply(xcb_connection_t* c, uint request, xcb_generic_error_t** e);
165 
166 /**
167  * @brief Wait for the reply of a given request, with 64-bit sequence number
168  * @param c: The connection to the X server.
169  * @param request: 64-bit sequence number of the request as returned by xcb_send_request64().
170  * @param e: Location to store errors in, or NULL. Ignored for unchecked requests.
171  *
172  * Returns the reply to the given request or returns null in the event of
173  * errors. Blocks until the reply or error for the request arrives, or an I/O
174  * error occurs.
175  *
176  * Unlike its xcb_wait_for_reply() counterpart, the given sequence number is not
177  * automatically "widened" to 64-bit.
178  */
179 void* xcb_wait_for_reply64(xcb_connection_t* c, ulong request, xcb_generic_error_t** e);
180 
181 /**
182  * @brief Poll for the reply of a given request.
183  * @param c: The connection to the X server.
184  * @param request: Sequence number of the request as returned by xcb_send_request().
185  * @param reply: Location to store the reply in, must not be NULL.
186  * @param e: Location to store errors in, or NULL. Ignored for unchecked requests.
187  * @return 1 when the reply to the request was returned, else 0.
188  *
189  * Checks if the reply to the given request already received. Does not block.
190  */
191 int xcb_poll_for_reply(xcb_connection_t* c, uint request, void** reply, xcb_generic_error_t** error);
192 
193 /**
194  * @brief Poll for the reply of a given request, with 64-bit sequence number.
195  * @param c: The connection to the X server.
196  * @param request: 64-bit sequence number of the request as returned by xcb_send_request().
197  * @param reply: Location to store the reply in, must not be NULL.
198  * @param e: Location to store errors in, or NULL. Ignored for unchecked requests.
199  * @return 1 when the reply to the request was returned, else 0.
200  *
201  * Checks if the reply to the given request already received. Does not block.
202  *
203  * Unlike its xcb_poll_for_reply() counterpart, the given sequence number is not
204  * automatically "widened" to 64-bit.
205  */
206 int xcb_poll_for_reply64(xcb_connection_t* c, ulong request, void** reply, xcb_generic_error_t** error);
207 
208 /**
209  * @brief Don't use this, only needed by the generated code.
210  * @param c: The connection to the X server.
211  * @param reply: A reply that was received from the server
212  * @param replylen: The size of the reply.
213  * @return Pointer to the location where received file descriptors are stored.
214  */
215 int* xcb_get_reply_fds(xcb_connection_t* c, void* reply, size_t replylen);
216 
217 /* xcb_util.c */
218 
219 /**
220  * @param mask: The mask to check
221  * @return The number of set bits in the mask
222  */
223 int xcb_popcount(uint mask);
224 
225 /**
226  * @param list: The base of an array
227  * @param len: The length of the array
228  * @return The sum of all entries in the array.
229  */
230 int xcb_sumof(ubyte* list, int len);