/* * 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_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 \ref 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 \ref 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 \ref wl_display is also used as the \ref wl_proxy for the \ref wl_display * singleton object on the compositor side. * * A \ref 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(). * * Event handling is done in a thread-safe manner using event queues. The * display has a \em main event queue where initially all the events are * queued. The listeners for the events queued in it are called when the * client calls \ref wl_display_dispatch(). * * The client can create additional event queues with \ref * wl_display_create_queue() and assign different \ref wl_proxy objects to it. * The events for a proxy are always queued only on its assign queue, that can * be dispatched by a different thread with \ref wl_display_dispatch_queue(). * * All the \ref wl_display's functions are thread-safe. * */ 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, ...); struct wl_proxy *wl_proxy_create(struct wl_proxy *factory, 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); 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); void wl_proxy_set_queue(struct wl_proxy *proxy, struct wl_event_queue *queue); #include "wayland-client-protocol.h" typedef int (*wl_display_update_func_t)(uint32_t mask, void *data); typedef void (*wl_callback_func_t)(void *data, uint32_t time); 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_pending(struct wl_display *display); int wl_display_flush(struct wl_display *display); void wl_display_roundtrip(struct wl_display *display); struct wl_event_queue *wl_display_create_queue(struct wl_display *display); void wl_log_set_handler_client(wl_log_func_t handler); #ifdef __cplusplus } #endif #endif