/* * 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_H #define WAYLAND_H #ifdef __cplusplus extern "C" { #endif #include #include #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_seat; struct wl_pointer; struct wl_keyboard; struct wl_touch; struct wl_listener; 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); 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); struct wl_global *wl_display_add_global(struct wl_display *display, const struct wl_interface *interface, void *data, wl_global_bind_func_t bind); void wl_display_remove_global(struct wl_display *display, struct wl_global *global); 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_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_add_object(struct wl_client *client, const struct wl_interface *interface, const void *implementation, uint32_t id, void *data); struct wl_resource * wl_client_new_object(struct wl_client *client, const struct wl_interface *interface, const void *implementation, void *data); struct wl_resource * wl_client_get_object(struct wl_client *client, uint32_t id); struct wl_listener { struct wl_list link; wl_notify_func_t notify; }; struct wl_signal { struct wl_list listener_list; }; static inline void wl_signal_init(struct wl_signal *signal) { wl_list_init(&signal->listener_list); } static inline void wl_signal_add(struct wl_signal *signal, struct wl_listener *listener) { wl_list_insert(signal->listener_list.prev, &listener->link); } 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; } 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); } struct wl_resource { struct wl_object object; void (*destroy)(struct wl_resource *resource); struct wl_list link; struct wl_signal destroy_signal; struct wl_client *client; void *data; }; static inline void wl_resource_init(struct wl_resource *resource, const struct wl_interface *interface, const void *implementation, uint32_t id, void *data) { resource->object.id = id; resource->object.interface = interface; resource->object.implementation = implementation; wl_signal_init(&resource->destroy_signal); resource->destroy = NULL; resource->client = NULL; resource->data = data; } struct wl_buffer { struct wl_resource resource; int32_t width, height; uint32_t busy_count; }; struct wl_surface { struct wl_resource resource; }; struct wl_pointer_grab; struct wl_pointer_grab_interface { void (*focus)(struct wl_pointer_grab *grab, struct wl_surface *surface, wl_fixed_t x, wl_fixed_t y); void (*motion)(struct wl_pointer_grab *grab, uint32_t time, wl_fixed_t x, wl_fixed_t y); void (*button)(struct wl_pointer_grab *grab, uint32_t time, uint32_t button, uint32_t state); }; struct wl_pointer_grab { const struct wl_pointer_grab_interface *interface; struct wl_pointer *pointer; struct wl_surface *focus; wl_fixed_t x, y; }; struct wl_keyboard_grab; struct wl_keyboard_grab_interface { void (*key)(struct wl_keyboard_grab *grab, uint32_t time, uint32_t key, uint32_t state); void (*modifiers)(struct wl_keyboard_grab *grab, uint32_t serial, uint32_t mods_depressed, uint32_t mods_latched, uint32_t mods_locked, uint32_t group); }; struct wl_keyboard_grab { const struct wl_keyboard_grab_interface *interface; struct wl_keyboard *keyboard; struct wl_surface *focus; uint32_t key; }; struct wl_touch_grab; struct wl_touch_grab_interface { void (*down)(struct wl_touch_grab *grab, uint32_t time, int touch_id, wl_fixed_t sx, wl_fixed_t sy); void (*up)(struct wl_touch_grab *grab, uint32_t time, int touch_id); void (*motion)(struct wl_touch_grab *grab, uint32_t time, int touch_id, wl_fixed_t sx, wl_fixed_t sy); }; struct wl_touch_grab { const struct wl_touch_grab_interface *interface; struct wl_touch *touch; struct wl_surface *focus; }; struct wl_data_offer { struct wl_resource resource; struct wl_data_source *source; struct wl_listener source_destroy_listener; }; struct wl_data_source { struct wl_resource resource; struct wl_array mime_types; void (*accept)(struct wl_data_source *source, uint32_t serial, const char *mime_type); void (*send)(struct wl_data_source *source, const char *mime_type, int32_t fd); void (*cancel)(struct wl_data_source *source); }; struct wl_pointer { struct wl_seat *seat; struct wl_list resource_list; struct wl_surface *focus; struct wl_resource *focus_resource; struct wl_listener focus_listener; uint32_t focus_serial; struct wl_signal focus_signal; struct wl_pointer_grab *grab; struct wl_pointer_grab default_grab; wl_fixed_t grab_x, grab_y; uint32_t grab_button; uint32_t grab_serial; uint32_t grab_time; wl_fixed_t x, y; struct wl_surface *current; struct wl_listener current_listener; wl_fixed_t current_x, current_y; uint32_t button_count; }; struct wl_keyboard { struct wl_seat *seat; struct wl_list resource_list; struct wl_surface *focus; struct wl_resource *focus_resource; struct wl_listener focus_listener; uint32_t focus_serial; struct wl_signal focus_signal; struct wl_keyboard_grab *grab; struct wl_keyboard_grab default_grab; uint32_t grab_key; uint32_t grab_serial; uint32_t grab_time; struct wl_array keys; struct { uint32_t mods_depressed; uint32_t mods_latched; uint32_t mods_locked; uint32_t group; } modifiers; }; struct wl_touch { struct wl_seat *seat; struct wl_list resource_list; struct wl_surface *focus; struct wl_resource *focus_resource; struct wl_listener focus_listener; uint32_t focus_serial; struct wl_signal focus_signal; struct wl_touch_grab *grab; struct wl_touch_grab default_grab; wl_fixed_t grab_x, grab_y; uint32_t grab_serial; uint32_t grab_time; }; struct wl_seat { struct wl_list base_resource_list; struct wl_signal destroy_signal; struct wl_pointer *pointer; struct wl_keyboard *keyboard; struct wl_touch *touch; uint32_t selection_serial; struct wl_data_source *selection_data_source; struct wl_listener selection_data_source_listener; struct wl_signal selection_signal; struct wl_list drag_resource_list; struct wl_client *drag_client; struct wl_data_source *drag_data_source; struct wl_listener drag_data_source_listener; struct wl_surface *drag_focus; struct wl_resource *drag_focus_resource; struct wl_listener drag_focus_listener; struct wl_pointer_grab drag_grab; struct wl_surface *drag_surface; struct wl_listener drag_icon_listener; struct wl_signal drag_icon_signal; }; /* * 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_queue_event(struct wl_resource *resource, uint32_t opcode, ...); /* 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" uint32_t wl_client_add_resource(struct wl_client *client, struct wl_resource *resource); struct wl_display * wl_client_get_display(struct wl_client *client); void wl_resource_destroy(struct wl_resource *resource); void wl_seat_init(struct wl_seat *seat); void wl_seat_release(struct wl_seat *seat); void wl_seat_set_pointer(struct wl_seat *seat, struct wl_pointer *pointer); void wl_seat_set_keyboard(struct wl_seat *seat, struct wl_keyboard *keyboard); void wl_seat_set_touch(struct wl_seat *seat, struct wl_touch *touch); void wl_pointer_init(struct wl_pointer *pointer); void wl_pointer_release(struct wl_pointer *pointer); void wl_pointer_set_focus(struct wl_pointer *pointer, struct wl_surface *surface, wl_fixed_t sx, wl_fixed_t sy); void wl_pointer_start_grab(struct wl_pointer *pointer, struct wl_pointer_grab *grab); void wl_pointer_end_grab(struct wl_pointer *pointer); void wl_pointer_set_current(struct wl_pointer *pointer, struct wl_surface *surface); void wl_keyboard_init(struct wl_keyboard *keyboard); void wl_keyboard_release(struct wl_keyboard *keyboard); void wl_keyboard_set_focus(struct wl_keyboard *keyboard, struct wl_surface *surface); void wl_keyboard_start_grab(struct wl_keyboard *device, struct wl_keyboard_grab *grab); void wl_keyboard_end_grab(struct wl_keyboard *keyboard); void wl_touch_init(struct wl_touch *touch); void wl_touch_release(struct wl_touch *touch); void wl_touch_start_grab(struct wl_touch *device, struct wl_touch_grab *grab); void wl_touch_end_grab(struct wl_touch *touch); void wl_data_device_set_keyboard_focus(struct wl_seat *seat); int wl_data_device_manager_init(struct wl_display *display); void wl_seat_set_selection(struct wl_seat *seat, struct wl_data_source *source, uint32_t serial); void * wl_shm_buffer_get_data(struct wl_buffer *buffer); int32_t wl_shm_buffer_get_stride(struct wl_buffer *buffer); uint32_t wl_shm_buffer_get_format(struct wl_buffer *buffer); int32_t wl_shm_buffer_get_width(struct wl_buffer *buffer); int32_t wl_shm_buffer_get_height(struct wl_buffer *buffer); int wl_buffer_is_shm(struct wl_buffer *buffer); int wl_display_init_shm(struct wl_display *display); struct wl_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