123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- /*
- * Copyright © 2008 Kristian Høgsberg
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial
- * portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * 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_pending() or \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);
- void *
- wl_proxy_create_wrapper(void *proxy);
- void
- wl_proxy_wrapper_destroy(void *proxy_wrapper);
- 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_constructor_versioned(struct wl_proxy *proxy,
- uint32_t opcode,
- const struct wl_interface *interface,
- uint32_t version,
- ...);
- struct wl_proxy *
- wl_proxy_marshal_array_constructor(struct wl_proxy *proxy,
- uint32_t opcode, union wl_argument *args,
- const struct wl_interface *interface);
- struct wl_proxy *
- wl_proxy_marshal_array_constructor_versioned(struct wl_proxy *proxy,
- uint32_t opcode,
- union wl_argument *args,
- const struct wl_interface *interface,
- uint32_t version);
- 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_version(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
|