Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/linuxbsd_headers/wayland/wayland-client-core.h
9898 views
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
#ifndef WAYLAND_CLIENT_CORE_H
27
#define WAYLAND_CLIENT_CORE_H
28
29
#include <stdint.h>
30
#include "wayland-util.h"
31
#include "wayland-version.h"
32
33
#ifdef __cplusplus
34
extern "C" {
35
#endif
36
37
/** \class wl_proxy
38
*
39
* \brief Represents a protocol object on the client side.
40
*
41
* A wl_proxy acts as a client side proxy to an object existing in the
42
* compositor. The proxy is responsible for converting requests made by the
43
* clients with \ref wl_proxy_marshal() into Wayland's wire format. Events
44
* coming from the compositor are also handled by the proxy, which will in
45
* turn call the handler set with \ref wl_proxy_add_listener().
46
*
47
* \note With the exception of function \ref wl_proxy_set_queue(), functions
48
* accessing a wl_proxy are not normally used by client code. Clients
49
* should normally use the higher level interface generated by the scanner to
50
* interact with compositor objects.
51
*
52
*/
53
struct wl_proxy;
54
55
/** \class wl_display
56
*
57
* \brief Represents a connection to the compositor and acts as a proxy to
58
* the wl_display singleton object.
59
*
60
* A wl_display object represents a client connection to a Wayland
61
* compositor. It is created with either \ref wl_display_connect() or
62
* \ref wl_display_connect_to_fd(). A connection is terminated using
63
* \ref wl_display_disconnect().
64
*
65
* A wl_display is also used as the \ref wl_proxy for the wl_display
66
* singleton object on the compositor side.
67
*
68
* A wl_display object handles all the data sent from and to the
69
* compositor. When a \ref wl_proxy marshals a request, it will write its wire
70
* representation to the display's write buffer. The data is sent to the
71
* compositor when the client calls \ref wl_display_flush().
72
*
73
* Incoming data is handled in two steps: queueing and dispatching. In the
74
* queue step, the data coming from the display fd is interpreted and
75
* added to a queue. On the dispatch step, the handler for the incoming
76
* event set by the client on the corresponding \ref wl_proxy is called.
77
*
78
* A wl_display has at least one event queue, called the <em>default
79
* queue</em>. Clients can create additional event queues with \ref
80
* wl_display_create_queue() and assign \ref wl_proxy's to it. Events
81
* occurring in a particular proxy are always queued in its assigned queue.
82
* A client can ensure that a certain assumption, such as holding a lock
83
* or running from a given thread, is true when a proxy event handler is
84
* called by assigning that proxy to an event queue and making sure that
85
* this queue is only dispatched when the assumption holds.
86
*
87
* The default queue is dispatched by calling \ref wl_display_dispatch().
88
* This will dispatch any events queued on the default queue and attempt
89
* to read from the display fd if it's empty. Events read are then queued
90
* on the appropriate queues according to the proxy assignment.
91
*
92
* A user created queue is dispatched with \ref wl_display_dispatch_queue().
93
* This function behaves exactly the same as wl_display_dispatch()
94
* but it dispatches given queue instead of the default queue.
95
*
96
* A real world example of event queue usage is Mesa's implementation of
97
* eglSwapBuffers() for the Wayland platform. This function might need
98
* to block until a frame callback is received, but dispatching the default
99
* queue could cause an event handler on the client to start drawing
100
* again. This problem is solved using another event queue, so that only
101
* the events handled by the EGL code are dispatched during the block.
102
*
103
* This creates a problem where a thread dispatches a non-default
104
* queue, reading all the data from the display fd. If the application
105
* would call \em poll(2) after that it would block, even though there
106
* might be events queued on the default queue. Those events should be
107
* dispatched with \ref wl_display_dispatch_pending() or \ref
108
* wl_display_dispatch_queue_pending() before flushing and blocking.
109
*/
110
struct wl_display;
111
112
/** \class wl_event_queue
113
*
114
* \brief A queue for \ref wl_proxy object events.
115
*
116
* Event queues allows the events on a display to be handled in a thread-safe
117
* manner. See \ref wl_display for details.
118
*
119
*/
120
struct wl_event_queue;
121
122
/** Destroy proxy after marshalling
123
* @ingroup wl_proxy
124
*/
125
#define WL_MARSHAL_FLAG_DESTROY (1 << 0)
126
127
void
128
wl_event_queue_destroy(struct wl_event_queue *queue);
129
130
struct wl_proxy *
131
wl_proxy_marshal_flags(struct wl_proxy *proxy, uint32_t opcode,
132
const struct wl_interface *interface,
133
uint32_t version,
134
uint32_t flags, ...);
135
136
struct wl_proxy *
137
wl_proxy_marshal_array_flags(struct wl_proxy *proxy, uint32_t opcode,
138
const struct wl_interface *interface,
139
uint32_t version,
140
uint32_t flags,
141
union wl_argument *args);
142
143
void
144
wl_proxy_marshal(struct wl_proxy *p, uint32_t opcode, ...);
145
146
void
147
wl_proxy_marshal_array(struct wl_proxy *p, uint32_t opcode,
148
union wl_argument *args);
149
150
struct wl_proxy *
151
wl_proxy_create(struct wl_proxy *factory,
152
const struct wl_interface *interface);
153
154
void *
155
wl_proxy_create_wrapper(void *proxy);
156
157
void
158
wl_proxy_wrapper_destroy(void *proxy_wrapper);
159
160
struct wl_proxy *
161
wl_proxy_marshal_constructor(struct wl_proxy *proxy,
162
uint32_t opcode,
163
const struct wl_interface *interface,
164
...);
165
166
struct wl_proxy *
167
wl_proxy_marshal_constructor_versioned(struct wl_proxy *proxy,
168
uint32_t opcode,
169
const struct wl_interface *interface,
170
uint32_t version,
171
...);
172
173
struct wl_proxy *
174
wl_proxy_marshal_array_constructor(struct wl_proxy *proxy,
175
uint32_t opcode, union wl_argument *args,
176
const struct wl_interface *interface);
177
178
struct wl_proxy *
179
wl_proxy_marshal_array_constructor_versioned(struct wl_proxy *proxy,
180
uint32_t opcode,
181
union wl_argument *args,
182
const struct wl_interface *interface,
183
uint32_t version);
184
185
void
186
wl_proxy_destroy(struct wl_proxy *proxy);
187
188
int
189
wl_proxy_add_listener(struct wl_proxy *proxy,
190
void (**implementation)(void), void *data);
191
192
const void *
193
wl_proxy_get_listener(struct wl_proxy *proxy);
194
195
int
196
wl_proxy_add_dispatcher(struct wl_proxy *proxy,
197
wl_dispatcher_func_t dispatcher_func,
198
const void * dispatcher_data, void *data);
199
200
void
201
wl_proxy_set_user_data(struct wl_proxy *proxy, void *user_data);
202
203
void *
204
wl_proxy_get_user_data(struct wl_proxy *proxy);
205
206
uint32_t
207
wl_proxy_get_version(struct wl_proxy *proxy);
208
209
uint32_t
210
wl_proxy_get_id(struct wl_proxy *proxy);
211
212
void
213
wl_proxy_set_tag(struct wl_proxy *proxy,
214
const char * const *tag);
215
216
const char * const *
217
wl_proxy_get_tag(struct wl_proxy *proxy);
218
219
const char *
220
wl_proxy_get_class(struct wl_proxy *proxy);
221
222
void
223
wl_proxy_set_queue(struct wl_proxy *proxy, struct wl_event_queue *queue);
224
225
struct wl_display *
226
wl_display_connect(const char *name);
227
228
struct wl_display *
229
wl_display_connect_to_fd(int fd);
230
231
void
232
wl_display_disconnect(struct wl_display *display);
233
234
int
235
wl_display_get_fd(struct wl_display *display);
236
237
int
238
wl_display_dispatch(struct wl_display *display);
239
240
int
241
wl_display_dispatch_queue(struct wl_display *display,
242
struct wl_event_queue *queue);
243
244
int
245
wl_display_dispatch_queue_pending(struct wl_display *display,
246
struct wl_event_queue *queue);
247
248
int
249
wl_display_dispatch_pending(struct wl_display *display);
250
251
int
252
wl_display_get_error(struct wl_display *display);
253
254
uint32_t
255
wl_display_get_protocol_error(struct wl_display *display,
256
const struct wl_interface **interface,
257
uint32_t *id);
258
259
int
260
wl_display_flush(struct wl_display *display);
261
262
int
263
wl_display_roundtrip_queue(struct wl_display *display,
264
struct wl_event_queue *queue);
265
266
int
267
wl_display_roundtrip(struct wl_display *display);
268
269
struct wl_event_queue *
270
wl_display_create_queue(struct wl_display *display);
271
272
int
273
wl_display_prepare_read_queue(struct wl_display *display,
274
struct wl_event_queue *queue);
275
276
int
277
wl_display_prepare_read(struct wl_display *display);
278
279
void
280
wl_display_cancel_read(struct wl_display *display);
281
282
int
283
wl_display_read_events(struct wl_display *display);
284
285
void
286
wl_log_set_handler_client(wl_log_func_t handler);
287
288
#ifdef __cplusplus
289
}
290
#endif
291
292
#endif
293
294