2008-12-02 15:15:01 -05:00
|
|
|
/*
|
2011-11-18 13:46:56 -05:00
|
|
|
* Copyright © 2008-2011 Kristian Høgsberg
|
|
|
|
|
* Copyright © 2011 Intel Corporation
|
2013-02-26 11:30:51 -05:00
|
|
|
* Copyright © 2013 Jason Ekstrand
|
2008-12-02 15:15:01 -05:00
|
|
|
*
|
2015-06-10 10:54:15 -07:00
|
|
|
* 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:
|
2008-12-02 15:15:01 -05:00
|
|
|
*
|
2015-06-10 10:54:15 -07:00
|
|
|
* 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.
|
2008-12-02 15:15:01 -05:00
|
|
|
*/
|
|
|
|
|
|
2011-11-18 13:46:56 -05:00
|
|
|
#ifndef WAYLAND_PRIVATE_H
|
|
|
|
|
#define WAYLAND_PRIVATE_H
|
2008-10-08 12:48:46 -04:00
|
|
|
|
2008-12-21 21:50:23 -05:00
|
|
|
#include <stdarg.h>
|
2015-08-26 12:00:06 +08:00
|
|
|
#include <stdlib.h>
|
2016-07-18 12:42:25 -05:00
|
|
|
#include <stdint.h>
|
2013-06-27 20:09:18 -05:00
|
|
|
|
|
|
|
|
#define WL_HIDE_DEPRECATED 1
|
|
|
|
|
|
2008-12-24 19:30:25 -05:00
|
|
|
#include "wayland-util.h"
|
2008-12-21 21:50:23 -05:00
|
|
|
|
2012-10-19 17:08:38 -04:00
|
|
|
#define ARRAY_LENGTH(a) (sizeof (a) / sizeof (a)[0])
|
|
|
|
|
|
2012-10-19 23:06:53 -04:00
|
|
|
#define container_of(ptr, type, member) ({ \
|
|
|
|
|
const __typeof__( ((type *)0)->member ) *__mptr = (ptr); \
|
|
|
|
|
(type *)( (char *)__mptr - offsetof(type,member) );})
|
|
|
|
|
|
2011-11-18 21:59:36 -05:00
|
|
|
#define WL_MAP_SERVER_SIDE 0
|
|
|
|
|
#define WL_MAP_CLIENT_SIDE 1
|
|
|
|
|
#define WL_SERVER_ID_START 0xff000000
|
2013-02-26 11:30:51 -05:00
|
|
|
#define WL_CLOSURE_MAX_ARGS 20
|
2011-11-18 21:59:36 -05:00
|
|
|
|
2013-06-27 20:09:18 -05:00
|
|
|
struct wl_object {
|
|
|
|
|
const struct wl_interface *interface;
|
|
|
|
|
const void *implementation;
|
|
|
|
|
uint32_t id;
|
|
|
|
|
};
|
|
|
|
|
|
2013-06-05 16:39:50 -05:00
|
|
|
extern struct wl_object global_zombie_object;
|
|
|
|
|
#define WL_ZOMBIE_OBJECT ((void*)&global_zombie_object)
|
|
|
|
|
|
2016-05-08 08:44:08 -05:00
|
|
|
int
|
|
|
|
|
wl_interface_equal(const struct wl_interface *iface1,
|
|
|
|
|
const struct wl_interface *iface2);
|
|
|
|
|
|
2013-06-01 17:40:53 -05:00
|
|
|
/* Flags for wl_map_insert_new and wl_map_insert_at. Flags can be queried with
|
|
|
|
|
* wl_map_lookup_flags. The current implementation has room for 1 bit worth of
|
|
|
|
|
* flags. If more flags are ever added, the implementation of wl_map will have
|
|
|
|
|
* to change to allow for new flags */
|
|
|
|
|
enum wl_map_entry_flags {
|
|
|
|
|
WL_MAP_ENTRY_LEGACY = (1 << 0)
|
|
|
|
|
};
|
|
|
|
|
|
2011-11-18 13:46:56 -05:00
|
|
|
struct wl_map {
|
2011-11-18 21:59:36 -05:00
|
|
|
struct wl_array client_entries;
|
|
|
|
|
struct wl_array server_entries;
|
2013-06-01 17:40:52 -05:00
|
|
|
uint32_t side;
|
2011-11-18 13:46:56 -05:00
|
|
|
uint32_t free_list;
|
|
|
|
|
};
|
|
|
|
|
|
2016-08-11 17:23:10 +02:00
|
|
|
typedef enum wl_iterator_result (*wl_iterator_func_t)(void *element,
|
|
|
|
|
void *data);
|
2011-12-27 13:53:59 -05:00
|
|
|
|
2015-10-26 14:51:19 +09:00
|
|
|
void
|
|
|
|
|
wl_map_init(struct wl_map *map, uint32_t side);
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
wl_map_release(struct wl_map *map);
|
|
|
|
|
|
|
|
|
|
uint32_t
|
|
|
|
|
wl_map_insert_new(struct wl_map *map, uint32_t flags, void *data);
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
wl_map_insert_at(struct wl_map *map, uint32_t flags, uint32_t i, void *data);
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
wl_map_reserve_new(struct wl_map *map, uint32_t i);
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
wl_map_remove(struct wl_map *map, uint32_t i);
|
|
|
|
|
|
|
|
|
|
void *
|
|
|
|
|
wl_map_lookup(struct wl_map *map, uint32_t i);
|
|
|
|
|
|
|
|
|
|
uint32_t
|
|
|
|
|
wl_map_lookup_flags(struct wl_map *map, uint32_t i);
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
wl_map_for_each(struct wl_map *map, wl_iterator_func_t func, void *data);
|
2011-11-18 13:46:56 -05:00
|
|
|
|
2015-10-26 14:51:19 +09:00
|
|
|
struct wl_connection *
|
|
|
|
|
wl_connection_create(int fd);
|
2012-10-04 16:54:22 -04:00
|
|
|
|
2015-10-26 14:51:19 +09:00
|
|
|
int
|
|
|
|
|
wl_connection_destroy(struct wl_connection *connection);
|
2012-10-04 16:54:22 -04:00
|
|
|
|
2015-10-26 14:51:19 +09:00
|
|
|
void
|
|
|
|
|
wl_connection_copy(struct wl_connection *connection, void *data, size_t size);
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
wl_connection_consume(struct wl_connection *connection, size_t size);
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
wl_connection_flush(struct wl_connection *connection);
|
|
|
|
|
|
2016-01-12 13:12:34 +09:00
|
|
|
uint32_t
|
|
|
|
|
wl_connection_pending_input(struct wl_connection *connection);
|
|
|
|
|
|
2015-10-26 14:51:19 +09:00
|
|
|
int
|
|
|
|
|
wl_connection_read(struct wl_connection *connection);
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
wl_connection_write(struct wl_connection *connection,
|
|
|
|
|
const void *data, size_t count);
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
wl_connection_queue(struct wl_connection *connection,
|
|
|
|
|
const void *data, size_t count);
|
2008-12-24 19:30:25 -05:00
|
|
|
|
2016-01-14 16:03:43 +09:00
|
|
|
int
|
|
|
|
|
wl_connection_get_fd(struct wl_connection *connection);
|
|
|
|
|
|
2012-04-22 13:49:35 -04:00
|
|
|
struct wl_closure {
|
|
|
|
|
int count;
|
|
|
|
|
const struct wl_message *message;
|
2013-02-26 11:30:51 -05:00
|
|
|
uint32_t opcode;
|
|
|
|
|
uint32_t sender_id;
|
|
|
|
|
union wl_argument args[WL_CLOSURE_MAX_ARGS];
|
2012-10-04 17:34:18 -04:00
|
|
|
struct wl_list link;
|
client: Keep track of proxy validity and number of reference holders
When events are queued, the associated proxy objects (target proxy and
potentially closure argument proxies) are verified being valid. However,
as any event may destroy some proxy object, validity needs to be
verified again before dispatching. Before this change this was done by
again looking up the object via the display object map, but that did not
work because a delete_id event could be dispatched out-of-order if it
was queued in another queue, causing the object map to either have a new
proxy object with the same id or none at all, had it been destroyed in
an earlier event in the queue.
Instead, make wl_proxy reference counted and increase the reference
counter of every object associated with an event when it is queued. In
wl_proxy_destroy() set a flag saying the proxy has been destroyed by the
application and only free the proxy if the reference counter reaches
zero after decreasing it.
Before dispatching, verify that a proxy object still is valid by
checking that the flag set in wl_proxy_destroy() has not been set. When
dequeuing the event, all associated proxy objects are dereferenced and
free:ed if the reference counter reaches zero. As proxy reference counter
is initiated to 1, when dispatching an event it can never reach zero
without having the destroyed flag set.
Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
2012-11-03 22:26:10 +01:00
|
|
|
struct wl_proxy *proxy;
|
2013-02-26 11:30:51 -05:00
|
|
|
struct wl_array extra[0];
|
2012-04-22 13:49:35 -04:00
|
|
|
};
|
|
|
|
|
|
2012-07-23 19:54:40 +01:00
|
|
|
struct argument_details {
|
|
|
|
|
char type;
|
|
|
|
|
int nullable;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const char *
|
|
|
|
|
get_next_argument(const char *signature, struct argument_details *details);
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
arg_count_for_signature(const char *signature);
|
|
|
|
|
|
2013-06-27 20:09:19 -05:00
|
|
|
int
|
|
|
|
|
wl_message_get_since(const struct wl_message *message);
|
|
|
|
|
|
2013-02-26 11:30:51 -05:00
|
|
|
void
|
|
|
|
|
wl_argument_from_va_list(const char *signature, union wl_argument *args,
|
|
|
|
|
int count, va_list ap);
|
|
|
|
|
|
|
|
|
|
struct wl_closure *
|
|
|
|
|
wl_closure_marshal(struct wl_object *sender,
|
|
|
|
|
uint32_t opcode, union wl_argument *args,
|
|
|
|
|
const struct wl_message *message);
|
2015-10-26 14:51:19 +09:00
|
|
|
|
2012-06-12 17:45:25 -04:00
|
|
|
struct wl_closure *
|
|
|
|
|
wl_closure_vmarshal(struct wl_object *sender,
|
2012-04-22 13:49:35 -04:00
|
|
|
uint32_t opcode, va_list ap,
|
|
|
|
|
const struct wl_message *message);
|
2008-12-24 19:30:25 -05:00
|
|
|
|
2012-06-12 17:45:25 -04:00
|
|
|
struct wl_closure *
|
2010-08-30 09:47:36 -04:00
|
|
|
wl_connection_demarshal(struct wl_connection *connection,
|
|
|
|
|
uint32_t size,
|
2011-08-19 22:50:53 -04:00
|
|
|
struct wl_map *objects,
|
2010-08-30 09:47:36 -04:00
|
|
|
const struct wl_message *message);
|
2012-04-22 13:49:35 -04:00
|
|
|
|
2012-10-09 12:14:34 -04:00
|
|
|
int
|
|
|
|
|
wl_closure_lookup_objects(struct wl_closure *closure, struct wl_map *objects);
|
|
|
|
|
|
2013-03-08 18:44:16 +01:00
|
|
|
enum wl_closure_invoke_flag {
|
|
|
|
|
WL_CLOSURE_INVOKE_CLIENT = (1 << 0),
|
|
|
|
|
WL_CLOSURE_INVOKE_SERVER = (1 << 1)
|
|
|
|
|
};
|
|
|
|
|
|
2010-08-30 09:47:36 -04:00
|
|
|
void
|
2013-03-08 18:44:16 +01:00
|
|
|
wl_closure_invoke(struct wl_closure *closure, uint32_t flags,
|
2013-03-08 22:26:12 -06:00
|
|
|
struct wl_object *target, uint32_t opcode, void *data);
|
2015-10-26 14:51:19 +09:00
|
|
|
|
2013-07-17 21:58:46 -05:00
|
|
|
void
|
|
|
|
|
wl_closure_dispatch(struct wl_closure *closure, wl_dispatcher_func_t dispatcher,
|
|
|
|
|
struct wl_object *target, uint32_t opcode);
|
2015-10-26 14:51:19 +09:00
|
|
|
|
2012-02-29 11:07:48 -05:00
|
|
|
int
|
2010-09-07 21:34:45 -04:00
|
|
|
wl_closure_send(struct wl_closure *closure, struct wl_connection *connection);
|
2015-10-26 14:51:19 +09:00
|
|
|
|
2012-02-29 11:07:48 -05:00
|
|
|
int
|
2011-11-17 16:46:36 -05:00
|
|
|
wl_closure_queue(struct wl_closure *closure, struct wl_connection *connection);
|
2015-10-26 14:51:19 +09:00
|
|
|
|
2011-11-17 16:46:36 -05:00
|
|
|
void
|
2015-10-26 14:51:19 +09:00
|
|
|
wl_closure_print(struct wl_closure *closure,
|
|
|
|
|
struct wl_object *target, int send);
|
|
|
|
|
|
2010-09-07 10:58:19 -04:00
|
|
|
void
|
2010-08-30 09:47:36 -04:00
|
|
|
wl_closure_destroy(struct wl_closure *closure);
|
2008-10-08 12:48:46 -04:00
|
|
|
|
2012-05-29 17:37:02 +02:00
|
|
|
extern wl_log_func_t wl_log_handler;
|
|
|
|
|
|
|
|
|
|
void wl_log(const char *fmt, ...);
|
2015-11-16 11:49:02 +01:00
|
|
|
void wl_abort(const char *fmt, ...);
|
2012-05-29 17:37:02 +02:00
|
|
|
|
2013-08-07 09:17:02 -07:00
|
|
|
struct wl_display;
|
|
|
|
|
|
2013-08-06 20:05:53 +02:00
|
|
|
struct wl_array *
|
|
|
|
|
wl_display_get_additional_shm_formats(struct wl_display *display);
|
|
|
|
|
|
2015-08-26 12:00:06 +08:00
|
|
|
static inline void *
|
|
|
|
|
zalloc(size_t s)
|
|
|
|
|
{
|
|
|
|
|
return calloc(1, s);
|
|
|
|
|
}
|
|
|
|
|
|
2008-10-08 12:48:46 -04:00
|
|
|
#endif
|