<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Apr 27, 2015 at 8:48 AM, Marek Chalupa <span dir="ltr"><<a href="mailto:mchqwerty@gmail.com" target="_blank">mchqwerty@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi,<br><div><div class="gmail_extra"><br><div class="gmail_quote"><span class="">On Sat, Apr 25, 2015 at 4:39 PM, Giulio Camuffo <span dir="ltr"><<a href="mailto:giuliocamuffo@gmail.com" target="_blank">giuliocamuffo@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">wayland-client.h and wayland-server.h include the protocol headers generated<br>
at build time. This means that a libwayland user cannot generate and use<br>
protocol code created from a wayland.xml newer than the installed libwayand,<br>
because it is not possible to only include the API header.<br>
This commit adds wayland-client-core.h and wayland-server-core.h which do not<br>
include the protocol headers. Additionally wayland-scanner gains a new option<br>
'--include-core-headers' that makes the generated code include the core versions<br>
of the headers.<br></blockquote><div><br></div></span><div>Is the --include-core-headers option necessary? Until now the scanner included wayland-client/server.h<br></div><div>which included the %-protocol.h, but since there are inclusion guards, the protocol header was not<br></div><div>included again - so including wayland-client/server.h is the same as including wayland-client/server-core.h, isn't it?<br></div></div></div></div></div></blockquote><div><br></div><div>I mean when including it into the protocol header<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div class="gmail_extra"><div class="gmail_quote"><div></div><div>So including the core headers should be good for all cases.<br><br></div><div>Anyway, if there's a reason to have this option, then --include-core-headers should be mentioned in help message.<br></div><div><div class="h5"><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
The option handling code in scanner.c comes directly from weston's<br>
shared/option-parser.c.<br>
---<br>
Makefile.am | 2 +<br>
src/scanner.c | 247 ++++++++++++++++++++-----<br>
src/wayland-client-core.h | 180 ++++++++++++++++++<br>
src/wayland-client.h | 147 +--------------<br>
src/wayland-egl.h | 2 +-<br>
src/wayland-server-core.h | 455 ++++++++++++++++++++++++++++++++++++++++++++++<br>
src/wayland-server.h | 422 +-----------------------------------------<br>
7 files changed, 837 insertions(+), 618 deletions(-)<br>
create mode 100644 src/wayland-client-core.h<br>
create mode 100644 src/wayland-server-core.h<br>
<br>
diff --git a/Makefile.am b/Makefile.am<br>
index 0fccf86..a8a0a56 100644<br>
--- a/Makefile.am<br>
+++ b/Makefile.am<br>
@@ -21,7 +21,9 @@ noinst_LTLIBRARIES = <a href="http://libwayland-util.la" target="_blank">libwayland-util.la</a><br>
include_HEADERS = \<br>
src/wayland-util.h \<br>
src/wayland-server.h \<br>
+ src/wayland-server-core.h \<br>
src/wayland-client.h \<br>
+ src/wayland-client-core.h \<br>
src/wayland-egl.h \<br>
src/wayland-version.h<br>
<br>
diff --git a/src/scanner.c b/src/scanner.c<br>
index 1f1e59a..32e12cb 100644<br>
--- a/src/scanner.c<br>
+++ b/src/scanner.c<br>
@@ -67,6 +67,7 @@ struct protocol {<br>
int null_run_length;<br>
char *copyright;<br>
struct description *description;<br>
+ int include_core_headers;<br>
};<br>
<br>
struct interface {<br>
@@ -980,10 +981,55 @@ format_copyright(const char *copyright)<br>
}<br>
<br>
static void<br>
+emit_types_forward_declarations(struct protocol *protocol,<br>
+ struct wl_list *message_list,<br>
+ struct wl_array *types)<br>
+{<br>
+ struct message *m;<br>
+ struct arg *a;<br>
+ int length;<br>
+ char **p;<br>
+<br>
+ wl_list_for_each(m, message_list, link) {<br>
+ length = 0;<br>
+ m->all_null = 1;<br>
+ wl_list_for_each(a, &m->arg_list, link) {<br>
+ length++;<br>
+ switch (a->type) {<br>
+ case NEW_ID:<br>
+ case OBJECT:<br>
+ if (!a->interface_name)<br>
+ continue;<br>
+<br>
+ m->all_null = 0;<br>
+ p = fail_on_null(wl_array_add(types, sizeof *p));<br>
+ *p = a->interface_name;<br>
+ break;<br>
+ default:<br>
+ break;<br>
+ }<br>
+ }<br>
+<br>
+ if (m->all_null && length > protocol->null_run_length)<br>
+ protocol->null_run_length = length;<br>
+ }<br>
+}<br>
+<br>
+static int<br>
+cmp_names(const void *p1, const void *p2)<br>
+{<br>
+ const char * const *s1 = p1, * const *s2 = p2;<br>
+<br>
+ return strcmp(*s1, *s2);<br>
+}<br>
+<br>
+static void<br>
emit_header(struct protocol *protocol, enum side side)<br>
{<br>
struct interface *i;<br>
+ struct wl_array types;<br>
const char *s = (side == SERVER) ? "SERVER" : "CLIENT";<br>
+ char **p, *prev;<br>
<br>
if (protocol->copyright)<br>
format_copyright(protocol->copyright);<br>
@@ -1002,17 +1048,44 @@ emit_header(struct protocol *protocol, enum side side)<br>
"struct wl_resource;\n\n",<br>
protocol->uppercase_name, s,<br>
protocol->uppercase_name, s,<br>
- (side == SERVER) ? "wayland-server.h" : "wayland-client.h");<br>
+ (side == SERVER) ? (protocol->include_core_headers ?<br>
+ "wayland-server-core.h" :<br>
+ "wayland-server.h") :<br>
+ (protocol->include_core_headers ?<br>
+ "wayland-client-core.h" :<br>
+ "wayland-client.h"));<br>
<br>
- wl_list_for_each(i, &protocol->interface_list, link)<br>
- printf("struct %s;\n", i->name);<br>
- printf("\n");<br>
+ wl_array_init(&types);<br>
+ wl_list_for_each(i, &protocol->interface_list, link) {<br>
+ emit_types_forward_declarations(protocol, &i->request_list, &types);<br>
+ emit_types_forward_declarations(protocol, &i->event_list, &types);<br>
+ }<br>
<br>
wl_list_for_each(i, &protocol->interface_list, link) {<br>
+ p = fail_on_null(wl_array_add(&types, sizeof *p));<br>
+ *p = i->name;<br>
+ }<br>
+<br>
+ qsort(types.data, types.size / sizeof *p, sizeof *p, cmp_names);<br>
+ prev = NULL;<br>
+ wl_array_for_each(p, &types) {<br>
+ if (prev && strcmp(*p, prev) == 0)<br>
+ continue;<br>
+ printf("struct %s;\n", *p);<br>
+ prev = *p;<br>
+ }<br>
+ printf("\n");<br>
+<br>
+ prev = NULL;<br>
+ wl_array_for_each(p, &types) {<br>
+ if (prev && strcmp(*p, prev) == 0)<br>
+ continue;<br>
printf("extern const struct wl_interface "<br>
- "%s_interface;\n",<br>
- i->name);<br>
+ "%s_interface;\n", *p);<br>
+ prev = *p;<br>
}<br>
+<br>
+ wl_array_release(&types);<br>
printf("\n");<br>
<br>
wl_list_for_each(i, &protocol->interface_list, link) {<br>
@@ -1039,41 +1112,6 @@ emit_header(struct protocol *protocol, enum side side)<br>
}<br>
<br>
static void<br>
-emit_types_forward_declarations(struct protocol *protocol,<br>
- struct wl_list *message_list,<br>
- struct wl_array *types)<br>
-{<br>
- struct message *m;<br>
- struct arg *a;<br>
- int length;<br>
- char **p;<br>
-<br>
- wl_list_for_each(m, message_list, link) {<br>
- length = 0;<br>
- m->all_null = 1;<br>
- wl_list_for_each(a, &m->arg_list, link) {<br>
- length++;<br>
- switch (a->type) {<br>
- case NEW_ID:<br>
- case OBJECT:<br>
- if (!a->interface_name)<br>
- continue;<br>
-<br>
- m->all_null = 0;<br>
- p = fail_on_null(wl_array_add(types, sizeof *p));<br>
- *p = a->interface_name;<br>
- break;<br>
- default:<br>
- break;<br>
- }<br>
- }<br>
-<br>
- if (m->all_null && length > protocol->null_run_length)<br>
- protocol->null_run_length = length;<br>
- }<br>
-}<br>
-<br>
-static void<br>
emit_null_run(struct protocol *protocol)<br>
{<br>
int i;<br>
@@ -1176,14 +1214,6 @@ emit_messages(struct wl_list *message_list,<br>
printf("};\n\n");<br>
}<br>
<br>
-static int<br>
-cmp_names(const void *p1, const void *p2)<br>
-{<br>
- const char * const *s1 = p1, * const *s2 = p2;<br>
-<br>
- return strcmp(*s1, *s2);<br>
-}<br>
-<br>
static void<br>
emit_code(struct protocol *protocol)<br>
{<br>
@@ -1248,21 +1278,137 @@ emit_code(struct protocol *protocol)<br>
}<br>
}<br>
<br>
+enum option_type {<br>
+ OPTION_INTEGER,<br>
+ OPTION_UNSIGNED_INTEGER,<br>
+ OPTION_STRING,<br>
+ OPTION_BOOLEAN<br>
+};<br>
+<br>
+struct option {<br>
+ enum option_type type;<br>
+ const char *name;<br>
+ int short_name;<br>
+ void *data;<br>
+};<br>
+<br>
+static int<br>
+handle_option(const struct option *option, char *value)<br>
+{<br>
+ char* p;<br>
+<br>
+ switch (option->type) {<br>
+ case OPTION_INTEGER:<br>
+ * (int32_t *) option->data = strtol(value, &p, 0);<br>
+ return *value && !*p;<br>
+ case OPTION_UNSIGNED_INTEGER:<br>
+ * (uint32_t *) option->data = strtoul(value, &p, 0);<br>
+ return *value && !*p;<br>
+ case OPTION_STRING:<br>
+ * (char **) option->data = strdup(value);<br>
+ return 1;<br>
+ default:<br>
+ return 0;<br>
+ }<br>
+}<br>
+<br>
+static int<br>
+long_option(const struct option *options, int count, char *arg)<br>
+{<br>
+ int k, len;<br>
+<br>
+ for (k = 0; k < count; k++) {<br>
+ if (!options[k].name)<br>
+ continue;<br>
+<br>
+ len = strlen(options[k].name);<br>
+ if (strncmp(options[k].name, arg + 2, len) != 0)<br>
+ continue;<br>
+<br>
+ if (options[k].type == OPTION_BOOLEAN) {<br>
+ if (!arg[len + 2]) {<br>
+ * (int32_t *) options[k].data = 1;<br>
+<br>
+ return 1;<br>
+ }<br>
+ } else if (arg[len+2] == '=') {<br>
+ return handle_option(options + k, arg + len + 3);<br>
+ }<br>
+ }<br>
+<br>
+ return 0;<br>
+}<br>
+<br>
+static int<br>
+short_option(const struct option *options, int count, char *arg)<br>
+{<br>
+ int k;<br>
+<br>
+ if (!arg[1])<br>
+ return 0;<br>
+<br>
+ for (k = 0; k < count; k++) {<br>
+ if (options[k].short_name != arg[1])<br>
+ continue;<br>
+<br>
+ if (options[k].type == OPTION_BOOLEAN) {<br>
+ if (!arg[2]) {<br>
+ * (int32_t *) options[k].data = 1;<br>
+<br>
+ return 1;<br>
+ }<br>
+ } else {<br>
+ return handle_option(options + k, arg + 2);<br>
+ }<br>
+ }<br>
+<br>
+ return 0;<br>
+}<br>
+<br>
+static int<br>
+parse_options(const struct option *options,<br>
+ int count, int *argc, char *argv[])<br>
+{<br>
+ int i, j;<br>
+<br>
+ for (i = 1, j = 1; i < *argc; i++) {<br>
+ if (argv[i][0] == '-') {<br>
+ if (argv[i][1] == '-') {<br>
+ if (long_option(options, count, argv[i]))<br>
+ continue;<br>
+ } else if (short_option(options, count, argv[i]))<br>
+ continue;<br>
+ }<br>
+ argv[j++] = argv[i];<br>
+ }<br>
+ argv[j] = NULL;<br>
+ *argc = j;<br>
+<br>
+ return j;<br>
+}<br>
+<br>
int main(int argc, char *argv[])<br>
{<br>
struct parse_context ctx;<br>
struct protocol protocol;<br>
int len;<br>
void *buf;<br>
+ int help = 0, include_core = 0;<br>
enum {<br>
CLIENT_HEADER,<br>
SERVER_HEADER,<br>
CODE,<br>
} mode;<br>
<br>
+ const struct option options[] = {<br>
+ { OPTION_BOOLEAN, "help", 'h', &help },<br>
+ { OPTION_BOOLEAN, "include-core-headers", 0, &include_core },<br>
+ };<br>
+ parse_options(options, sizeof(options) / sizeof(options[0]), &argc, argv);<br>
+<br>
if (argc != 2)<br>
usage(EXIT_FAILURE);<br>
- else if (strcmp(argv[1], "help") == 0 || strcmp(argv[1], "--help") == 0)<br>
+ else if (strcmp(argv[1], "help") == 0 || help)<br>
usage(EXIT_SUCCESS);<br>
else if (strcmp(argv[1], "client-header") == 0)<br>
mode = CLIENT_HEADER;<br>
@@ -1277,6 +1423,7 @@ int main(int argc, char *argv[])<br>
protocol.type_index = 0;<br>
protocol.null_run_length = 0;<br>
protocol.copyright = NULL;<br>
+ protocol.include_core_headers = include_core;<br>
memset(&ctx, 0, sizeof ctx);<br>
ctx.protocol = &protocol;<br>
<br>
diff --git a/src/wayland-client-core.h b/src/wayland-client-core.h<br>
new file mode 100644<br>
index 0000000..d7a0d9e<br>
--- /dev/null<br>
+++ b/src/wayland-client-core.h<br>
@@ -0,0 +1,180 @@<br>
+/*<br>
+ * Copyright © 2008 Kristian Høgsberg<br>
+ *<br>
+ * Permission to use, copy, modify, distribute, and sell this software and its<br>
+ * documentation for any purpose is hereby granted without fee, provided that<br>
+ * the above copyright notice appear in all copies and that both that copyright<br>
+ * notice and this permission notice appear in supporting documentation, and<br>
+ * that the name of the copyright holders not be used in advertising or<br>
+ * publicity pertaining to distribution of the software without specific,<br>
+ * written prior permission. The copyright holders make no representations<br>
+ * about the suitability of this software for any purpose. It is provided "as<br>
+ * is" without express or implied warranty.<br>
+ *<br>
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,<br>
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO<br>
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR<br>
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,<br>
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER<br>
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE<br>
+ * OF THIS SOFTWARE.<br>
+ */<br>
+<br>
+#ifndef WAYLAND_CLIENT_CORE_H<br>
+#define WAYLAND_CLIENT_CORE_H<br>
+<br>
+#include "wayland-util.h"<br>
+#include "wayland-version.h"<br>
+<br>
+#ifdef __cplusplus<br>
+extern "C" {<br>
+#endif<br>
+<br>
+/** \class wl_proxy<br>
+ *<br>
+ * \brief Represents a protocol object on the client side.<br>
+ *<br>
+ * A wl_proxy acts as a client side proxy to an object existing in the<br>
+ * compositor. The proxy is responsible for converting requests made by the<br>
+ * clients with \ref wl_proxy_marshal() into Wayland's wire format. Events<br>
+ * coming from the compositor are also handled by the proxy, which will in<br>
+ * turn call the handler set with \ref wl_proxy_add_listener().<br>
+ *<br>
+ * \note With the exception of function \ref wl_proxy_set_queue(), functions<br>
+ * accessing a wl_proxy are not normally used by client code. Clients<br>
+ * should normally use the higher level interface generated by the scanner to<br>
+ * interact with compositor objects.<br>
+ *<br>
+ */<br>
+struct wl_proxy;<br>
+<br>
+/** \class wl_display<br>
+ *<br>
+ * \brief Represents a connection to the compositor and acts as a proxy to<br>
+ * the wl_display singleton object.<br>
+ *<br>
+ * A wl_display object represents a client connection to a Wayland<br>
+ * compositor. It is created with either \ref wl_display_connect() or<br>
+ * \ref wl_display_connect_to_fd(). A connection is terminated using<br>
+ * \ref wl_display_disconnect().<br>
+ *<br>
+ * A wl_display is also used as the \ref wl_proxy for the wl_display<br>
+ * singleton object on the compositor side.<br>
+ *<br>
+ * A wl_display object handles all the data sent from and to the<br>
+ * compositor. When a \ref wl_proxy marshals a request, it will write its wire<br>
+ * representation to the display's write buffer. The data is sent to the<br>
+ * compositor when the client calls \ref wl_display_flush().<br>
+ *<br>
+ * Incoming data is handled in two steps: queueing and dispatching. In the<br>
+ * queue step, the data coming from the display fd is interpreted and<br>
+ * added to a queue. On the dispatch step, the handler for the incoming<br>
+ * event set by the client on the corresponding \ref wl_proxy is called.<br>
+ *<br>
+ * A wl_display has at least one event queue, called the <em>default<br>
+ * queue</em>. Clients can create additional event queues with \ref<br>
+ * wl_display_create_queue() and assign \ref wl_proxy's to it. Events<br>
+ * occurring in a particular proxy are always queued in its assigned queue.<br>
+ * A client can ensure that a certain assumption, such as holding a lock<br>
+ * or running from a given thread, is true when a proxy event handler is<br>
+ * called by assigning that proxy to an event queue and making sure that<br>
+ * this queue is only dispatched when the assumption holds.<br>
+ *<br>
+ * The default queue is dispatched by calling \ref wl_display_dispatch().<br>
+ * This will dispatch any events queued on the default queue and attempt<br>
+ * to read from the display fd if it's empty. Events read are then queued<br>
+ * on the appropriate queues according to the proxy assignment.<br>
+ *<br>
+ * A user created queue is dispatched with \ref wl_display_dispatch_queue().<br>
+ * This function behaves exactly the same as wl_display_dispatch()<br>
+ * but it dispatches given queue instead of the default queue.<br>
+ *<br>
+ * A real world example of event queue usage is Mesa's implementation of<br>
+ * eglSwapBuffers() for the Wayland platform. This function might need<br>
+ * to block until a frame callback is received, but dispatching the default<br>
+ * queue could cause an event handler on the client to start drawing<br>
+ * again. This problem is solved using another event queue, so that only<br>
+ * the events handled by the EGL code are dispatched during the block.<br>
+ *<br>
+ * This creates a problem where a thread dispatches a non-default<br>
+ * queue, reading all the data from the display fd. If the application<br>
+ * would call \em poll(2) after that it would block, even though there<br>
+ * might be events queued on the default queue. Those events should be<br>
+ * dispatched with \ref wl_display_dispatch_(queue_)pending() before<br>
+ * flushing and blocking.<br>
+ */<br>
+struct wl_display;<br>
+<br>
+/** \class wl_event_queue<br>
+ *<br>
+ * \brief A queue for \ref wl_proxy object events.<br>
+ *<br>
+ * Event queues allows the events on a display to be handled in a thread-safe<br>
+ * manner. See \ref wl_display for details.<br>
+ *<br>
+ */<br>
+struct wl_event_queue;<br>
+<br>
+void wl_event_queue_destroy(struct wl_event_queue *queue);<br>
+<br>
+void wl_proxy_marshal(struct wl_proxy *p, uint32_t opcode, ...);<br>
+void wl_proxy_marshal_array(struct wl_proxy *p, uint32_t opcode,<br>
+ union wl_argument *args);<br>
+struct wl_proxy *wl_proxy_create(struct wl_proxy *factory,<br>
+ const struct wl_interface *interface);<br>
+struct wl_proxy *wl_proxy_marshal_constructor(struct wl_proxy *proxy,<br>
+ uint32_t opcode,<br>
+ const struct wl_interface *interface,<br>
+ ...);<br>
+struct wl_proxy *<br>
+wl_proxy_marshal_array_constructor(struct wl_proxy *proxy,<br>
+ uint32_t opcode, union wl_argument *args,<br>
+ const struct wl_interface *interface);<br>
+<br>
+void wl_proxy_destroy(struct wl_proxy *proxy);<br>
+int wl_proxy_add_listener(struct wl_proxy *proxy,<br>
+ void (**implementation)(void), void *data);<br>
+const void *wl_proxy_get_listener(struct wl_proxy *proxy);<br>
+int wl_proxy_add_dispatcher(struct wl_proxy *proxy,<br>
+ wl_dispatcher_func_t dispatcher_func,<br>
+ const void * dispatcher_data, void *data);<br>
+void wl_proxy_set_user_data(struct wl_proxy *proxy, void *user_data);<br>
+void *wl_proxy_get_user_data(struct wl_proxy *proxy);<br>
+uint32_t wl_proxy_get_id(struct wl_proxy *proxy);<br>
+const char *wl_proxy_get_class(struct wl_proxy *proxy);<br>
+void wl_proxy_set_queue(struct wl_proxy *proxy, struct wl_event_queue *queue);<br>
+<br>
+struct wl_display *wl_display_connect(const char *name);<br>
+struct wl_display *wl_display_connect_to_fd(int fd);<br>
+void wl_display_disconnect(struct wl_display *display);<br>
+int wl_display_get_fd(struct wl_display *display);<br>
+int wl_display_dispatch(struct wl_display *display);<br>
+int wl_display_dispatch_queue(struct wl_display *display,<br>
+ struct wl_event_queue *queue);<br>
+int wl_display_dispatch_queue_pending(struct wl_display *display,<br>
+ struct wl_event_queue *queue);<br>
+int wl_display_dispatch_pending(struct wl_display *display);<br>
+int wl_display_get_error(struct wl_display *display);<br>
+uint32_t wl_display_get_protocol_error(struct wl_display *display,<br>
+ const struct wl_interface **interface,<br>
+ uint32_t *id);<br>
+<br>
+int wl_display_flush(struct wl_display *display);<br>
+int wl_display_roundtrip_queue(struct wl_display *display,<br>
+ struct wl_event_queue *queue);<br>
+int wl_display_roundtrip(struct wl_display *display);<br>
+struct wl_event_queue *wl_display_create_queue(struct wl_display *display);<br>
+<br>
+int wl_display_prepare_read_queue(struct wl_display *display,<br>
+ struct wl_event_queue *queue);<br>
+int wl_display_prepare_read(struct wl_display *display);<br>
+void wl_display_cancel_read(struct wl_display *display);<br>
+int wl_display_read_events(struct wl_display *display);<br>
+<br>
+void wl_log_set_handler_client(wl_log_func_t handler);<br>
+<br>
+#ifdef __cplusplus<br>
+}<br>
+#endif<br>
+<br>
+#endif<br>
diff --git a/src/wayland-client.h b/src/wayland-client.h<br>
index 71cd822..a39fee7 100644<br>
--- a/src/wayland-client.h<br>
+++ b/src/wayland-client.h<br>
@@ -23,158 +23,13 @@<br>
#ifndef WAYLAND_CLIENT_H<br>
#define WAYLAND_CLIENT_H<br>
<br>
-#include "wayland-util.h"<br>
-#include "wayland-version.h"<br>
-<br>
#ifdef __cplusplus<br>
extern "C" {<br>
#endif<br>
<br>
-/** \class wl_proxy<br>
- *<br>
- * \brief Represents a protocol object on the client side.<br>
- *<br>
- * A wl_proxy acts as a client side proxy to an object existing in the<br>
- * compositor. The proxy is responsible for converting requests made by the<br>
- * clients with \ref wl_proxy_marshal() into Wayland's wire format. Events<br>
- * coming from the compositor are also handled by the proxy, which will in<br>
- * turn call the handler set with \ref wl_proxy_add_listener().<br>
- *<br>
- * \note With the exception of function \ref wl_proxy_set_queue(), functions<br>
- * accessing a wl_proxy are not normally used by client code. Clients<br>
- * should normally use the higher level interface generated by the scanner to<br>
- * interact with compositor objects.<br>
- *<br>
- */<br>
-struct wl_proxy;<br>
-<br>
-/** \class wl_display<br>
- *<br>
- * \brief Represents a connection to the compositor and acts as a proxy to<br>
- * the wl_display singleton object.<br>
- *<br>
- * A wl_display object represents a client connection to a Wayland<br>
- * compositor. It is created with either \ref wl_display_connect() or<br>
- * \ref wl_display_connect_to_fd(). A connection is terminated using<br>
- * \ref wl_display_disconnect().<br>
- *<br>
- * A wl_display is also used as the \ref wl_proxy for the wl_display<br>
- * singleton object on the compositor side.<br>
- *<br>
- * A wl_display object handles all the data sent from and to the<br>
- * compositor. When a \ref wl_proxy marshals a request, it will write its wire<br>
- * representation to the display's write buffer. The data is sent to the<br>
- * compositor when the client calls \ref wl_display_flush().<br>
- *<br>
- * Incoming data is handled in two steps: queueing and dispatching. In the<br>
- * queue step, the data coming from the display fd is interpreted and<br>
- * added to a queue. On the dispatch step, the handler for the incoming<br>
- * event set by the client on the corresponding \ref wl_proxy is called.<br>
- *<br>
- * A wl_display has at least one event queue, called the <em>default<br>
- * queue</em>. Clients can create additional event queues with \ref<br>
- * wl_display_create_queue() and assign \ref wl_proxy's to it. Events<br>
- * occurring in a particular proxy are always queued in its assigned queue.<br>
- * A client can ensure that a certain assumption, such as holding a lock<br>
- * or running from a given thread, is true when a proxy event handler is<br>
- * called by assigning that proxy to an event queue and making sure that<br>
- * this queue is only dispatched when the assumption holds.<br>
- *<br>
- * The default queue is dispatched by calling \ref wl_display_dispatch().<br>
- * This will dispatch any events queued on the default queue and attempt<br>
- * to read from the display fd if it's empty. Events read are then queued<br>
- * on the appropriate queues according to the proxy assignment.<br>
- *<br>
- * A user created queue is dispatched with \ref wl_display_dispatch_queue().<br>
- * This function behaves exactly the same as wl_display_dispatch()<br>
- * but it dispatches given queue instead of the default queue.<br>
- *<br>
- * A real world example of event queue usage is Mesa's implementation of<br>
- * eglSwapBuffers() for the Wayland platform. This function might need<br>
- * to block until a frame callback is received, but dispatching the default<br>
- * queue could cause an event handler on the client to start drawing<br>
- * again. This problem is solved using another event queue, so that only<br>
- * the events handled by the EGL code are dispatched during the block.<br>
- *<br>
- * This creates a problem where a thread dispatches a non-default<br>
- * queue, reading all the data from the display fd. If the application<br>
- * would call \em poll(2) after that it would block, even though there<br>
- * might be events queued on the default queue. Those events should be<br>
- * dispatched with \ref wl_display_dispatch_(queue_)pending() before<br>
- * flushing and blocking.<br>
- */<br>
-struct wl_display;<br>
-<br>
-/** \class wl_event_queue<br>
- *<br>
- * \brief A queue for \ref wl_proxy object events.<br>
- *<br>
- * Event queues allows the events on a display to be handled in a thread-safe<br>
- * manner. See \ref wl_display for details.<br>
- *<br>
- */<br>
-struct wl_event_queue;<br>
-<br>
-void wl_event_queue_destroy(struct wl_event_queue *queue);<br>
-<br>
-void wl_proxy_marshal(struct wl_proxy *p, uint32_t opcode, ...);<br>
-void wl_proxy_marshal_array(struct wl_proxy *p, uint32_t opcode,<br>
- union wl_argument *args);<br>
-struct wl_proxy *wl_proxy_create(struct wl_proxy *factory,<br>
- const struct wl_interface *interface);<br>
-struct wl_proxy *wl_proxy_marshal_constructor(struct wl_proxy *proxy,<br>
- uint32_t opcode,<br>
- const struct wl_interface *interface,<br>
- ...);<br>
-struct wl_proxy *<br>
-wl_proxy_marshal_array_constructor(struct wl_proxy *proxy,<br>
- uint32_t opcode, union wl_argument *args,<br>
- const struct wl_interface *interface);<br>
-<br>
-void wl_proxy_destroy(struct wl_proxy *proxy);<br>
-int wl_proxy_add_listener(struct wl_proxy *proxy,<br>
- void (**implementation)(void), void *data);<br>
-const void *wl_proxy_get_listener(struct wl_proxy *proxy);<br>
-int wl_proxy_add_dispatcher(struct wl_proxy *proxy,<br>
- wl_dispatcher_func_t dispatcher_func,<br>
- const void * dispatcher_data, void *data);<br>
-void wl_proxy_set_user_data(struct wl_proxy *proxy, void *user_data);<br>
-void *wl_proxy_get_user_data(struct wl_proxy *proxy);<br>
-uint32_t wl_proxy_get_id(struct wl_proxy *proxy);<br>
-const char *wl_proxy_get_class(struct wl_proxy *proxy);<br>
-void wl_proxy_set_queue(struct wl_proxy *proxy, struct wl_event_queue *queue);<br>
-<br>
+#include "wayland-client-core.h"<br>
#include "wayland-client-protocol.h"<br>
<br>
-struct wl_display *wl_display_connect(const char *name);<br>
-struct wl_display *wl_display_connect_to_fd(int fd);<br>
-void wl_display_disconnect(struct wl_display *display);<br>
-int wl_display_get_fd(struct wl_display *display);<br>
-int wl_display_dispatch(struct wl_display *display);<br>
-int wl_display_dispatch_queue(struct wl_display *display,<br>
- struct wl_event_queue *queue);<br>
-int wl_display_dispatch_queue_pending(struct wl_display *display,<br>
- struct wl_event_queue *queue);<br>
-int wl_display_dispatch_pending(struct wl_display *display);<br>
-int wl_display_get_error(struct wl_display *display);<br>
-uint32_t wl_display_get_protocol_error(struct wl_display *display,<br>
- const struct wl_interface **interface,<br>
- uint32_t *id);<br>
-<br>
-int wl_display_flush(struct wl_display *display);<br>
-int wl_display_roundtrip_queue(struct wl_display *display,<br>
- struct wl_event_queue *queue);<br>
-int wl_display_roundtrip(struct wl_display *display);<br>
-struct wl_event_queue *wl_display_create_queue(struct wl_display *display);<br>
-<br>
-int wl_display_prepare_read_queue(struct wl_display *display,<br>
- struct wl_event_queue *queue);<br>
-int wl_display_prepare_read(struct wl_display *display);<br>
-void wl_display_cancel_read(struct wl_display *display);<br>
-int wl_display_read_events(struct wl_display *display);<br>
-<br>
-void wl_log_set_handler_client(wl_log_func_t handler);<br>
-<br>
#ifdef __cplusplus<br>
}<br>
#endif<br>
diff --git a/src/wayland-egl.h b/src/wayland-egl.h<br>
index c40280b..714002f 100644<br>
--- a/src/wayland-egl.h<br>
+++ b/src/wayland-egl.h<br>
@@ -28,7 +28,7 @@<br>
extern "C" {<br>
#endif<br>
<br>
-#include <wayland-client.h><br>
+#include <wayland-client-core.h><br>
<br>
#define WL_EGL_PLATFORM 1<br>
<br>
diff --git a/src/wayland-server-core.h b/src/wayland-server-core.h<br>
new file mode 100644<br>
index 0000000..7bdd986<br>
--- /dev/null<br>
+++ b/src/wayland-server-core.h<br>
@@ -0,0 +1,455 @@<br>
+/*<br>
+ * Copyright © 2008 Kristian Høgsberg<br>
+ *<br>
+ * Permission to use, copy, modify, distribute, and sell this software and its<br>
+ * documentation for any purpose is hereby granted without fee, provided that<br>
+ * the above copyright notice appear in all copies and that both that copyright<br>
+ * notice and this permission notice appear in supporting documentation, and<br>
+ * that the name of the copyright holders not be used in advertising or<br>
+ * publicity pertaining to distribution of the software without specific,<br>
+ * written prior permission. The copyright holders make no representations<br>
+ * about the suitability of this software for any purpose. It is provided "as<br>
+ * is" without express or implied warranty.<br>
+ *<br>
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,<br>
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO<br>
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR<br>
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,<br>
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER<br>
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE<br>
+ * OF THIS SOFTWARE.<br>
+ */<br>
+<br>
+#ifndef WAYLAND_SERVER_CORE_H<br>
+#define WAYLAND_SERVER_CORE_H<br>
+<br>
+#ifdef __cplusplus<br>
+extern "C" {<br>
+#endif<br>
+<br>
+#include <sys/types.h><br>
+#include <stdint.h><br>
+#include "wayland-util.h"<br>
+#include "wayland-version.h"<br>
+<br>
+enum {<br>
+ WL_EVENT_READABLE = 0x01,<br>
+ WL_EVENT_WRITABLE = 0x02,<br>
+ WL_EVENT_HANGUP = 0x04,<br>
+ WL_EVENT_ERROR = 0x08<br>
+};<br>
+<br>
+struct wl_event_loop;<br>
+struct wl_event_source;<br>
+typedef int (*wl_event_loop_fd_func_t)(int fd, uint32_t mask, void *data);<br>
+typedef int (*wl_event_loop_timer_func_t)(void *data);<br>
+typedef int (*wl_event_loop_signal_func_t)(int signal_number, void *data);<br>
+typedef void (*wl_event_loop_idle_func_t)(void *data);<br>
+<br>
+struct wl_event_loop *wl_event_loop_create(void);<br>
+void wl_event_loop_destroy(struct wl_event_loop *loop);<br>
+struct wl_event_source *wl_event_loop_add_fd(struct wl_event_loop *loop,<br>
+ int fd, uint32_t mask,<br>
+ wl_event_loop_fd_func_t func,<br>
+ void *data);<br>
+int wl_event_source_fd_update(struct wl_event_source *source, uint32_t mask);<br>
+struct wl_event_source *wl_event_loop_add_timer(struct wl_event_loop *loop,<br>
+ wl_event_loop_timer_func_t func,<br>
+ void *data);<br>
+struct wl_event_source *<br>
+wl_event_loop_add_signal(struct wl_event_loop *loop,<br>
+ int signal_number,<br>
+ wl_event_loop_signal_func_t func,<br>
+ void *data);<br>
+<br>
+int wl_event_source_timer_update(struct wl_event_source *source,<br>
+ int ms_delay);<br>
+int wl_event_source_remove(struct wl_event_source *source);<br>
+void wl_event_source_check(struct wl_event_source *source);<br>
+<br>
+<br>
+int wl_event_loop_dispatch(struct wl_event_loop *loop, int timeout);<br>
+void wl_event_loop_dispatch_idle(struct wl_event_loop *loop);<br>
+struct wl_event_source *wl_event_loop_add_idle(struct wl_event_loop *loop,<br>
+ wl_event_loop_idle_func_t func,<br>
+ void *data);<br>
+int wl_event_loop_get_fd(struct wl_event_loop *loop);<br>
+<br>
+struct wl_client;<br>
+struct wl_display;<br>
+struct wl_listener;<br>
+struct wl_resource;<br>
+struct wl_global;<br>
+typedef void (*wl_notify_func_t)(struct wl_listener *listener, void *data);<br>
+<br>
+void wl_event_loop_add_destroy_listener(struct wl_event_loop *loop,<br>
+ struct wl_listener * listener);<br>
+struct wl_listener *wl_event_loop_get_destroy_listener(<br>
+ struct wl_event_loop *loop,<br>
+ wl_notify_func_t notify);<br>
+<br>
+struct wl_display *wl_display_create(void);<br>
+void wl_display_destroy(struct wl_display *display);<br>
+struct wl_event_loop *wl_display_get_event_loop(struct wl_display *display);<br>
+int wl_display_add_socket(struct wl_display *display, const char *name);<br>
+const char *wl_display_add_socket_auto(struct wl_display *display);<br>
+void wl_display_terminate(struct wl_display *display);<br>
+void wl_display_run(struct wl_display *display);<br>
+void wl_display_flush_clients(struct wl_display *display);<br>
+<br>
+typedef void (*wl_global_bind_func_t)(struct wl_client *client, void *data,<br>
+ uint32_t version, uint32_t id);<br>
+<br>
+uint32_t wl_display_get_serial(struct wl_display *display);<br>
+uint32_t wl_display_next_serial(struct wl_display *display);<br>
+<br>
+void wl_display_add_destroy_listener(struct wl_display *display,<br>
+ struct wl_listener *listener);<br>
+struct wl_listener *wl_display_get_destroy_listener(struct wl_display *display,<br>
+ wl_notify_func_t notify);<br>
+<br>
+struct wl_global *wl_global_create(struct wl_display *display,<br>
+ const struct wl_interface *interface,<br>
+ int version,<br>
+ void *data, wl_global_bind_func_t bind);<br>
+void wl_global_destroy(struct wl_global *global);<br>
+<br>
+struct wl_client *wl_client_create(struct wl_display *display, int fd);<br>
+void wl_client_destroy(struct wl_client *client);<br>
+void wl_client_flush(struct wl_client *client);<br>
+void wl_client_get_credentials(struct wl_client *client,<br>
+ pid_t *pid, uid_t *uid, gid_t *gid);<br>
+<br>
+void wl_client_add_destroy_listener(struct wl_client *client,<br>
+ struct wl_listener *listener);<br>
+struct wl_listener *wl_client_get_destroy_listener(struct wl_client *client,<br>
+ wl_notify_func_t notify);<br>
+<br>
+struct wl_resource *<br>
+wl_client_get_object(struct wl_client *client, uint32_t id);<br>
+void<br>
+wl_client_post_no_memory(struct wl_client *client);<br>
+<br>
+/** \class wl_listener<br>
+ *<br>
+ * \brief A single listener for Wayland signals<br>
+ *<br>
+ * wl_listener provides the means to listen for wl_signal notifications. Many<br>
+ * Wayland objects use wl_listener for notification of significant events like<br>
+ * object destruction.<br>
+ *<br>
+ * Clients should create wl_listener objects manually and can register them as<br>
+ * listeners to signals using #wl_signal_add, assuming the signal is<br>
+ * directly accessible. For opaque structs like wl_event_loop, adding a<br>
+ * listener should be done through provided accessor methods. A listener can<br>
+ * only listen to one signal at a time.<br>
+ *<br>
+ * \code<br>
+ * struct wl_listener your_listener;<br>
+ *<br>
+ * your_listener.notify = your_callback_method;<br>
+ *<br>
+ * // Direct access<br>
+ * wl_signal_add(&some_object->destroy_signal, &your_listener);<br>
+ *<br>
+ * // Accessor access<br>
+ * wl_event_loop *loop = ...;<br>
+ * wl_event_loop_add_destroy_listener(loop, &your_listener);<br>
+ * \endcode<br>
+ *<br>
+ * If the listener is part of a larger struct, #wl_container_of can be used<br>
+ * to retrieve a pointer to it:<br>
+ *<br>
+ * \code<br>
+ * void your_listener(struct wl_listener *listener, void *data)<br>
+ * {<br>
+ * struct your_data *data;<br>
+ *<br>
+ * your_data = wl_container_of(listener, data, your_member_name);<br>
+ * }<br>
+ * \endcode<br>
+ *<br>
+ * If you need to remove a listener from a signal, use wl_list_remove().<br>
+ *<br>
+ * \code<br>
+ * wl_list_remove(&your_listener.link);<br>
+ * \endcode<br>
+ *<br>
+ * \sa wl_signal<br>
+ */<br>
+struct wl_listener {<br>
+ struct wl_list link;<br>
+ wl_notify_func_t notify;<br>
+};<br>
+<br>
+/** \class wl_signal<br>
+ *<br>
+ * \brief A source of a type of observable event<br>
+ *<br>
+ * Signals are recognized points where significant events can be observed.<br>
+ * Compositors as well as the server can provide signals. Observers are<br>
+ * wl_listener's that are added through #wl_signal_add. Signals are emitted<br>
+ * using #wl_signal_emit, which will invoke all listeners until that<br>
+ * listener is removed by wl_list_remove() (or whenever the signal is<br>
+ * destroyed).<br>
+ *<br>
+ * \sa wl_listener for more information on using wl_signal<br>
+ */<br>
+struct wl_signal {<br>
+ struct wl_list listener_list;<br>
+};<br>
+<br>
+/** Initialize a new \ref wl_signal for use.<br>
+ *<br>
+ * \param signal The signal that will be initialized<br>
+ *<br>
+ * \memberof wl_signal<br>
+ */<br>
+static inline void<br>
+wl_signal_init(struct wl_signal *signal)<br>
+{<br>
+ wl_list_init(&signal->listener_list);<br>
+}<br>
+<br>
+/** Add the specified listener to this signal.<br>
+ *<br>
+ * \param signal The signal that will emit events to the listener<br>
+ * \param listener The listener to add<br>
+ *<br>
+ * \memberof wl_signal<br>
+ */<br>
+static inline void<br>
+wl_signal_add(struct wl_signal *signal, struct wl_listener *listener)<br>
+{<br>
+ wl_list_insert(signal->listener_list.prev, &listener->link);<br>
+}<br>
+<br>
+/** Gets the listener struct for the specified callback.<br>
+ *<br>
+ * \param signal The signal that contains the specified listener<br>
+ * \param notify The listener that is the target of this search<br>
+ * \return the list item that corresponds to the specified listener, or NULL<br>
+ * if none was found<br>
+ *<br>
+ * \memberof wl_signal<br>
+ */<br>
+static inline struct wl_listener *<br>
+wl_signal_get(struct wl_signal *signal, wl_notify_func_t notify)<br>
+{<br>
+ struct wl_listener *l;<br>
+<br>
+ wl_list_for_each(l, &signal->listener_list, link)<br>
+ if (l->notify == notify)<br>
+ return l;<br>
+<br>
+ return NULL;<br>
+}<br>
+<br>
+/** Emits this signal, notifying all registered listeners.<br>
+ *<br>
+ * \param signal The signal object that will emit the signal<br>
+ * \param data The data that will be emitted with the signal<br>
+ *<br>
+ * \memberof wl_signal<br>
+ */<br>
+static inline void<br>
+wl_signal_emit(struct wl_signal *signal, void *data)<br>
+{<br>
+ struct wl_listener *l, *next;<br>
+<br>
+ wl_list_for_each_safe(l, next, &signal->listener_list, link)<br>
+ l->notify(l, data);<br>
+}<br>
+<br>
+typedef void (*wl_resource_destroy_func_t)(struct wl_resource *resource);<br>
+<br>
+#ifndef WL_HIDE_DEPRECATED<br>
+<br>
+struct wl_object {<br>
+ const struct wl_interface *interface;<br>
+ const void *implementation;<br>
+ uint32_t id;<br>
+};<br>
+<br>
+struct wl_resource {<br>
+ struct wl_object object;<br>
+ wl_resource_destroy_func_t destroy;<br>
+ struct wl_list link;<br>
+ struct wl_signal destroy_signal;<br>
+ struct wl_client *client;<br>
+ void *data;<br>
+};<br>
+<br>
+struct wl_buffer {<br>
+ struct wl_resource resource;<br>
+ int32_t width, height;<br>
+ uint32_t busy_count;<br>
+} WL_DEPRECATED;<br>
+<br>
+<br>
+uint32_t<br>
+wl_client_add_resource(struct wl_client *client,<br>
+ struct wl_resource *resource) WL_DEPRECATED;<br>
+<br>
+struct wl_resource *<br>
+wl_client_add_object(struct wl_client *client,<br>
+ const struct wl_interface *interface,<br>
+ const void *implementation,<br>
+ uint32_t id, void *data) WL_DEPRECATED;<br>
+struct wl_resource *<br>
+wl_client_new_object(struct wl_client *client,<br>
+ const struct wl_interface *interface,<br>
+ const void *implementation, void *data) WL_DEPRECATED;<br>
+<br>
+struct wl_global *<br>
+wl_display_add_global(struct wl_display *display,<br>
+ const struct wl_interface *interface,<br>
+ void *data,<br>
+ wl_global_bind_func_t bind) WL_DEPRECATED;<br>
+<br>
+void<br>
+wl_display_remove_global(struct wl_display *display,<br>
+ struct wl_global *global) WL_DEPRECATED;<br>
+<br>
+#endif<br>
+<br>
+/*<br>
+ * Post an event to the client's object referred to by 'resource'.<br>
+ * 'opcode' is the event number generated from the protocol XML<br>
+ * description (the event name). The variable arguments are the event<br>
+ * parameters, in the order they appear in the protocol XML specification.<br>
+ *<br>
+ * The variable arguments' types are:<br>
+ * - type=uint: uint32_t<br>
+ * - type=int: int32_t<br>
+ * - type=fixed: wl_fixed_t<br>
+ * - type=string: (const char *) to a nil-terminated string<br>
+ * - type=array: (struct wl_array *)<br>
+ * - type=fd: int, that is an open file descriptor<br>
+ * - type=new_id: (struct wl_object *) or (struct wl_resource *)<br>
+ * - type=object: (struct wl_object *) or (struct wl_resource *)<br>
+ */<br>
+void wl_resource_post_event(struct wl_resource *resource,<br>
+ uint32_t opcode, ...);<br>
+void wl_resource_post_event_array(struct wl_resource *resource,<br>
+ uint32_t opcode, union wl_argument *args);<br>
+void wl_resource_queue_event(struct wl_resource *resource,<br>
+ uint32_t opcode, ...);<br>
+void wl_resource_queue_event_array(struct wl_resource *resource,<br>
+ uint32_t opcode, union wl_argument *args);<br>
+<br>
+/* msg is a printf format string, variable args are its args. */<br>
+void wl_resource_post_error(struct wl_resource *resource,<br>
+ uint32_t code, const char *msg, ...)<br>
+ __attribute__ ((format (printf, 3, 4)));<br>
+void wl_resource_post_no_memory(struct wl_resource *resource);<br>
+<br>
+struct wl_display *<br>
+wl_client_get_display(struct wl_client *client);<br>
+<br>
+struct wl_resource *<br>
+wl_resource_create(struct wl_client *client,<br>
+ const struct wl_interface *interface,<br>
+ int version, uint32_t id);<br>
+void<br>
+wl_resource_set_implementation(struct wl_resource *resource,<br>
+ const void *implementation,<br>
+ void *data,<br>
+ wl_resource_destroy_func_t destroy);<br>
+void<br>
+wl_resource_set_dispatcher(struct wl_resource *resource,<br>
+ wl_dispatcher_func_t dispatcher,<br>
+ const void *implementation,<br>
+ void *data,<br>
+ wl_resource_destroy_func_t destroy);<br>
+<br>
+void<br>
+wl_resource_destroy(struct wl_resource *resource);<br>
+uint32_t<br>
+wl_resource_get_id(struct wl_resource *resource);<br>
+struct wl_list *<br>
+wl_resource_get_link(struct wl_resource *resource);<br>
+struct wl_resource *<br>
+wl_resource_from_link(struct wl_list *resource);<br>
+struct wl_resource *<br>
+wl_resource_find_for_client(struct wl_list *list, struct wl_client *client);<br>
+struct wl_client *<br>
+wl_resource_get_client(struct wl_resource *resource);<br>
+void<br>
+wl_resource_set_user_data(struct wl_resource *resource, void *data);<br>
+void *<br>
+wl_resource_get_user_data(struct wl_resource *resource);<br>
+int<br>
+wl_resource_get_version(struct wl_resource *resource);<br>
+void<br>
+wl_resource_set_destructor(struct wl_resource *resource,<br>
+ wl_resource_destroy_func_t destroy);<br>
+int<br>
+wl_resource_instance_of(struct wl_resource *resource,<br>
+ const struct wl_interface *interface,<br>
+ const void *implementation);<br>
+<br>
+void<br>
+wl_resource_add_destroy_listener(struct wl_resource *resource,<br>
+ struct wl_listener * listener);<br>
+struct wl_listener *<br>
+wl_resource_get_destroy_listener(struct wl_resource *resource,<br>
+ wl_notify_func_t notify);<br>
+<br>
+#define wl_resource_for_each(resource, list) \<br>
+ for (resource = 0, resource = wl_resource_from_link((list)->next); \<br>
+ wl_resource_get_link(resource) != (list); \<br>
+ resource = wl_resource_from_link(wl_resource_get_link(resource)->next))<br>
+<br>
+#define wl_resource_for_each_safe(resource, tmp, list) \<br>
+ for (resource = 0, tmp = 0, \<br>
+ resource = wl_resource_from_link((list)->next), \<br>
+ tmp = wl_resource_from_link((list)->next->next); \<br>
+ wl_resource_get_link(resource) != (list); \<br>
+ resource = tmp, \<br>
+ tmp = wl_resource_from_link(wl_resource_get_link(resource)->next))<br>
+<br>
+struct wl_shm_buffer;<br>
+<br>
+void<br>
+wl_shm_buffer_begin_access(struct wl_shm_buffer *buffer);<br>
+<br>
+void<br>
+wl_shm_buffer_end_access(struct wl_shm_buffer *buffer);<br>
+<br>
+struct wl_shm_buffer *<br>
+wl_shm_buffer_get(struct wl_resource *resource);<br>
+<br>
+void *<br>
+wl_shm_buffer_get_data(struct wl_shm_buffer *buffer);<br>
+<br>
+int32_t<br>
+wl_shm_buffer_get_stride(struct wl_shm_buffer *buffer);<br>
+<br>
+uint32_t<br>
+wl_shm_buffer_get_format(struct wl_shm_buffer *buffer);<br>
+<br>
+int32_t<br>
+wl_shm_buffer_get_width(struct wl_shm_buffer *buffer);<br>
+<br>
+int32_t<br>
+wl_shm_buffer_get_height(struct wl_shm_buffer *buffer);<br>
+<br>
+int<br>
+wl_display_init_shm(struct wl_display *display);<br>
+<br>
+uint32_t *<br>
+wl_display_add_shm_format(struct wl_display *display, uint32_t format);<br>
+<br>
+struct wl_shm_buffer *<br>
+wl_shm_buffer_create(struct wl_client *client,<br>
+ uint32_t id, int32_t width, int32_t height,<br>
+ int32_t stride, uint32_t format);<br>
+<br>
+void wl_log_set_handler_server(wl_log_func_t handler);<br>
+<br>
+#ifdef __cplusplus<br>
+}<br>
+#endif<br>
+<br>
+#endif<br>
diff --git a/src/wayland-server.h b/src/wayland-server.h<br>
index af2f03d..18364fc 100644<br>
--- a/src/wayland-server.h<br>
+++ b/src/wayland-server.h<br>
@@ -27,429 +27,9 @@<br>
extern "C" {<br>
#endif<br>
<br>
-#include <sys/types.h><br>
-#include <stdint.h><br>
-#include "wayland-util.h"<br>
-#include "wayland-version.h"<br>
-<br>
-enum {<br>
- WL_EVENT_READABLE = 0x01,<br>
- WL_EVENT_WRITABLE = 0x02,<br>
- WL_EVENT_HANGUP = 0x04,<br>
- WL_EVENT_ERROR = 0x08<br>
-};<br>
-<br>
-struct wl_event_loop;<br>
-struct wl_event_source;<br>
-typedef int (*wl_event_loop_fd_func_t)(int fd, uint32_t mask, void *data);<br>
-typedef int (*wl_event_loop_timer_func_t)(void *data);<br>
-typedef int (*wl_event_loop_signal_func_t)(int signal_number, void *data);<br>
-typedef void (*wl_event_loop_idle_func_t)(void *data);<br>
-<br>
-struct wl_event_loop *wl_event_loop_create(void);<br>
-void wl_event_loop_destroy(struct wl_event_loop *loop);<br>
-struct wl_event_source *wl_event_loop_add_fd(struct wl_event_loop *loop,<br>
- int fd, uint32_t mask,<br>
- wl_event_loop_fd_func_t func,<br>
- void *data);<br>
-int wl_event_source_fd_update(struct wl_event_source *source, uint32_t mask);<br>
-struct wl_event_source *wl_event_loop_add_timer(struct wl_event_loop *loop,<br>
- wl_event_loop_timer_func_t func,<br>
- void *data);<br>
-struct wl_event_source *<br>
-wl_event_loop_add_signal(struct wl_event_loop *loop,<br>
- int signal_number,<br>
- wl_event_loop_signal_func_t func,<br>
- void *data);<br>
-<br>
-int wl_event_source_timer_update(struct wl_event_source *source,<br>
- int ms_delay);<br>
-int wl_event_source_remove(struct wl_event_source *source);<br>
-void wl_event_source_check(struct wl_event_source *source);<br>
-<br>
-<br>
-int wl_event_loop_dispatch(struct wl_event_loop *loop, int timeout);<br>
-void wl_event_loop_dispatch_idle(struct wl_event_loop *loop);<br>
-struct wl_event_source *wl_event_loop_add_idle(struct wl_event_loop *loop,<br>
- wl_event_loop_idle_func_t func,<br>
- void *data);<br>
-int wl_event_loop_get_fd(struct wl_event_loop *loop);<br>
-<br>
-struct wl_client;<br>
-struct wl_display;<br>
-struct wl_listener;<br>
-struct wl_resource;<br>
-struct wl_global;<br>
-typedef void (*wl_notify_func_t)(struct wl_listener *listener, void *data);<br>
-<br>
-void wl_event_loop_add_destroy_listener(struct wl_event_loop *loop,<br>
- struct wl_listener * listener);<br>
-struct wl_listener *wl_event_loop_get_destroy_listener(<br>
- struct wl_event_loop *loop,<br>
- wl_notify_func_t notify);<br>
-<br>
-struct wl_display *wl_display_create(void);<br>
-void wl_display_destroy(struct wl_display *display);<br>
-struct wl_event_loop *wl_display_get_event_loop(struct wl_display *display);<br>
-int wl_display_add_socket(struct wl_display *display, const char *name);<br>
-const char *wl_display_add_socket_auto(struct wl_display *display);<br>
-void wl_display_terminate(struct wl_display *display);<br>
-void wl_display_run(struct wl_display *display);<br>
-void wl_display_flush_clients(struct wl_display *display);<br>
-<br>
-typedef void (*wl_global_bind_func_t)(struct wl_client *client, void *data,<br>
- uint32_t version, uint32_t id);<br>
-<br>
-uint32_t wl_display_get_serial(struct wl_display *display);<br>
-uint32_t wl_display_next_serial(struct wl_display *display);<br>
-<br>
-void wl_display_add_destroy_listener(struct wl_display *display,<br>
- struct wl_listener *listener);<br>
-struct wl_listener *wl_display_get_destroy_listener(struct wl_display *display,<br>
- wl_notify_func_t notify);<br>
-<br>
-struct wl_global *wl_global_create(struct wl_display *display,<br>
- const struct wl_interface *interface,<br>
- int version,<br>
- void *data, wl_global_bind_func_t bind);<br>
-void wl_global_destroy(struct wl_global *global);<br>
-<br>
-struct wl_client *wl_client_create(struct wl_display *display, int fd);<br>
-void wl_client_destroy(struct wl_client *client);<br>
-void wl_client_flush(struct wl_client *client);<br>
-void wl_client_get_credentials(struct wl_client *client,<br>
- pid_t *pid, uid_t *uid, gid_t *gid);<br>
-<br>
-void wl_client_add_destroy_listener(struct wl_client *client,<br>
- struct wl_listener *listener);<br>
-struct wl_listener *wl_client_get_destroy_listener(struct wl_client *client,<br>
- wl_notify_func_t notify);<br>
-<br>
-struct wl_resource *<br>
-wl_client_get_object(struct wl_client *client, uint32_t id);<br>
-void<br>
-wl_client_post_no_memory(struct wl_client *client);<br>
-<br>
-/** \class wl_listener<br>
- *<br>
- * \brief A single listener for Wayland signals<br>
- *<br>
- * wl_listener provides the means to listen for wl_signal notifications. Many<br>
- * Wayland objects use wl_listener for notification of significant events like<br>
- * object destruction.<br>
- *<br>
- * Clients should create wl_listener objects manually and can register them as<br>
- * listeners to signals using #wl_signal_add, assuming the signal is<br>
- * directly accessible. For opaque structs like wl_event_loop, adding a<br>
- * listener should be done through provided accessor methods. A listener can<br>
- * only listen to one signal at a time.<br>
- *<br>
- * \code<br>
- * struct wl_listener your_listener;<br>
- *<br>
- * your_listener.notify = your_callback_method;<br>
- *<br>
- * // Direct access<br>
- * wl_signal_add(&some_object->destroy_signal, &your_listener);<br>
- *<br>
- * // Accessor access<br>
- * wl_event_loop *loop = ...;<br>
- * wl_event_loop_add_destroy_listener(loop, &your_listener);<br>
- * \endcode<br>
- *<br>
- * If the listener is part of a larger struct, #wl_container_of can be used<br>
- * to retrieve a pointer to it:<br>
- *<br>
- * \code<br>
- * void your_listener(struct wl_listener *listener, void *data)<br>
- * {<br>
- * struct your_data *data;<br>
- *<br>
- * your_data = wl_container_of(listener, data, your_member_name);<br>
- * }<br>
- * \endcode<br>
- *<br>
- * If you need to remove a listener from a signal, use wl_list_remove().<br>
- *<br>
- * \code<br>
- * wl_list_remove(&your_listener.link);<br>
- * \endcode<br>
- *<br>
- * \sa wl_signal<br>
- */<br>
-struct wl_listener {<br>
- struct wl_list link;<br>
- wl_notify_func_t notify;<br>
-};<br>
-<br>
-/** \class wl_signal<br>
- *<br>
- * \brief A source of a type of observable event<br>
- *<br>
- * Signals are recognized points where significant events can be observed.<br>
- * Compositors as well as the server can provide signals. Observers are<br>
- * wl_listener's that are added through #wl_signal_add. Signals are emitted<br>
- * using #wl_signal_emit, which will invoke all listeners until that<br>
- * listener is removed by wl_list_remove() (or whenever the signal is<br>
- * destroyed).<br>
- *<br>
- * \sa wl_listener for more information on using wl_signal<br>
- */<br>
-struct wl_signal {<br>
- struct wl_list listener_list;<br>
-};<br>
-<br>
-/** Initialize a new \ref wl_signal for use.<br>
- *<br>
- * \param signal The signal that will be initialized<br>
- *<br>
- * \memberof wl_signal<br>
- */<br>
-static inline void<br>
-wl_signal_init(struct wl_signal *signal)<br>
-{<br>
- wl_list_init(&signal->listener_list);<br>
-}<br>
-<br>
-/** Add the specified listener to this signal.<br>
- *<br>
- * \param signal The signal that will emit events to the listener<br>
- * \param listener The listener to add<br>
- *<br>
- * \memberof wl_signal<br>
- */<br>
-static inline void<br>
-wl_signal_add(struct wl_signal *signal, struct wl_listener *listener)<br>
-{<br>
- wl_list_insert(signal->listener_list.prev, &listener->link);<br>
-}<br>
-<br>
-/** Gets the listener struct for the specified callback.<br>
- *<br>
- * \param signal The signal that contains the specified listener<br>
- * \param notify The listener that is the target of this search<br>
- * \return the list item that corresponds to the specified listener, or NULL<br>
- * if none was found<br>
- *<br>
- * \memberof wl_signal<br>
- */<br>
-static inline struct wl_listener *<br>
-wl_signal_get(struct wl_signal *signal, wl_notify_func_t notify)<br>
-{<br>
- struct wl_listener *l;<br>
-<br>
- wl_list_for_each(l, &signal->listener_list, link)<br>
- if (l->notify == notify)<br>
- return l;<br>
-<br>
- return NULL;<br>
-}<br>
-<br>
-/** Emits this signal, notifying all registered listeners.<br>
- *<br>
- * \param signal The signal object that will emit the signal<br>
- * \param data The data that will be emitted with the signal<br>
- *<br>
- * \memberof wl_signal<br>
- */<br>
-static inline void<br>
-wl_signal_emit(struct wl_signal *signal, void *data)<br>
-{<br>
- struct wl_listener *l, *next;<br>
-<br>
- wl_list_for_each_safe(l, next, &signal->listener_list, link)<br>
- l->notify(l, data);<br>
-}<br>
-<br>
-typedef void (*wl_resource_destroy_func_t)(struct wl_resource *resource);<br>
-<br>
-#ifndef WL_HIDE_DEPRECATED<br>
-<br>
-struct wl_object {<br>
- const struct wl_interface *interface;<br>
- const void *implementation;<br>
- uint32_t id;<br>
-};<br>
-<br>
-struct wl_resource {<br>
- struct wl_object object;<br>
- wl_resource_destroy_func_t destroy;<br>
- struct wl_list link;<br>
- struct wl_signal destroy_signal;<br>
- struct wl_client *client;<br>
- void *data;<br>
-};<br>
-<br>
-struct wl_buffer {<br>
- struct wl_resource resource;<br>
- int32_t width, height;<br>
- uint32_t busy_count;<br>
-} WL_DEPRECATED;<br>
-<br>
-<br>
-uint32_t<br>
-wl_client_add_resource(struct wl_client *client,<br>
- struct wl_resource *resource) WL_DEPRECATED;<br>
-<br>
-struct wl_resource *<br>
-wl_client_add_object(struct wl_client *client,<br>
- const struct wl_interface *interface,<br>
- const void *implementation,<br>
- uint32_t id, void *data) WL_DEPRECATED;<br>
-struct wl_resource *<br>
-wl_client_new_object(struct wl_client *client,<br>
- const struct wl_interface *interface,<br>
- const void *implementation, void *data) WL_DEPRECATED;<br>
-<br>
-struct wl_global *<br>
-wl_display_add_global(struct wl_display *display,<br>
- const struct wl_interface *interface,<br>
- void *data,<br>
- wl_global_bind_func_t bind) WL_DEPRECATED;<br>
-<br>
-void<br>
-wl_display_remove_global(struct wl_display *display,<br>
- struct wl_global *global) WL_DEPRECATED;<br>
-<br>
-#endif<br>
-<br>
-/*<br>
- * Post an event to the client's object referred to by 'resource'.<br>
- * 'opcode' is the event number generated from the protocol XML<br>
- * description (the event name). The variable arguments are the event<br>
- * parameters, in the order they appear in the protocol XML specification.<br>
- *<br>
- * The variable arguments' types are:<br>
- * - type=uint: uint32_t<br>
- * - type=int: int32_t<br>
- * - type=fixed: wl_fixed_t<br>
- * - type=string: (const char *) to a nil-terminated string<br>
- * - type=array: (struct wl_array *)<br>
- * - type=fd: int, that is an open file descriptor<br>
- * - type=new_id: (struct wl_object *) or (struct wl_resource *)<br>
- * - type=object: (struct wl_object *) or (struct wl_resource *)<br>
- */<br>
-void wl_resource_post_event(struct wl_resource *resource,<br>
- uint32_t opcode, ...);<br>
-void wl_resource_post_event_array(struct wl_resource *resource,<br>
- uint32_t opcode, union wl_argument *args);<br>
-void wl_resource_queue_event(struct wl_resource *resource,<br>
- uint32_t opcode, ...);<br>
-void wl_resource_queue_event_array(struct wl_resource *resource,<br>
- uint32_t opcode, union wl_argument *args);<br>
-<br>
-/* msg is a printf format string, variable args are its args. */<br>
-void wl_resource_post_error(struct wl_resource *resource,<br>
- uint32_t code, const char *msg, ...)<br>
- __attribute__ ((format (printf, 3, 4)));<br>
-void wl_resource_post_no_memory(struct wl_resource *resource);<br>
-<br>
+#include "wayland-server-core.h"<br>
#include "wayland-server-protocol.h"<br>
<br>
-struct wl_display *<br>
-wl_client_get_display(struct wl_client *client);<br>
-<br>
-struct wl_resource *<br>
-wl_resource_create(struct wl_client *client,<br>
- const struct wl_interface *interface,<br>
- int version, uint32_t id);<br>
-void<br>
-wl_resource_set_implementation(struct wl_resource *resource,<br>
- const void *implementation,<br>
- void *data,<br>
- wl_resource_destroy_func_t destroy);<br>
-void<br>
-wl_resource_set_dispatcher(struct wl_resource *resource,<br>
- wl_dispatcher_func_t dispatcher,<br>
- const void *implementation,<br>
- void *data,<br>
- wl_resource_destroy_func_t destroy);<br>
-<br>
-void<br>
-wl_resource_destroy(struct wl_resource *resource);<br>
-uint32_t<br>
-wl_resource_get_id(struct wl_resource *resource);<br>
-struct wl_list *<br>
-wl_resource_get_link(struct wl_resource *resource);<br>
-struct wl_resource *<br>
-wl_resource_from_link(struct wl_list *resource);<br>
-struct wl_resource *<br>
-wl_resource_find_for_client(struct wl_list *list, struct wl_client *client);<br>
-struct wl_client *<br>
-wl_resource_get_client(struct wl_resource *resource);<br>
-void<br>
-wl_resource_set_user_data(struct wl_resource *resource, void *data);<br>
-void *<br>
-wl_resource_get_user_data(struct wl_resource *resource);<br>
-int<br>
-wl_resource_get_version(struct wl_resource *resource);<br>
-void<br>
-wl_resource_set_destructor(struct wl_resource *resource,<br>
- wl_resource_destroy_func_t destroy);<br>
-int<br>
-wl_resource_instance_of(struct wl_resource *resource,<br>
- const struct wl_interface *interface,<br>
- const void *implementation);<br>
-<br>
-void<br>
-wl_resource_add_destroy_listener(struct wl_resource *resource,<br>
- struct wl_listener * listener);<br>
-struct wl_listener *<br>
-wl_resource_get_destroy_listener(struct wl_resource *resource,<br>
- wl_notify_func_t notify);<br>
-<br>
-#define wl_resource_for_each(resource, list) \<br>
- for (resource = 0, resource = wl_resource_from_link((list)->next); \<br>
- wl_resource_get_link(resource) != (list); \<br>
- resource = wl_resource_from_link(wl_resource_get_link(resource)->next))<br>
-<br>
-#define wl_resource_for_each_safe(resource, tmp, list) \<br>
- for (resource = 0, tmp = 0, \<br>
- resource = wl_resource_from_link((list)->next), \<br>
- tmp = wl_resource_from_link((list)->next->next); \<br>
- wl_resource_get_link(resource) != (list); \<br>
- resource = tmp, \<br>
- tmp = wl_resource_from_link(wl_resource_get_link(resource)->next))<br>
-<br>
-struct wl_shm_buffer;<br>
-<br>
-void<br>
-wl_shm_buffer_begin_access(struct wl_shm_buffer *buffer);<br>
-<br>
-void<br>
-wl_shm_buffer_end_access(struct wl_shm_buffer *buffer);<br>
-<br>
-struct wl_shm_buffer *<br>
-wl_shm_buffer_get(struct wl_resource *resource);<br>
-<br>
-void *<br>
-wl_shm_buffer_get_data(struct wl_shm_buffer *buffer);<br>
-<br>
-int32_t<br>
-wl_shm_buffer_get_stride(struct wl_shm_buffer *buffer);<br>
-<br>
-uint32_t<br>
-wl_shm_buffer_get_format(struct wl_shm_buffer *buffer);<br>
-<br>
-int32_t<br>
-wl_shm_buffer_get_width(struct wl_shm_buffer *buffer);<br>
-<br>
-int32_t<br>
-wl_shm_buffer_get_height(struct wl_shm_buffer *buffer);<br>
-<br>
-int<br>
-wl_display_init_shm(struct wl_display *display);<br>
-<br>
-uint32_t *<br>
-wl_display_add_shm_format(struct wl_display *display, uint32_t format);<br>
-<br>
-struct wl_shm_buffer *<br>
-wl_shm_buffer_create(struct wl_client *client,<br>
- uint32_t id, int32_t width, int32_t height,<br>
- int32_t stride, uint32_t format);<br>
-<br>
-void wl_log_set_handler_server(wl_log_func_t handler);<br>
-<br>
#ifdef __cplusplus<br>
}<br>
#endif<br>
<span><font color="#888888">--<br>
2.3.5<br>
<br>
_______________________________________________<br>
wayland-devel mailing list<br>
<a href="mailto:wayland-devel@lists.freedesktop.org" target="_blank">wayland-devel@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/wayland-devel" target="_blank">http://lists.freedesktop.org/mailman/listinfo/wayland-devel</a><br></font></span></blockquote><div><br></div></div></div><div>And the patch doesn't apply on master.<br><br></div><div>Cheers,<br></div><div>Marek <br></div></div><br></div></div></div>
</blockquote></div><br></div></div>