diff options
-rw-r--r-- | Makefile.am | 2 | ||||
-rw-r--r-- | doc/doxygen/Makefile.am | 7 | ||||
-rw-r--r-- | src/wayland-client-core.h | 180 | ||||
-rw-r--r-- | src/wayland-client.h | 160 | ||||
-rw-r--r-- | src/wayland-server-core.h | 405 | ||||
-rw-r--r-- | src/wayland-server.h | 384 |
6 files changed, 610 insertions, 528 deletions
diff --git a/Makefile.am b/Makefile.am index 0fccf86..a8a0a56 100644 --- a/Makefile.am +++ b/Makefile.am @@ -21,7 +21,9 @@ noinst_LTLIBRARIES = libwayland-util.la include_HEADERS = \ src/wayland-util.h \ src/wayland-server.h \ + src/wayland-server-core.h \ src/wayland-client.h \ + src/wayland-client-core.h \ src/wayland-egl.h \ src/wayland-version.h diff --git a/doc/doxygen/Makefile.am b/doc/doxygen/Makefile.am index edf3652..5520d39 100644 --- a/doc/doxygen/Makefile.am +++ b/doc/doxygen/Makefile.am @@ -11,18 +11,21 @@ scanned_src_files_shared = \ scanned_src_files_Client = \ $(scanned_src_files_shared) \ $(top_srcdir)/src/wayland-client.c \ - $(top_srcdir)/src/wayland-client.h + $(top_srcdir)/src/wayland-client.h \ + $(top_srcdir)/src/wayland-client-core.h scanned_src_files_Server = \ $(scanned_src_files_shared) \ $(top_srcdir)/src/wayland-server.c \ $(top_srcdir)/src/wayland-server.h \ + $(top_srcdir)/src/wayland-server-core.h \ $(top_srcdir)/src/wayland-shm.c scanned_src_files_man = \ $(scanned_src_files_Server) \ $(top_srcdir)/src/wayland-client.c \ - $(top_srcdir)/src/wayland-client.h + $(top_srcdir)/src/wayland-client.h \ + $(top_srcdir)/src/wayland-client-core.h diagramsdir := $(srcdir)/dot diagramssrc := $(wildcard $(diagramsdir)/*.gv) diff --git a/src/wayland-client-core.h b/src/wayland-client-core.h new file mode 100644 index 0000000..d7a0d9e --- /dev/null +++ b/src/wayland-client-core.h @@ -0,0 +1,180 @@ +/* + * Copyright © 2008 Kristian Høgsberg + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#ifndef WAYLAND_CLIENT_CORE_H +#define WAYLAND_CLIENT_CORE_H + +#include "wayland-util.h" +#include "wayland-version.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** \class wl_proxy + * + * \brief Represents a protocol object on the client side. + * + * A wl_proxy acts as a client side proxy to an object existing in the + * compositor. The proxy is responsible for converting requests made by the + * clients with \ref wl_proxy_marshal() into Wayland's wire format. Events + * coming from the compositor are also handled by the proxy, which will in + * turn call the handler set with \ref wl_proxy_add_listener(). + * + * \note With the exception of function \ref wl_proxy_set_queue(), functions + * accessing a wl_proxy are not normally used by client code. Clients + * should normally use the higher level interface generated by the scanner to + * interact with compositor objects. + * + */ +struct wl_proxy; + +/** \class wl_display + * + * \brief Represents a connection to the compositor and acts as a proxy to + * the wl_display singleton object. + * + * A wl_display object represents a client connection to a Wayland + * compositor. It is created with either \ref wl_display_connect() or + * \ref wl_display_connect_to_fd(). A connection is terminated using + * \ref wl_display_disconnect(). + * + * A wl_display is also used as the \ref wl_proxy for the wl_display + * singleton object on the compositor side. + * + * A wl_display object handles all the data sent from and to the + * compositor. When a \ref wl_proxy marshals a request, it will write its wire + * representation to the display's write buffer. The data is sent to the + * compositor when the client calls \ref wl_display_flush(). + * + * Incoming data is handled in two steps: queueing and dispatching. In the + * queue step, the data coming from the display fd is interpreted and + * added to a queue. On the dispatch step, the handler for the incoming + * event set by the client on the corresponding \ref wl_proxy is called. + * + * A wl_display has at least one event queue, called the <em>default + * queue</em>. Clients can create additional event queues with \ref + * wl_display_create_queue() and assign \ref wl_proxy's to it. Events + * occurring in a particular proxy are always queued in its assigned queue. + * A client can ensure that a certain assumption, such as holding a lock + * or running from a given thread, is true when a proxy event handler is + * called by assigning that proxy to an event queue and making sure that + * this queue is only dispatched when the assumption holds. + * + * The default queue is dispatched by calling \ref wl_display_dispatch(). + * This will dispatch any events queued on the default queue and attempt + * to read from the display fd if it's empty. Events read are then queued + * on the appropriate queues according to the proxy assignment. + * + * A user created queue is dispatched with \ref wl_display_dispatch_queue(). + * This function behaves exactly the same as wl_display_dispatch() + * but it dispatches given queue instead of the default queue. + * + * A real world example of event queue usage is Mesa's implementation of + * eglSwapBuffers() for the Wayland platform. This function might need + * to block until a frame callback is received, but dispatching the default + * queue could cause an event handler on the client to start drawing + * again. This problem is solved using another event queue, so that only + * the events handled by the EGL code are dispatched during the block. + * + * This creates a problem where a thread dispatches a non-default + * queue, reading all the data from the display fd. If the application + * would call \em poll(2) after that it would block, even though there + * might be events queued on the default queue. Those events should be + * dispatched with \ref wl_display_dispatch_(queue_)pending() before + * flushing and blocking. + */ +struct wl_display; + +/** \class wl_event_queue + * + * \brief A queue for \ref wl_proxy object events. + * + * Event queues allows the events on a display to be handled in a thread-safe + * manner. See \ref wl_display for details. + * + */ +struct wl_event_queue; + +void wl_event_queue_destroy(struct wl_event_queue *queue); + +void wl_proxy_marshal(struct wl_proxy *p, uint32_t opcode, ...); +void wl_proxy_marshal_array(struct wl_proxy *p, uint32_t opcode, + union wl_argument *args); +struct wl_proxy *wl_proxy_create(struct wl_proxy *factory, + const struct wl_interface *interface); +struct wl_proxy *wl_proxy_marshal_constructor(struct wl_proxy *proxy, + uint32_t opcode, + const struct wl_interface *interface, + ...); +struct wl_proxy * +wl_proxy_marshal_array_constructor(struct wl_proxy *proxy, + uint32_t opcode, union wl_argument *args, + const struct wl_interface *interface); + +void wl_proxy_destroy(struct wl_proxy *proxy); +int wl_proxy_add_listener(struct wl_proxy *proxy, + void (**implementation)(void), void *data); +const void *wl_proxy_get_listener(struct wl_proxy *proxy); +int wl_proxy_add_dispatcher(struct wl_proxy *proxy, + wl_dispatcher_func_t dispatcher_func, + const void * dispatcher_data, void *data); +void wl_proxy_set_user_data(struct wl_proxy *proxy, void *user_data); +void *wl_proxy_get_user_data(struct wl_proxy *proxy); +uint32_t wl_proxy_get_id(struct wl_proxy *proxy); +const char *wl_proxy_get_class(struct wl_proxy *proxy); +void wl_proxy_set_queue(struct wl_proxy *proxy, struct wl_event_queue *queue); + +struct wl_display *wl_display_connect(const char *name); +struct wl_display *wl_display_connect_to_fd(int fd); +void wl_display_disconnect(struct wl_display *display); +int wl_display_get_fd(struct wl_display *display); +int wl_display_dispatch(struct wl_display *display); +int wl_display_dispatch_queue(struct wl_display *display, + struct wl_event_queue *queue); +int wl_display_dispatch_queue_pending(struct wl_display *display, + struct wl_event_queue *queue); +int wl_display_dispatch_pending(struct wl_display *display); +int wl_display_get_error(struct wl_display *display); +uint32_t wl_display_get_protocol_error(struct wl_display *display, + const struct wl_interface **interface, + uint32_t *id); + +int wl_display_flush(struct wl_display *display); +int wl_display_roundtrip_queue(struct wl_display *display, + struct wl_event_queue *queue); +int wl_display_roundtrip(struct wl_display *display); +struct wl_event_queue *wl_display_create_queue(struct wl_display *display); + +int wl_display_prepare_read_queue(struct wl_display *display, + struct wl_event_queue *queue); +int wl_display_prepare_read(struct wl_display *display); +void wl_display_cancel_read(struct wl_display *display); +int wl_display_read_events(struct wl_display *display); + +void wl_log_set_handler_client(wl_log_func_t handler); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/wayland-client.h b/src/wayland-client.h index 71cd822..37b0d7f 100644 --- a/src/wayland-client.h +++ b/src/wayland-client.h @@ -20,163 +20,17 @@ * OF THIS SOFTWARE. */ -#ifndef WAYLAND_CLIENT_H -#define WAYLAND_CLIENT_H - -#include "wayland-util.h" -#include "wayland-version.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** \class wl_proxy - * - * \brief Represents a protocol object on the client side. - * - * A wl_proxy acts as a client side proxy to an object existing in the - * compositor. The proxy is responsible for converting requests made by the - * clients with \ref wl_proxy_marshal() into Wayland's wire format. Events - * coming from the compositor are also handled by the proxy, which will in - * turn call the handler set with \ref wl_proxy_add_listener(). - * - * \note With the exception of function \ref wl_proxy_set_queue(), functions - * accessing a wl_proxy are not normally used by client code. Clients - * should normally use the higher level interface generated by the scanner to - * interact with compositor objects. - * - */ -struct wl_proxy; - -/** \class wl_display - * - * \brief Represents a connection to the compositor and acts as a proxy to - * the wl_display singleton object. - * - * A wl_display object represents a client connection to a Wayland - * compositor. It is created with either \ref wl_display_connect() or - * \ref wl_display_connect_to_fd(). A connection is terminated using - * \ref wl_display_disconnect(). - * - * A wl_display is also used as the \ref wl_proxy for the wl_display - * singleton object on the compositor side. - * - * A wl_display object handles all the data sent from and to the - * compositor. When a \ref wl_proxy marshals a request, it will write its wire - * representation to the display's write buffer. The data is sent to the - * compositor when the client calls \ref wl_display_flush(). - * - * Incoming data is handled in two steps: queueing and dispatching. In the - * queue step, the data coming from the display fd is interpreted and - * added to a queue. On the dispatch step, the handler for the incoming - * event set by the client on the corresponding \ref wl_proxy is called. - * - * A wl_display has at least one event queue, called the <em>default - * queue</em>. Clients can create additional event queues with \ref - * wl_display_create_queue() and assign \ref wl_proxy's to it. Events - * occurring in a particular proxy are always queued in its assigned queue. - * A client can ensure that a certain assumption, such as holding a lock - * or running from a given thread, is true when a proxy event handler is - * called by assigning that proxy to an event queue and making sure that - * this queue is only dispatched when the assumption holds. - * - * The default queue is dispatched by calling \ref wl_display_dispatch(). - * This will dispatch any events queued on the default queue and attempt - * to read from the display fd if it's empty. Events read are then queued - * on the appropriate queues according to the proxy assignment. - * - * A user created queue is dispatched with \ref wl_display_dispatch_queue(). - * This function behaves exactly the same as wl_display_dispatch() - * but it dispatches given queue instead of the default queue. - * - * A real world example of event queue usage is Mesa's implementation of - * eglSwapBuffers() for the Wayland platform. This function might need - * to block until a frame callback is received, but dispatching the default - * queue could cause an event handler on the client to start drawing - * again. This problem is solved using another event queue, so that only - * the events handled by the EGL code are dispatched during the block. - * - * This creates a problem where a thread dispatches a non-default - * queue, reading all the data from the display fd. If the application - * would call \em poll(2) after that it would block, even though there - * might be events queued on the default queue. Those events should be - * dispatched with \ref wl_display_dispatch_(queue_)pending() before - * flushing and blocking. - */ -struct wl_display; -/** \class wl_event_queue - * - * \brief A queue for \ref wl_proxy object events. - * - * Event queues allows the events on a display to be handled in a thread-safe - * manner. See \ref wl_display for details. - * +/** Use of this header file is discouraged. Prefer including + * wayland-client-core.h instead, which does not include the + * client protocol header and as such only defines the library + * API. */ -struct wl_event_queue; - -void wl_event_queue_destroy(struct wl_event_queue *queue); -void wl_proxy_marshal(struct wl_proxy *p, uint32_t opcode, ...); -void wl_proxy_marshal_array(struct wl_proxy *p, uint32_t opcode, - union wl_argument *args); -struct wl_proxy *wl_proxy_create(struct wl_proxy *factory, - const struct wl_interface *interface); -struct wl_proxy *wl_proxy_marshal_constructor(struct wl_proxy *proxy, - uint32_t opcode, - const struct wl_interface *interface, - ...); -struct wl_proxy * -wl_proxy_marshal_array_constructor(struct wl_proxy *proxy, - uint32_t opcode, union wl_argument *args, - const struct wl_interface *interface); - -void wl_proxy_destroy(struct wl_proxy *proxy); -int wl_proxy_add_listener(struct wl_proxy *proxy, - void (**implementation)(void), void *data); -const void *wl_proxy_get_listener(struct wl_proxy *proxy); -int wl_proxy_add_dispatcher(struct wl_proxy *proxy, - wl_dispatcher_func_t dispatcher_func, - const void * dispatcher_data, void *data); -void wl_proxy_set_user_data(struct wl_proxy *proxy, void *user_data); -void *wl_proxy_get_user_data(struct wl_proxy *proxy); -uint32_t wl_proxy_get_id(struct wl_proxy *proxy); -const char *wl_proxy_get_class(struct wl_proxy *proxy); -void wl_proxy_set_queue(struct wl_proxy *proxy, struct wl_event_queue *queue); +#ifndef WAYLAND_CLIENT_H +#define WAYLAND_CLIENT_H +#include "wayland-client-core.h" #include "wayland-client-protocol.h" -struct wl_display *wl_display_connect(const char *name); -struct wl_display *wl_display_connect_to_fd(int fd); -void wl_display_disconnect(struct wl_display *display); -int wl_display_get_fd(struct wl_display *display); -int wl_display_dispatch(struct wl_display *display); -int wl_display_dispatch_queue(struct wl_display *display, - struct wl_event_queue *queue); -int wl_display_dispatch_queue_pending(struct wl_display *display, - struct wl_event_queue *queue); -int wl_display_dispatch_pending(struct wl_display *display); -int wl_display_get_error(struct wl_display *display); -uint32_t wl_display_get_protocol_error(struct wl_display *display, - const struct wl_interface **interface, - uint32_t *id); - -int wl_display_flush(struct wl_display *display); -int wl_display_roundtrip_queue(struct wl_display *display, - struct wl_event_queue *queue); -int wl_display_roundtrip(struct wl_display *display); -struct wl_event_queue *wl_display_create_queue(struct wl_display *display); - -int wl_display_prepare_read_queue(struct wl_display *display, - struct wl_event_queue *queue); -int wl_display_prepare_read(struct wl_display *display); -void wl_display_cancel_read(struct wl_display *display); -int wl_display_read_events(struct wl_display *display); - -void wl_log_set_handler_client(wl_log_func_t handler); - -#ifdef __cplusplus -} -#endif - #endif diff --git a/src/wayland-server-core.h b/src/wayland-server-core.h new file mode 100644 index 0000000..7d03789 --- /dev/null +++ b/src/wayland-server-core.h @@ -0,0 +1,405 @@ +/* + * Copyright © 2008 Kristian Høgsberg + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#ifndef WAYLAND_SERVER_CORE_H +#define WAYLAND_SERVER_CORE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <sys/types.h> +#include <stdint.h> +#include "wayland-util.h" +#include "wayland-version.h" + +enum { + WL_EVENT_READABLE = 0x01, + WL_EVENT_WRITABLE = 0x02, + WL_EVENT_HANGUP = 0x04, + WL_EVENT_ERROR = 0x08 +}; + +struct wl_event_loop; +struct wl_event_source; +typedef int (*wl_event_loop_fd_func_t)(int fd, uint32_t mask, void *data); +typedef int (*wl_event_loop_timer_func_t)(void *data); +typedef int (*wl_event_loop_signal_func_t)(int signal_number, void *data); +typedef void (*wl_event_loop_idle_func_t)(void *data); + +struct wl_event_loop *wl_event_loop_create(void); +void wl_event_loop_destroy(struct wl_event_loop *loop); +struct wl_event_source *wl_event_loop_add_fd(struct wl_event_loop *loop, + int fd, uint32_t mask, + wl_event_loop_fd_func_t func, + void *data); +int wl_event_source_fd_update(struct wl_event_source *source, uint32_t mask); +struct wl_event_source *wl_event_loop_add_timer(struct wl_event_loop *loop, + wl_event_loop_timer_func_t func, + void *data); +struct wl_event_source * +wl_event_loop_add_signal(struct wl_event_loop *loop, + int signal_number, + wl_event_loop_signal_func_t func, + void *data); + +int wl_event_source_timer_update(struct wl_event_source *source, + int ms_delay); +int wl_event_source_remove(struct wl_event_source *source); +void wl_event_source_check(struct wl_event_source *source); + + +int wl_event_loop_dispatch(struct wl_event_loop *loop, int timeout); +void wl_event_loop_dispatch_idle(struct wl_event_loop *loop); +struct wl_event_source *wl_event_loop_add_idle(struct wl_event_loop *loop, + wl_event_loop_idle_func_t func, + void *data); +int wl_event_loop_get_fd(struct wl_event_loop *loop); + +struct wl_client; +struct wl_display; +struct wl_listener; +struct wl_resource; +struct wl_global; +typedef void (*wl_notify_func_t)(struct wl_listener *listener, void *data); + +void wl_event_loop_add_destroy_listener(struct wl_event_loop *loop, + struct wl_listener * listener); +struct wl_listener *wl_event_loop_get_destroy_listener( + struct wl_event_loop *loop, + wl_notify_func_t notify); + +struct wl_display *wl_display_create(void); +void wl_display_destroy(struct wl_display *display); +struct wl_event_loop *wl_display_get_event_loop(struct wl_display *display); +int wl_display_add_socket(struct wl_display *display, const char *name); +const char *wl_display_add_socket_auto(struct wl_display *display); +void wl_display_terminate(struct wl_display *display); +void wl_display_run(struct wl_display *display); +void wl_display_flush_clients(struct wl_display *display); + +typedef void (*wl_global_bind_func_t)(struct wl_client *client, void *data, + uint32_t version, uint32_t id); + +uint32_t wl_display_get_serial(struct wl_display *display); +uint32_t wl_display_next_serial(struct wl_display *display); + +void wl_display_add_destroy_listener(struct wl_display *display, + struct wl_listener *listener); +struct wl_listener *wl_display_get_destroy_listener(struct wl_display *display, + wl_notify_func_t notify); + +struct wl_global *wl_global_create(struct wl_display *display, + const struct wl_interface *interface, + int version, + void *data, wl_global_bind_func_t bind); +void wl_global_destroy(struct wl_global *global); + +struct wl_client *wl_client_create(struct wl_display *display, int fd); +void wl_client_destroy(struct wl_client *client); +void wl_client_flush(struct wl_client *client); +void wl_client_get_credentials(struct wl_client *client, + pid_t *pid, uid_t *uid, gid_t *gid); + +void wl_client_add_destroy_listener(struct wl_client *client, + struct wl_listener *listener); +struct wl_listener *wl_client_get_destroy_listener(struct wl_client *client, + wl_notify_func_t notify); + +struct wl_resource * +wl_client_get_object(struct wl_client *client, uint32_t id); +void +wl_client_post_no_memory(struct wl_client *client); + +/** \class wl_listener + * + * \brief A single listener for Wayland signals + * + * wl_listener provides the means to listen for wl_signal notifications. Many + * Wayland objects use wl_listener for notification of significant events like + * object destruction. + * + * Clients should create wl_listener objects manually and can register them as + * listeners to signals using #wl_signal_add, assuming the signal is + * directly accessible. For opaque structs like wl_event_loop, adding a + * listener should be done through provided accessor methods. A listener can + * only listen to one signal at a time. + * + * \code + * struct wl_listener your_listener; + * + * your_listener.notify = your_callback_method; + * + * // Direct access + * wl_signal_add(&some_object->destroy_signal, &your_listener); + * + * // Accessor access + * wl_event_loop *loop = ...; + * wl_event_loop_add_destroy_listener(loop, &your_listener); + * \endcode + * + * If the listener is part of a larger struct, #wl_container_of can be used + * to retrieve a pointer to it: + * + * \code + * void your_listener(struct wl_listener *listener, void *data) + * { + * struct your_data *data; + * + * your_data = wl_container_of(listener, data, your_member_name); + * } + * \endcode + * + * If you need to remove a listener from a signal, use wl_list_remove(). + * + * \code + * wl_list_remove(&your_listener.link); + * \endcode + * + * \sa wl_signal + */ +struct wl_listener { + struct wl_list link; + wl_notify_func_t notify; +}; + +/** \class wl_signal + * + * \brief A source of a type of observable event + * + * Signals are recognized points where significant events can be observed. + * Compositors as well as the server can provide signals. Observers are + * wl_listener's that are added through #wl_signal_add. Signals are emitted + * using #wl_signal_emit, which will invoke all listeners until that + * listener is removed by wl_list_remove() (or whenever the signal is + * destroyed). + * + * \sa wl_listener for more information on using wl_signal + */ +struct wl_signal { + struct wl_list listener_list; +}; + +/** Initialize a new \ref wl_signal for use. + * + * \param signal The signal that will be initialized + * + * \memberof wl_signal + */ +static inline void +wl_signal_init(struct wl_signal *signal) +{ + wl_list_init(&signal->listener_list); +} + +/** Add the specified listener to this signal. + * + * \param signal The signal that will emit events to the listener + * \param listener The listener to add + * + * \memberof wl_signal + */ +static inline void +wl_signal_add(struct wl_signal *signal, struct wl_listener *listener) +{ + wl_list_insert(signal->listener_list.prev, &listener->link); +} + +/** Gets the listener struct for the specified callback. + * + * \param signal The signal that contains the specified listener + * \param notify The listener that is the target of this search + * \return the list item that corresponds to the specified listener, or NULL + * if none was found + * + * \memberof wl_signal + */ +static inline struct wl_listener * +wl_signal_get(struct wl_signal *signal, wl_notify_func_t notify) +{ + struct wl_listener *l; + + wl_list_for_each(l, &signal->listener_list, link) + if (l->notify == notify) + return l; + + return NULL; +} + +/** Emits this signal, notifying all registered listeners. + * + * \param signal The signal object that will emit the signal + * \param data The data that will be emitted with the signal + * + * \memberof wl_signal + */ +static inline void +wl_signal_emit(struct wl_signal *signal, void *data) +{ + struct wl_listener *l, *next; + + wl_list_for_each_safe(l, next, &signal->listener_list, link) + l->notify(l, data); +} + +typedef void (*wl_resource_destroy_func_t)(struct wl_resource *resource); + +/* + * Post an event to the client's object referred to by 'resource'. + * 'opcode' is the event number generated from the protocol XML + * description (the event name). The variable arguments are the event + * parameters, in the order they appear in the protocol XML specification. + * + * The variable arguments' types are: + * - type=uint: uint32_t + * - type=int: int32_t + * - type=fixed: wl_fixed_t + * - type=string: (const char *) to a nil-terminated string + * - type=array: (struct wl_array *) + * - type=fd: int, that is an open file descriptor + * - type=new_id: (struct wl_object *) or (struct wl_resource *) + * - type=object: (struct wl_object *) or (struct wl_resource *) + */ +void wl_resource_post_event(struct wl_resource *resource, + uint32_t opcode, ...); +void wl_resource_post_event_array(struct wl_resource *resource, + uint32_t opcode, union wl_argument *args); +void wl_resource_queue_event(struct wl_resource *resource, + uint32_t opcode, ...); +void wl_resource_queue_event_array(struct wl_resource *resource, + uint32_t opcode, union wl_argument *args); + +/* msg is a printf format string, variable args are its args. */ +void wl_resource_post_error(struct wl_resource *resource, + uint32_t code, const char *msg, ...) + __attribute__ ((format (printf, 3, 4))); +void wl_resource_post_no_memory(struct wl_resource *resource); + +struct wl_display * +wl_client_get_display(struct wl_client *client); + +struct wl_resource * +wl_resource_create(struct wl_client *client, + const struct wl_interface *interface, + int version, uint32_t id); +void +wl_resource_set_implementation(struct wl_resource *resource, + const void *implementation, + void *data, + wl_resource_destroy_func_t destroy); +void +wl_resource_set_dispatcher(struct wl_resource *resource, + wl_dispatcher_func_t dispatcher, + const void *implementation, + void *data, + wl_resource_destroy_func_t destroy); + +void +wl_resource_destroy(struct wl_resource *resource); +uint32_t +wl_resource_get_id(struct wl_resource *resource); +struct wl_list * +wl_resource_get_link(struct wl_resource *resource); +struct wl_resource * +wl_resource_from_link(struct wl_list *resource); +struct wl_resource * +wl_resource_find_for_client(struct wl_list *list, struct wl_client *client); +struct wl_client * +wl_resource_get_client(struct wl_resource *resource); +void +wl_resource_set_user_data(struct wl_resource *resource, void *data); +void * +wl_resource_get_user_data(struct wl_resource *resource); +int +wl_resource_get_version(struct wl_resource *resource); +void +wl_resource_set_destructor(struct wl_resource *resource, + wl_resource_destroy_func_t destroy); +int +wl_resource_instance_of(struct wl_resource *resource, + const struct wl_interface *interface, + const void *implementation); + +void +wl_resource_add_destroy_listener(struct wl_resource *resource, + struct wl_listener * listener); +struct wl_listener * +wl_resource_get_destroy_listener(struct wl_resource *resource, + wl_notify_func_t notify); + +#define wl_resource_for_each(resource, list) \ + for (resource = 0, resource = wl_resource_from_link((list)->next); \ + wl_resource_get_link(resource) != (list); \ + resource = wl_resource_from_link(wl_resource_get_link(resource)->next)) + +#define wl_resource_for_each_safe(resource, tmp, list) \ + for (resource = 0, tmp = 0, \ + resource = wl_resource_from_link((list)->next), \ + tmp = wl_resource_from_link((list)->next->next); \ + wl_resource_get_link(resource) != (list); \ + resource = tmp, \ + tmp = wl_resource_from_link(wl_resource_get_link(resource)->next)) + +struct wl_shm_buffer; + +void +wl_shm_buffer_begin_access(struct wl_shm_buffer *buffer); + +void +wl_shm_buffer_end_access(struct wl_shm_buffer *buffer); + +struct wl_shm_buffer * +wl_shm_buffer_get(struct wl_resource *resource); + +void * +wl_shm_buffer_get_data(struct wl_shm_buffer *buffer); + +int32_t +wl_shm_buffer_get_stride(struct wl_shm_buffer *buffer); + +uint32_t +wl_shm_buffer_get_format(struct wl_shm_buffer *buffer); + +int32_t +wl_shm_buffer_get_width(struct wl_shm_buffer *buffer); + +int32_t +wl_shm_buffer_get_height(struct wl_shm_buffer *buffer); + +int +wl_display_init_shm(struct wl_display *display); + +uint32_t * +wl_display_add_shm_format(struct wl_display *display, uint32_t format); + +struct wl_shm_buffer * +wl_shm_buffer_create(struct wl_client *client, + uint32_t id, int32_t width, int32_t height, + int32_t stride, uint32_t format); + +void wl_log_set_handler_server(wl_log_func_t handler); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/wayland-server.h b/src/wayland-server.h index af2f03d..9fe19f5 100644 --- a/src/wayland-server.h +++ b/src/wayland-server.h @@ -20,249 +20,22 @@ * OF THIS SOFTWARE. */ + +/** Use of this header file is discouraged. Prefer including + * wayland-server-core.h instead, which does not include the + * client protocol header and as such only defines the library + * API, excluding the deprecated API below. + */ + #ifndef WAYLAND_SERVER_H #define WAYLAND_SERVER_H +#include "wayland-server-core.h" + #ifdef __cplusplus extern "C" { #endif -#include <sys/types.h> -#include <stdint.h> -#include "wayland-util.h" -#include "wayland-version.h" - -enum { - WL_EVENT_READABLE = 0x01, - WL_EVENT_WRITABLE = 0x02, - WL_EVENT_HANGUP = 0x04, - WL_EVENT_ERROR = 0x08 -}; - -struct wl_event_loop; -struct wl_event_source; -typedef int (*wl_event_loop_fd_func_t)(int fd, uint32_t mask, void *data); -typedef int (*wl_event_loop_timer_func_t)(void *data); -typedef int (*wl_event_loop_signal_func_t)(int signal_number, void *data); -typedef void (*wl_event_loop_idle_func_t)(void *data); - -struct wl_event_loop *wl_event_loop_create(void); -void wl_event_loop_destroy(struct wl_event_loop *loop); -struct wl_event_source *wl_event_loop_add_fd(struct wl_event_loop *loop, - int fd, uint32_t mask, - wl_event_loop_fd_func_t func, - void *data); -int wl_event_source_fd_update(struct wl_event_source *source, uint32_t mask); -struct wl_event_source *wl_event_loop_add_timer(struct wl_event_loop *loop, - wl_event_loop_timer_func_t func, - void *data); -struct wl_event_source * -wl_event_loop_add_signal(struct wl_event_loop *loop, - int signal_number, - wl_event_loop_signal_func_t func, - void *data); - -int wl_event_source_timer_update(struct wl_event_source *source, - int ms_delay); -int wl_event_source_remove(struct wl_event_source *source); -void wl_event_source_check(struct wl_event_source *source); - - -int wl_event_loop_dispatch(struct wl_event_loop *loop, int timeout); -void wl_event_loop_dispatch_idle(struct wl_event_loop *loop); -struct wl_event_source *wl_event_loop_add_idle(struct wl_event_loop *loop, - wl_event_loop_idle_func_t func, - void *data); -int wl_event_loop_get_fd(struct wl_event_loop *loop); - -struct wl_client; -struct wl_display; -struct wl_listener; -struct wl_resource; -struct wl_global; -typedef void (*wl_notify_func_t)(struct wl_listener *listener, void *data); - -void wl_event_loop_add_destroy_listener(struct wl_event_loop *loop, - struct wl_listener * listener); -struct wl_listener *wl_event_loop_get_destroy_listener( - struct wl_event_loop *loop, - wl_notify_func_t notify); - -struct wl_display *wl_display_create(void); -void wl_display_destroy(struct wl_display *display); -struct wl_event_loop *wl_display_get_event_loop(struct wl_display *display); -int wl_display_add_socket(struct wl_display *display, const char *name); -const char *wl_display_add_socket_auto(struct wl_display *display); -void wl_display_terminate(struct wl_display *display); -void wl_display_run(struct wl_display *display); -void wl_display_flush_clients(struct wl_display *display); - -typedef void (*wl_global_bind_func_t)(struct wl_client *client, void *data, - uint32_t version, uint32_t id); - -uint32_t wl_display_get_serial(struct wl_display *display); -uint32_t wl_display_next_serial(struct wl_display *display); - -void wl_display_add_destroy_listener(struct wl_display *display, - struct wl_listener *listener); -struct wl_listener *wl_display_get_destroy_listener(struct wl_display *display, - wl_notify_func_t notify); - -struct wl_global *wl_global_create(struct wl_display *display, - const struct wl_interface *interface, - int version, - void *data, wl_global_bind_func_t bind); -void wl_global_destroy(struct wl_global *global); - -struct wl_client *wl_client_create(struct wl_display *display, int fd); -void wl_client_destroy(struct wl_client *client); -void wl_client_flush(struct wl_client *client); -void wl_client_get_credentials(struct wl_client *client, - pid_t *pid, uid_t *uid, gid_t *gid); - -void wl_client_add_destroy_listener(struct wl_client *client, - struct wl_listener *listener); -struct wl_listener *wl_client_get_destroy_listener(struct wl_client *client, - wl_notify_func_t notify); - -struct wl_resource * -wl_client_get_object(struct wl_client *client, uint32_t id); -void -wl_client_post_no_memory(struct wl_client *client); - -/** \class wl_listener - * - * \brief A single listener for Wayland signals - * - * wl_listener provides the means to listen for wl_signal notifications. Many - * Wayland objects use wl_listener for notification of significant events like - * object destruction. - * - * Clients should create wl_listener objects manually and can register them as - * listeners to signals using #wl_signal_add, assuming the signal is - * directly accessible. For opaque structs like wl_event_loop, adding a - * listener should be done through provided accessor methods. A listener can - * only listen to one signal at a time. - * - * \code - * struct wl_listener your_listener; - * - * your_listener.notify = your_callback_method; - * - * // Direct access - * wl_signal_add(&some_object->destroy_signal, &your_listener); - * - * // Accessor access - * wl_event_loop *loop = ...; - * wl_event_loop_add_destroy_listener(loop, &your_listener); - * \endcode - * - * If the listener is part of a larger struct, #wl_container_of can be used - * to retrieve a pointer to it: - * - * \code - * void your_listener(struct wl_listener *listener, void *data) - * { - * struct your_data *data; - * - * your_data = wl_container_of(listener, data, your_member_name); - * } - * \endcode - * - * If you need to remove a listener from a signal, use wl_list_remove(). - * - * \code - * wl_list_remove(&your_listener.link); - * \endcode - * - * \sa wl_signal - */ -struct wl_listener { - struct wl_list link; - wl_notify_func_t notify; -}; - -/** \class wl_signal - * - * \brief A source of a type of observable event - * - * Signals are recognized points where significant events can be observed. - * Compositors as well as the server can provide signals. Observers are - * wl_listener's that are added through #wl_signal_add. Signals are emitted - * using #wl_signal_emit, which will invoke all listeners until that - * listener is removed by wl_list_remove() (or whenever the signal is - * destroyed). - * - * \sa wl_listener for more information on using wl_signal - */ -struct wl_signal { - struct wl_list listener_list; -}; - -/** Initialize a new \ref wl_signal for use. - * - * \param signal The signal that will be initialized - * - * \memberof wl_signal - */ -static inline void -wl_signal_init(struct wl_signal *signal) -{ - wl_list_init(&signal->listener_list); -} - -/** Add the specified listener to this signal. - * - * \param signal The signal that will emit events to the listener - * \param listener The listener to add - * - * \memberof wl_signal - */ -static inline void -wl_signal_add(struct wl_signal *signal, struct wl_listener *listener) -{ - wl_list_insert(signal->listener_list.prev, &listener->link); -} - -/** Gets the listener struct for the specified callback. - * - * \param signal The signal that contains the specified listener - * \param notify The listener that is the target of this search - * \return the list item that corresponds to the specified listener, or NULL - * if none was found - * - * \memberof wl_signal - */ -static inline struct wl_listener * -wl_signal_get(struct wl_signal *signal, wl_notify_func_t notify) -{ - struct wl_listener *l; - - wl_list_for_each(l, &signal->listener_list, link) - if (l->notify == notify) - return l; - - return NULL; -} - -/** Emits this signal, notifying all registered listeners. - * - * \param signal The signal object that will emit the signal - * \param data The data that will be emitted with the signal - * - * \memberof wl_signal - */ -static inline void -wl_signal_emit(struct wl_signal *signal, void *data) -{ - struct wl_listener *l, *next; - - wl_list_for_each_safe(l, next, &signal->listener_list, link) - l->notify(l, data); -} - -typedef void (*wl_resource_destroy_func_t)(struct wl_resource *resource); - #ifndef WL_HIDE_DEPRECATED struct wl_object { @@ -313,145 +86,10 @@ wl_display_remove_global(struct wl_display *display, #endif -/* - * Post an event to the client's object referred to by 'resource'. - * 'opcode' is the event number generated from the protocol XML - * description (the event name). The variable arguments are the event - * parameters, in the order they appear in the protocol XML specification. - * - * The variable arguments' types are: - * - type=uint: uint32_t - * - type=int: int32_t - * - type=fixed: wl_fixed_t - * - type=string: (const char *) to a nil-terminated string - * - type=array: (struct wl_array *) - * - type=fd: int, that is an open file descriptor - * - type=new_id: (struct wl_object *) or (struct wl_resource *) - * - type=object: (struct wl_object *) or (struct wl_resource *) - */ -void wl_resource_post_event(struct wl_resource *resource, - uint32_t opcode, ...); -void wl_resource_post_event_array(struct wl_resource *resource, - uint32_t opcode, union wl_argument *args); -void wl_resource_queue_event(struct wl_resource *resource, - uint32_t opcode, ...); -void wl_resource_queue_event_array(struct wl_resource *resource, - uint32_t opcode, union wl_argument *args); - -/* msg is a printf format string, variable args are its args. */ -void wl_resource_post_error(struct wl_resource *resource, - uint32_t code, const char *msg, ...) - __attribute__ ((format (printf, 3, 4))); -void wl_resource_post_no_memory(struct wl_resource *resource); - -#include "wayland-server-protocol.h" - -struct wl_display * -wl_client_get_display(struct wl_client *client); - -struct wl_resource * -wl_resource_create(struct wl_client *client, - const struct wl_interface *interface, - int version, uint32_t id); -void -wl_resource_set_implementation(struct wl_resource *resource, - const void *implementation, - void *data, - wl_resource_destroy_func_t destroy); -void -wl_resource_set_dispatcher(struct wl_resource *resource, - wl_dispatcher_func_t dispatcher, - const void *implementation, - void *data, - wl_resource_destroy_func_t destroy); - -void -wl_resource_destroy(struct wl_resource *resource); -uint32_t -wl_resource_get_id(struct wl_resource *resource); -struct wl_list * -wl_resource_get_link(struct wl_resource *resource); -struct wl_resource * -wl_resource_from_link(struct wl_list *resource); -struct wl_resource * -wl_resource_find_for_client(struct wl_list *list, struct wl_client *client); -struct wl_client * -wl_resource_get_client(struct wl_resource *resource); -void -wl_resource_set_user_data(struct wl_resource *resource, void *data); -void * -wl_resource_get_user_data(struct wl_resource *resource); -int -wl_resource_get_version(struct wl_resource *resource); -void -wl_resource_set_destructor(struct wl_resource *resource, - wl_resource_destroy_func_t destroy); -int -wl_resource_instance_of(struct wl_resource *resource, - const struct wl_interface *interface, - const void *implementation); - -void -wl_resource_add_destroy_listener(struct wl_resource *resource, - struct wl_listener * listener); -struct wl_listener * -wl_resource_get_destroy_listener(struct wl_resource *resource, - wl_notify_func_t notify); - -#define wl_resource_for_each(resource, list) \ - for (resource = 0, resource = wl_resource_from_link((list)->next); \ - wl_resource_get_link(resource) != (list); \ - resource = wl_resource_from_link(wl_resource_get_link(resource)->next)) - -#define wl_resource_for_each_safe(resource, tmp, list) \ - for (resource = 0, tmp = 0, \ - resource = wl_resource_from_link((list)->next), \ - tmp = wl_resource_from_link((list)->next->next); \ - wl_resource_get_link(resource) != (list); \ - resource = tmp, \ - tmp = wl_resource_from_link(wl_resource_get_link(resource)->next)) - -struct wl_shm_buffer; - -void -wl_shm_buffer_begin_access(struct wl_shm_buffer *buffer); - -void -wl_shm_buffer_end_access(struct wl_shm_buffer *buffer); - -struct wl_shm_buffer * -wl_shm_buffer_get(struct wl_resource *resource); - -void * -wl_shm_buffer_get_data(struct wl_shm_buffer *buffer); - -int32_t -wl_shm_buffer_get_stride(struct wl_shm_buffer *buffer); - -uint32_t -wl_shm_buffer_get_format(struct wl_shm_buffer *buffer); - -int32_t -wl_shm_buffer_get_width(struct wl_shm_buffer *buffer); - -int32_t -wl_shm_buffer_get_height(struct wl_shm_buffer *buffer); - -int -wl_display_init_shm(struct wl_display *display); - -uint32_t * -wl_display_add_shm_format(struct wl_display *display, uint32_t format); - -struct wl_shm_buffer * -wl_shm_buffer_create(struct wl_client *client, - uint32_t id, int32_t width, int32_t height, - int32_t stride, uint32_t format); - -void wl_log_set_handler_server(wl_log_func_t handler); - #ifdef __cplusplus } #endif +#include "wayland-server-protocol.h" + #endif |