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