| 1 | /* |
| 2 | * Copyright © 2008 Kristian Høgsberg |
| 3 | * |
| 4 | * Permission is hereby granted, free of charge, to any person obtaining |
| 5 | * a copy of this software and associated documentation files (the |
| 6 | * "Software"), to deal in the Software without restriction, including |
| 7 | * without limitation the rights to use, copy, modify, merge, publish, |
| 8 | * distribute, sublicense, and/or sell copies of the Software, and to |
| 9 | * permit persons to whom the Software is furnished to do so, subject to |
| 10 | * the following conditions: |
| 11 | * |
| 12 | * The above copyright notice and this permission notice (including the |
| 13 | * next paragraph) shall be included in all copies or substantial |
| 14 | * portions of the Software. |
| 15 | * |
| 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
| 17 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| 18 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
| 19 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS |
| 20 | * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN |
| 21 | * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
| 22 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
| 23 | * SOFTWARE. |
| 24 | */ |
| 25 | |
| 26 | /** \file wayland-util.h |
| 27 | * |
| 28 | * \brief Utility classes, functions, and macros. |
| 29 | */ |
| 30 | |
| 31 | #ifndef WAYLAND_UTIL_H |
| 32 | #define WAYLAND_UTIL_H |
| 33 | |
| 34 | #include <math.h> |
| 35 | #include <stddef.h> |
| 36 | #include <inttypes.h> |
| 37 | #include <stdarg.h> |
| 38 | |
| 39 | #ifdef __cplusplus |
| 40 | extern "C" { |
| 41 | #endif |
| 42 | |
| 43 | /** Visibility attribute */ |
| 44 | #if defined(__GNUC__) && __GNUC__ >= 4 |
| 45 | #define WL_EXPORT __attribute__ ((visibility("default"))) |
| 46 | #else |
| 47 | #define WL_EXPORT |
| 48 | #endif |
| 49 | |
| 50 | /** Deprecated attribute */ |
| 51 | #if defined(__GNUC__) && __GNUC__ >= 4 |
| 52 | #define WL_DEPRECATED __attribute__ ((deprecated)) |
| 53 | #else |
| 54 | #define WL_DEPRECATED |
| 55 | #endif |
| 56 | |
| 57 | /** |
| 58 | * Printf-style argument attribute |
| 59 | * |
| 60 | * \param x Ordinality of the format string argument |
| 61 | * \param y Ordinality of the argument to check against the format string |
| 62 | * |
| 63 | * \sa https://gcc.gnu.org/onlinedocs/gcc-3.2.1/gcc/Function-Attributes.html |
| 64 | */ |
| 65 | #if defined(__GNUC__) && __GNUC__ >= 4 |
| 66 | #define WL_PRINTF(x, y) __attribute__((__format__(__printf__, x, y))) |
| 67 | #else |
| 68 | #define WL_PRINTF(x, y) |
| 69 | #endif |
| 70 | |
| 71 | /** \class wl_object |
| 72 | * |
| 73 | * \brief A protocol object. |
| 74 | * |
| 75 | * A `wl_object` is an opaque struct identifying the protocol object |
| 76 | * underlying a `wl_proxy` or `wl_resource`. |
| 77 | * |
| 78 | * \note Functions accessing a `wl_object` are not normally used by client code. |
| 79 | * Clients should normally use the higher level interface generated by the |
| 80 | * scanner to interact with compositor objects. |
| 81 | * |
| 82 | */ |
| 83 | struct wl_object; |
| 84 | |
| 85 | /** |
| 86 | * Protocol message signature |
| 87 | * |
| 88 | * A wl_message describes the signature of an actual protocol message, such as a |
| 89 | * request or event, that adheres to the Wayland protocol wire format. The |
| 90 | * protocol implementation uses a wl_message within its demarshal machinery for |
| 91 | * decoding messages between a compositor and its clients. In a sense, a |
| 92 | * wl_message is to a protocol message like a class is to an object. |
| 93 | * |
| 94 | * The `name` of a wl_message is the name of the corresponding protocol message. |
| 95 | * |
| 96 | * The `signature` is an ordered list of symbols representing the data types |
| 97 | * of message arguments and, optionally, a protocol version and indicators for |
| 98 | * nullability. A leading integer in the `signature` indicates the _since_ |
| 99 | * version of the protocol message. A `?` preceding a data type symbol indicates |
| 100 | * that the following argument type is nullable. While it is a protocol violation |
| 101 | * to send messages with non-nullable arguments set to `NULL`, event handlers in |
| 102 | * clients might still get called with non-nullable object arguments set to |
| 103 | * `NULL`. This can happen when the client destroyed the object being used as |
| 104 | * argument on its side and an event referencing that object was sent before the |
| 105 | * server knew about its destruction. As this race cannot be prevented, clients |
| 106 | * should - as a general rule - program their event handlers such that they can |
| 107 | * handle object arguments declared non-nullable being `NULL` gracefully. |
| 108 | * |
| 109 | * When no arguments accompany a message, `signature` is an empty string. |
| 110 | * |
| 111 | * Symbols: |
| 112 | * |
| 113 | * * `i`: int |
| 114 | * * `u`: uint |
| 115 | * * `f`: fixed |
| 116 | * * `s`: string |
| 117 | * * `o`: object |
| 118 | * * `n`: new_id |
| 119 | * * `a`: array |
| 120 | * * `h`: fd |
| 121 | * * `?`: following argument is nullable |
| 122 | * |
| 123 | * While demarshaling primitive arguments is straightforward, when demarshaling |
| 124 | * messages containing `object` or `new_id` arguments, the protocol |
| 125 | * implementation often must determine the type of the object. The `types` of a |
| 126 | * wl_message is an array of wl_interface references that correspond to `o` and |
| 127 | * `n` arguments in `signature`, with `NULL` placeholders for arguments with |
| 128 | * non-object types. |
| 129 | * |
| 130 | * Consider the protocol event wl_display `delete_id` that has a single `uint` |
| 131 | * argument. The wl_message is: |
| 132 | * |
| 133 | * \code |
| 134 | * { "delete_id", "u", [NULL] } |
| 135 | * \endcode |
| 136 | * |
| 137 | * Here, the message `name` is `"delete_id"`, the `signature` is `"u"`, and the |
| 138 | * argument `types` is `[NULL]`, indicating that the `uint` argument has no |
| 139 | * corresponding wl_interface since it is a primitive argument. |
| 140 | * |
| 141 | * In contrast, consider a `wl_foo` interface supporting protocol request `bar` |
| 142 | * that has existed since version 2, and has two arguments: a `uint` and an |
| 143 | * object of type `wl_baz_interface` that may be `NULL`. Such a `wl_message` |
| 144 | * might be: |
| 145 | * |
| 146 | * \code |
| 147 | * { "bar", "2u?o", [NULL, &wl_baz_interface] } |
| 148 | * \endcode |
| 149 | * |
| 150 | * Here, the message `name` is `"bar"`, and the `signature` is `"2u?o"`. Notice |
| 151 | * how the `2` indicates the protocol version, the `u` indicates the first |
| 152 | * argument type is `uint`, and the `?o` indicates that the second argument |
| 153 | * is an object that may be `NULL`. Lastly, the argument `types` array indicates |
| 154 | * that no wl_interface corresponds to the first argument, while the type |
| 155 | * `wl_baz_interface` corresponds to the second argument. |
| 156 | * |
| 157 | * \sa wl_argument |
| 158 | * \sa wl_interface |
| 159 | * \sa <a href="https://wayland.freedesktop.org/docs/html/ch04.html#sect-Protocol-Wire-Format">Wire Format</a> |
| 160 | */ |
| 161 | struct wl_message { |
| 162 | /** Message name */ |
| 163 | const char *name; |
| 164 | /** Message signature */ |
| 165 | const char *signature; |
| 166 | /** Object argument interfaces */ |
| 167 | const struct wl_interface **types; |
| 168 | }; |
| 169 | |
| 170 | /** |
| 171 | * Protocol object interface |
| 172 | * |
| 173 | * A wl_interface describes the API of a protocol object defined in the Wayland |
| 174 | * protocol specification. The protocol implementation uses a wl_interface |
| 175 | * within its marshalling machinery for encoding client requests. |
| 176 | * |
| 177 | * The `name` of a wl_interface is the name of the corresponding protocol |
| 178 | * interface, and `version` represents the version of the interface. The members |
| 179 | * `method_count` and `event_count` represent the number of `methods` (requests) |
| 180 | * and `events` in the respective wl_message members. |
| 181 | * |
| 182 | * For example, consider a protocol interface `foo`, marked as version `1`, with |
| 183 | * two requests and one event. |
| 184 | * |
| 185 | * \code |
| 186 | * <interface name="foo" version="1"> |
| 187 | * <request name="a"></request> |
| 188 | * <request name="b"></request> |
| 189 | * <event name="c"></event> |
| 190 | * </interface> |
| 191 | * \endcode |
| 192 | * |
| 193 | * Given two wl_message arrays `foo_requests` and `foo_events`, a wl_interface |
| 194 | * for `foo` might be: |
| 195 | * |
| 196 | * \code |
| 197 | * struct wl_interface foo_interface = { |
| 198 | * "foo", 1, |
| 199 | * 2, foo_requests, |
| 200 | * 1, foo_events |
| 201 | * }; |
| 202 | * \endcode |
| 203 | * |
| 204 | * \note The server side of the protocol may define interface <em>implementation |
| 205 | * types</em> that incorporate the term `interface` in their name. Take |
| 206 | * care to not confuse these server-side `struct`s with a wl_interface |
| 207 | * variable whose name also ends in `interface`. For example, while the |
| 208 | * server may define a type `struct wl_foo_interface`, the client may |
| 209 | * define a `struct wl_interface wl_foo_interface`. |
| 210 | * |
| 211 | * \sa wl_message |
| 212 | * \sa wl_proxy |
| 213 | * \sa <a href="https://wayland.freedesktop.org/docs/html/ch04.html#sect-Protocol-Interfaces">Interfaces</a> |
| 214 | * \sa <a href="https://wayland.freedesktop.org/docs/html/ch04.html#sect-Protocol-Versioning">Versioning</a> |
| 215 | */ |
| 216 | struct wl_interface { |
| 217 | /** Interface name */ |
| 218 | const char *name; |
| 219 | /** Interface version */ |
| 220 | int version; |
| 221 | /** Number of methods (requests) */ |
| 222 | int method_count; |
| 223 | /** Method (request) signatures */ |
| 224 | const struct wl_message *methods; |
| 225 | /** Number of events */ |
| 226 | int event_count; |
| 227 | /** Event signatures */ |
| 228 | const struct wl_message *events; |
| 229 | }; |
| 230 | |
| 231 | /** \class wl_list |
| 232 | * |
| 233 | * \brief Doubly-linked list |
| 234 | * |
| 235 | * On its own, an instance of `struct wl_list` represents the sentinel head of |
| 236 | * a doubly-linked list, and must be initialized using wl_list_init(). |
| 237 | * When empty, the list head's `next` and `prev` members point to the list head |
| 238 | * itself, otherwise `next` references the first element in the list, and `prev` |
| 239 | * refers to the last element in the list. |
| 240 | * |
| 241 | * Use the `struct wl_list` type to represent both the list head and the links |
| 242 | * between elements within the list. Use wl_list_empty() to determine if the |
| 243 | * list is empty in O(1). |
| 244 | * |
| 245 | * All elements in the list must be of the same type. The element type must have |
| 246 | * a `struct wl_list` member, often named `link` by convention. Prior to |
| 247 | * insertion, there is no need to initialize an element's `link` - invoking |
| 248 | * wl_list_init() on an individual list element's `struct wl_list` member is |
| 249 | * unnecessary if the very next operation is wl_list_insert(). However, a |
| 250 | * common idiom is to initialize an element's `link` prior to removal - ensure |
| 251 | * safety by invoking wl_list_init() before wl_list_remove(). |
| 252 | * |
| 253 | * Consider a list reference `struct wl_list foo_list`, an element type as |
| 254 | * `struct element`, and an element's link member as `struct wl_list link`. |
| 255 | * |
| 256 | * The following code initializes a list and adds three elements to it. |
| 257 | * |
| 258 | * \code |
| 259 | * struct wl_list foo_list; |
| 260 | * |
| 261 | * struct element { |
| 262 | * int foo; |
| 263 | * struct wl_list link; |
| 264 | * }; |
| 265 | * struct element e1, e2, e3; |
| 266 | * |
| 267 | * wl_list_init(&foo_list); |
| 268 | * wl_list_insert(&foo_list, &e1.link); // e1 is the first element |
| 269 | * wl_list_insert(&foo_list, &e2.link); // e2 is now the first element |
| 270 | * wl_list_insert(&e2.link, &e3.link); // insert e3 after e2 |
| 271 | * \endcode |
| 272 | * |
| 273 | * The list now looks like <em>[e2, e3, e1]</em>. |
| 274 | * |
| 275 | * The `wl_list` API provides some iterator macros. For example, to iterate |
| 276 | * a list in ascending order: |
| 277 | * |
| 278 | * \code |
| 279 | * struct element *e; |
| 280 | * wl_list_for_each(e, foo_list, link) { |
| 281 | * do_something_with_element(e); |
| 282 | * } |
| 283 | * \endcode |
| 284 | * |
| 285 | * See the documentation of each iterator for details. |
| 286 | * \sa http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/linux/list.h |
| 287 | */ |
| 288 | struct wl_list { |
| 289 | /** Previous list element */ |
| 290 | struct wl_list *prev; |
| 291 | /** Next list element */ |
| 292 | struct wl_list *next; |
| 293 | }; |
| 294 | |
| 295 | /** |
| 296 | * Initializes the list. |
| 297 | * |
| 298 | * \param list List to initialize |
| 299 | * |
| 300 | * \memberof wl_list |
| 301 | */ |
| 302 | void |
| 303 | wl_list_init(struct wl_list *list); |
| 304 | |
| 305 | /** |
| 306 | * Inserts an element into the list, after the element represented by \p list. |
| 307 | * When \p list is a reference to the list itself (the head), set the containing |
| 308 | * struct of \p elm as the first element in the list. |
| 309 | * |
| 310 | * \note If \p elm is already part of a list, inserting it again will lead to |
| 311 | * list corruption. |
| 312 | * |
| 313 | * \param list List element after which the new element is inserted |
| 314 | * \param elm Link of the containing struct to insert into the list |
| 315 | * |
| 316 | * \memberof wl_list |
| 317 | */ |
| 318 | void |
| 319 | wl_list_insert(struct wl_list *list, struct wl_list *elm); |
| 320 | |
| 321 | /** |
| 322 | * Removes an element from the list. |
| 323 | * |
| 324 | * \note This operation leaves \p elm in an invalid state. |
| 325 | * |
| 326 | * \param elm Link of the containing struct to remove from the list |
| 327 | * |
| 328 | * \memberof wl_list |
| 329 | */ |
| 330 | void |
| 331 | wl_list_remove(struct wl_list *elm); |
| 332 | |
| 333 | /** |
| 334 | * Determines the length of the list. |
| 335 | * |
| 336 | * \note This is an O(n) operation. |
| 337 | * |
| 338 | * \param list List whose length is to be determined |
| 339 | * |
| 340 | * \return Number of elements in the list |
| 341 | * |
| 342 | * \memberof wl_list |
| 343 | */ |
| 344 | int |
| 345 | wl_list_length(const struct wl_list *list); |
| 346 | |
| 347 | /** |
| 348 | * Determines if the list is empty. |
| 349 | * |
| 350 | * \param list List whose emptiness is to be determined |
| 351 | * |
| 352 | * \return 1 if empty, or 0 if not empty |
| 353 | * |
| 354 | * \memberof wl_list |
| 355 | */ |
| 356 | int |
| 357 | wl_list_empty(const struct wl_list *list); |
| 358 | |
| 359 | /** |
| 360 | * Inserts all of the elements of one list into another, after the element |
| 361 | * represented by \p list. |
| 362 | * |
| 363 | * \note This leaves \p other in an invalid state. |
| 364 | * |
| 365 | * \param list List element after which the other list elements will be inserted |
| 366 | * \param other List of elements to insert |
| 367 | * |
| 368 | * \memberof wl_list |
| 369 | */ |
| 370 | void |
| 371 | wl_list_insert_list(struct wl_list *list, struct wl_list *other); |
| 372 | |
| 373 | /** |
| 374 | * Retrieves a pointer to a containing struct, given a member name. |
| 375 | * |
| 376 | * This macro allows "conversion" from a pointer to a member to its containing |
| 377 | * struct. This is useful if you have a contained item like a wl_list, |
| 378 | * wl_listener, or wl_signal, provided via a callback or other means, and would |
| 379 | * like to retrieve the struct that contains it. |
| 380 | * |
| 381 | * To demonstrate, the following example retrieves a pointer to |
| 382 | * `example_container` given only its `destroy_listener` member: |
| 383 | * |
| 384 | * \code |
| 385 | * struct example_container { |
| 386 | * struct wl_listener destroy_listener; |
| 387 | * // other members... |
| 388 | * }; |
| 389 | * |
| 390 | * void example_container_destroy(struct wl_listener *listener, void *data) |
| 391 | * { |
| 392 | * struct example_container *ctr; |
| 393 | * |
| 394 | * ctr = wl_container_of(listener, ctr, destroy_listener); |
| 395 | * // destroy ctr... |
| 396 | * } |
| 397 | * \endcode |
| 398 | * |
| 399 | * \note `sample` need not be a valid pointer. A null or uninitialised pointer |
| 400 | * is sufficient. |
| 401 | * |
| 402 | * \param ptr Valid pointer to the contained member |
| 403 | * \param sample Pointer to a struct whose type contains \p ptr |
| 404 | * \param member Named location of \p ptr within the \p sample type |
| 405 | * |
| 406 | * \return The container for the specified pointer |
| 407 | */ |
| 408 | #define wl_container_of(ptr, sample, member) \ |
| 409 | (__typeof__(sample))((char *)(ptr) - \ |
| 410 | offsetof(__typeof__(*sample), member)) |
| 411 | |
| 412 | /** |
| 413 | * Iterates over a list. |
| 414 | * |
| 415 | * This macro expresses a for-each iterator for wl_list. Given a list and |
| 416 | * wl_list link member name (often named `link` by convention), this macro |
| 417 | * assigns each element in the list to \p pos, which can then be referenced in |
| 418 | * a trailing code block. For example, given a wl_list of `struct message` |
| 419 | * elements: |
| 420 | * |
| 421 | * \code |
| 422 | * struct message { |
| 423 | * char *contents; |
| 424 | * wl_list link; |
| 425 | * }; |
| 426 | * |
| 427 | * struct wl_list *message_list; |
| 428 | * // Assume message_list now "contains" many messages |
| 429 | * |
| 430 | * struct message *m; |
| 431 | * wl_list_for_each(m, message_list, link) { |
| 432 | * do_something_with_message(m); |
| 433 | * } |
| 434 | * \endcode |
| 435 | * |
| 436 | * \param pos Cursor that each list element will be assigned to |
| 437 | * \param head Head of the list to iterate over |
| 438 | * \param member Name of the link member within the element struct |
| 439 | * |
| 440 | * \relates wl_list |
| 441 | */ |
| 442 | #define wl_list_for_each(pos, head, member) \ |
| 443 | for (pos = wl_container_of((head)->next, pos, member); \ |
| 444 | &pos->member != (head); \ |
| 445 | pos = wl_container_of(pos->member.next, pos, member)) |
| 446 | |
| 447 | /** |
| 448 | * Iterates over a list, safe against removal of the list element. |
| 449 | * |
| 450 | * \note Only removal of the current element, \p pos, is safe. Removing |
| 451 | * any other element during traversal may lead to a loop malfunction. |
| 452 | * |
| 453 | * \sa wl_list_for_each() |
| 454 | * |
| 455 | * \param pos Cursor that each list element will be assigned to |
| 456 | * \param tmp Temporary pointer of the same type as \p pos |
| 457 | * \param head Head of the list to iterate over |
| 458 | * \param member Name of the link member within the element struct |
| 459 | * |
| 460 | * \relates wl_list |
| 461 | */ |
| 462 | #define wl_list_for_each_safe(pos, tmp, head, member) \ |
| 463 | for (pos = wl_container_of((head)->next, pos, member), \ |
| 464 | tmp = wl_container_of((pos)->member.next, tmp, member); \ |
| 465 | &pos->member != (head); \ |
| 466 | pos = tmp, \ |
| 467 | tmp = wl_container_of(pos->member.next, tmp, member)) |
| 468 | |
| 469 | /** |
| 470 | * Iterates backwards over a list. |
| 471 | * |
| 472 | * \sa wl_list_for_each() |
| 473 | * |
| 474 | * \param pos Cursor that each list element will be assigned to |
| 475 | * \param head Head of the list to iterate over |
| 476 | * \param member Name of the link member within the element struct |
| 477 | * |
| 478 | * \relates wl_list |
| 479 | */ |
| 480 | #define wl_list_for_each_reverse(pos, head, member) \ |
| 481 | for (pos = wl_container_of((head)->prev, pos, member); \ |
| 482 | &pos->member != (head); \ |
| 483 | pos = wl_container_of(pos->member.prev, pos, member)) |
| 484 | |
| 485 | /** |
| 486 | * Iterates backwards over a list, safe against removal of the list element. |
| 487 | * |
| 488 | * \note Only removal of the current element, \p pos, is safe. Removing |
| 489 | * any other element during traversal may lead to a loop malfunction. |
| 490 | * |
| 491 | * \sa wl_list_for_each() |
| 492 | * |
| 493 | * \param pos Cursor that each list element will be assigned to |
| 494 | * \param tmp Temporary pointer of the same type as \p pos |
| 495 | * \param head Head of the list to iterate over |
| 496 | * \param member Name of the link member within the element struct |
| 497 | * |
| 498 | * \relates wl_list |
| 499 | */ |
| 500 | #define wl_list_for_each_reverse_safe(pos, tmp, head, member) \ |
| 501 | for (pos = wl_container_of((head)->prev, pos, member), \ |
| 502 | tmp = wl_container_of((pos)->member.prev, tmp, member); \ |
| 503 | &pos->member != (head); \ |
| 504 | pos = tmp, \ |
| 505 | tmp = wl_container_of(pos->member.prev, tmp, member)) |
| 506 | |
| 507 | /** |
| 508 | * \class wl_array |
| 509 | * |
| 510 | * Dynamic array |
| 511 | * |
| 512 | * A wl_array is a dynamic array that can only grow until released. It is |
| 513 | * intended for relatively small allocations whose size is variable or not known |
| 514 | * in advance. While construction of a wl_array does not require all elements to |
| 515 | * be of the same size, wl_array_for_each() does require all elements to have |
| 516 | * the same type and size. |
| 517 | * |
| 518 | */ |
| 519 | struct wl_array { |
| 520 | /** Array size */ |
| 521 | size_t size; |
| 522 | /** Allocated space */ |
| 523 | size_t alloc; |
| 524 | /** Array data */ |
| 525 | void *data; |
| 526 | }; |
| 527 | |
| 528 | /** |
| 529 | * Initializes the array. |
| 530 | * |
| 531 | * \param array Array to initialize |
| 532 | * |
| 533 | * \memberof wl_array |
| 534 | */ |
| 535 | void |
| 536 | wl_array_init(struct wl_array *array); |
| 537 | |
| 538 | /** |
| 539 | * Releases the array data. |
| 540 | * |
| 541 | * \note Leaves the array in an invalid state. |
| 542 | * |
| 543 | * \param array Array whose data is to be released |
| 544 | * |
| 545 | * \memberof wl_array |
| 546 | */ |
| 547 | void |
| 548 | wl_array_release(struct wl_array *array); |
| 549 | |
| 550 | /** |
| 551 | * Increases the size of the array by \p size bytes. |
| 552 | * |
| 553 | * \param array Array whose size is to be increased |
| 554 | * \param size Number of bytes to increase the size of the array by |
| 555 | * |
| 556 | * \return A pointer to the beginning of the newly appended space, or NULL when |
| 557 | * resizing fails. |
| 558 | * |
| 559 | * \memberof wl_array |
| 560 | */ |
| 561 | void * |
| 562 | wl_array_add(struct wl_array *array, size_t size); |
| 563 | |
| 564 | /** |
| 565 | * Copies the contents of \p source to \p array. |
| 566 | * |
| 567 | * \param array Destination array to copy to |
| 568 | * \param source Source array to copy from |
| 569 | * |
| 570 | * \return 0 on success, or -1 on failure |
| 571 | * |
| 572 | * \memberof wl_array |
| 573 | */ |
| 574 | int |
| 575 | wl_array_copy(struct wl_array *array, struct wl_array *source); |
| 576 | |
| 577 | /** |
| 578 | * Iterates over an array. |
| 579 | * |
| 580 | * This macro expresses a for-each iterator for wl_array. It assigns each |
| 581 | * element in the array to \p pos, which can then be referenced in a trailing |
| 582 | * code block. \p pos must be a pointer to the array element type, and all |
| 583 | * array elements must be of the same type and size. |
| 584 | * |
| 585 | * \param pos Cursor that each array element will be assigned to |
| 586 | * \param array Array to iterate over |
| 587 | * |
| 588 | * \relates wl_array |
| 589 | * \sa wl_list_for_each() |
| 590 | */ |
| 591 | #define wl_array_for_each(pos, array) \ |
| 592 | for (pos = (array)->data; \ |
| 593 | (const char *) pos < ((const char *) (array)->data + (array)->size); \ |
| 594 | (pos)++) |
| 595 | |
| 596 | /** |
| 597 | * Fixed-point number |
| 598 | * |
| 599 | * A `wl_fixed_t` is a 24.8 signed fixed-point number with a sign bit, 23 bits |
| 600 | * of integer precision and 8 bits of decimal precision. Consider `wl_fixed_t` |
| 601 | * as an opaque struct with methods that facilitate conversion to and from |
| 602 | * `double` and `int` types. |
| 603 | */ |
| 604 | typedef int32_t wl_fixed_t; |
| 605 | |
| 606 | /** |
| 607 | * Converts a fixed-point number to a floating-point number. |
| 608 | * |
| 609 | * \param f Fixed-point number to convert |
| 610 | * |
| 611 | * \return Floating-point representation of the fixed-point argument |
| 612 | */ |
| 613 | static inline double |
| 614 | wl_fixed_to_double(wl_fixed_t f) |
| 615 | { |
| 616 | union { |
| 617 | double d; |
| 618 | int64_t i; |
| 619 | } u; |
| 620 | |
| 621 | u.i = ((1023LL + 44LL) << 52) + (1LL << 51) + f; |
| 622 | |
| 623 | return u.d - (3LL << 43); |
| 624 | } |
| 625 | |
| 626 | /** |
| 627 | * Converts a floating-point number to a fixed-point number. |
| 628 | * |
| 629 | * \param d Floating-point number to convert |
| 630 | * |
| 631 | * \return Fixed-point representation of the floating-point argument |
| 632 | */ |
| 633 | static inline wl_fixed_t |
| 634 | wl_fixed_from_double(double d) |
| 635 | { |
| 636 | union { |
| 637 | double d; |
| 638 | int64_t i; |
| 639 | } u; |
| 640 | |
| 641 | u.d = d + (3LL << (51 - 8)); |
| 642 | |
| 643 | return (wl_fixed_t)u.i; |
| 644 | } |
| 645 | |
| 646 | /** |
| 647 | * Converts a fixed-point number to an integer. |
| 648 | * |
| 649 | * \param f Fixed-point number to convert |
| 650 | * |
| 651 | * \return Integer component of the fixed-point argument |
| 652 | */ |
| 653 | static inline int |
| 654 | wl_fixed_to_int(wl_fixed_t f) |
| 655 | { |
| 656 | return f / 256; |
| 657 | } |
| 658 | |
| 659 | /** |
| 660 | * Converts an integer to a fixed-point number. |
| 661 | * |
| 662 | * \param i Integer to convert |
| 663 | * |
| 664 | * \return Fixed-point representation of the integer argument |
| 665 | */ |
| 666 | static inline wl_fixed_t |
| 667 | wl_fixed_from_int(int i) |
| 668 | { |
| 669 | return i * 256; |
| 670 | } |
| 671 | |
| 672 | /** |
| 673 | * Protocol message argument data types |
| 674 | * |
| 675 | * This union represents all of the argument types in the Wayland protocol wire |
| 676 | * format. The protocol implementation uses wl_argument within its marshalling |
| 677 | * machinery for dispatching messages between a client and a compositor. |
| 678 | * |
| 679 | * \sa wl_message |
| 680 | * \sa wl_interface |
| 681 | * \sa <a href="https://wayland.freedesktop.org/docs/html/ch04.html#sect-Protocol-wire-Format">Wire Format</a> |
| 682 | */ |
| 683 | union wl_argument { |
| 684 | int32_t i; /**< `int` */ |
| 685 | uint32_t u; /**< `uint` */ |
| 686 | wl_fixed_t f; /**< `fixed` */ |
| 687 | const char *s; /**< `string` */ |
| 688 | struct wl_object *o; /**< `object` */ |
| 689 | uint32_t n; /**< `new_id` */ |
| 690 | struct wl_array *a; /**< `array` */ |
| 691 | int32_t h; /**< `fd` */ |
| 692 | }; |
| 693 | |
| 694 | /** |
| 695 | * Dispatcher function type alias |
| 696 | * |
| 697 | * A dispatcher is a function that handles the emitting of callbacks in client |
| 698 | * code. For programs directly using the C library, this is done by using |
| 699 | * libffi to call function pointers. When binding to languages other than C, |
| 700 | * dispatchers provide a way to abstract the function calling process to be |
| 701 | * friendlier to other function calling systems. |
| 702 | * |
| 703 | * A dispatcher takes five arguments: The first is the dispatcher-specific |
| 704 | * implementation associated with the target object. The second is the object |
| 705 | * upon which the callback is being invoked (either wl_proxy or wl_resource). |
| 706 | * The third and fourth arguments are the opcode and the wl_message |
| 707 | * corresponding to the callback. The final argument is an array of arguments |
| 708 | * received from the other process via the wire protocol. |
| 709 | * |
| 710 | * \param "const void *" Dispatcher-specific implementation data |
| 711 | * \param "void *" Callback invocation target (wl_proxy or `wl_resource`) |
| 712 | * \param uint32_t Callback opcode |
| 713 | * \param "const struct wl_message *" Callback message signature |
| 714 | * \param "union wl_argument *" Array of received arguments |
| 715 | * |
| 716 | * \return 0 on success, or -1 on failure |
| 717 | */ |
| 718 | typedef int (*wl_dispatcher_func_t)(const void *, void *, uint32_t, |
| 719 | const struct wl_message *, |
| 720 | union wl_argument *); |
| 721 | |
| 722 | /** |
| 723 | * Log function type alias |
| 724 | * |
| 725 | * The C implementation of the Wayland protocol abstracts the details of |
| 726 | * logging. Users may customize the logging behavior, with a function conforming |
| 727 | * to the `wl_log_func_t` type, via `wl_log_set_handler_client` and |
| 728 | * `wl_log_set_handler_server`. |
| 729 | * |
| 730 | * A `wl_log_func_t` must conform to the expectations of `vprintf`, and |
| 731 | * expects two arguments: a string to write and a corresponding variable |
| 732 | * argument list. While the string to write may contain format specifiers and |
| 733 | * use values in the variable argument list, the behavior of any `wl_log_func_t` |
| 734 | * depends on the implementation. |
| 735 | * |
| 736 | * \note Take care to not confuse this with `wl_protocol_logger_func_t`, which |
| 737 | * is a specific server-side logger for requests and events. |
| 738 | * |
| 739 | * \param "const char *" String to write to the log, containing optional format |
| 740 | * specifiers |
| 741 | * \param "va_list" Variable argument list |
| 742 | * |
| 743 | * \sa wl_log_set_handler_client |
| 744 | * \sa wl_log_set_handler_server |
| 745 | */ |
| 746 | typedef void (*wl_log_func_t)(const char *, va_list) WL_PRINTF(1, 0); |
| 747 | |
| 748 | /** |
| 749 | * Return value of an iterator function |
| 750 | * |
| 751 | * \sa wl_client_for_each_resource_iterator_func_t |
| 752 | * \sa wl_client_for_each_resource |
| 753 | */ |
| 754 | enum wl_iterator_result { |
| 755 | /** Stop the iteration */ |
| 756 | WL_ITERATOR_STOP, |
| 757 | /** Continue the iteration */ |
| 758 | WL_ITERATOR_CONTINUE |
| 759 | }; |
| 760 | |
| 761 | #ifdef __cplusplus |
| 762 | } |
| 763 | #endif |
| 764 | |
| 765 | #endif |
| 766 | |