client: Invoke new_id closure arguments as pointers instead of integers
[profile/ivi/wayland.git] / src / wayland-private.h
index 8adee9f..4b757a1 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Copyright © 2008-2011 Kristian Høgsberg
  * Copyright © 2011 Intel Corporation
+ * Copyright © 2013 Jason Ekstrand
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
 #define WAYLAND_PRIVATE_H
 
 #include <stdarg.h>
-#include <ffi.h>
 #include "wayland-util.h"
 
+#define ARRAY_LENGTH(a) (sizeof (a) / sizeof (a)[0])
+
+#define container_of(ptr, type, member) ({                             \
+       const __typeof__( ((type *)0)->member ) *__mptr = (ptr);        \
+       (type *)( (char *)__mptr - offsetof(type,member) );})
+
 #define WL_ZOMBIE_OBJECT ((void *) 2)
 
 #define WL_MAP_SERVER_SIDE 0
 #define WL_MAP_CLIENT_SIDE 1
 #define WL_SERVER_ID_START 0xff000000
+#define WL_CLOSURE_MAX_ARGS 20
 
 struct wl_map {
        struct wl_array client_entries;
@@ -53,6 +60,7 @@ void wl_map_for_each(struct wl_map *map, wl_iterator_func_t func, void *data);
 
 struct wl_connection;
 struct wl_closure;
+struct wl_proxy;
 
 struct wl_connection *wl_connection_create(int fd);
 void wl_connection_destroy(struct wl_connection *connection);
@@ -66,15 +74,26 @@ int wl_connection_write(struct wl_connection *connection, const void *data, size
 int wl_connection_queue(struct wl_connection *connection,
                        const void *data, size_t count);
 
+union wl_argument {
+       int32_t i;
+       uint32_t u;
+       wl_fixed_t f;
+       const char *s;
+       struct wl_object *o;
+       uint32_t n;
+       struct wl_array *a;
+       int32_t h;
+};
+
 struct wl_closure {
        int count;
        const struct wl_message *message;
-       ffi_type *types[20];
-       ffi_cif cif;
-       void *args[20];
-       uint32_t *start;
+       uint32_t opcode;
+       uint32_t sender_id;
+       union wl_argument args[WL_CLOSURE_MAX_ARGS];
        struct wl_list link;
-       uint32_t buffer[0];
+       struct wl_proxy *proxy;
+       struct wl_array extra[0];
 };
 
 struct argument_details {
@@ -88,6 +107,14 @@ get_next_argument(const char *signature, struct argument_details *details);
 int
 arg_count_for_signature(const char *signature);
 
+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);
 struct wl_closure *
 wl_closure_vmarshal(struct wl_object *sender,
                    uint32_t opcode, va_list ap,
@@ -102,8 +129,13 @@ wl_connection_demarshal(struct wl_connection *connection,
 int
 wl_closure_lookup_objects(struct wl_closure *closure, struct wl_map *objects);
 
+enum wl_closure_invoke_flag {
+       WL_CLOSURE_INVOKE_CLIENT = (1 << 0),
+       WL_CLOSURE_INVOKE_SERVER = (1 << 1)
+};
+
 void
-wl_closure_invoke(struct wl_closure *closure,
+wl_closure_invoke(struct wl_closure *closure, uint32_t flags,
                  struct wl_object *target, void (*func)(void), void *data);
 int
 wl_closure_send(struct wl_closure *closure, struct wl_connection *connection);