}
static void
-convert_arguments_to_ffi(const char *signature, union wl_argument *args,
+convert_arguments_to_ffi(const char *signature, uint32_t flags,
+ union wl_argument *args,
int count, ffi_type **ffi_types, void** ffi_args)
{
int i;
ffi_args[i] = &args[i].o;
break;
case 'n':
- ffi_types[i] = &ffi_type_uint32;
- ffi_args[i] = &args[i].n;
+ if (flags & WL_CLOSURE_INVOKE_CLIENT) {
+ ffi_types[i] = &ffi_type_pointer;
+ ffi_args[i] = &args[i].o;
+ } else {
+ ffi_types[i] = &ffi_type_uint32;
+ ffi_args[i] = &args[i].n;
+ }
break;
case 'a':
ffi_types[i] = &ffi_type_pointer;
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 count;
ffi_types[1] = &ffi_type_pointer;
ffi_args[1] = ⌖
- convert_arguments_to_ffi(closure->message->signature, closure->args,
+ convert_arguments_to_ffi(closure->message->signature, flags, closure->args,
count, ffi_types + 2, ffi_args + 2);
ffi_prep_cif(&cif, FFI_DEFAULT_ABI,
if (wl_debug)
wl_closure_print(closure, &proxy->object, false);
- wl_closure_invoke(closure, &proxy->object,
+ wl_closure_invoke(closure, WL_CLOSURE_INVOKE_CLIENT, &proxy->object,
proxy->object.implementation[opcode],
proxy->user_data);
}
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);
if (wl_debug)
wl_closure_print(closure, object, false);
- wl_closure_invoke(closure, object,
+ wl_closure_invoke(closure, WL_CLOSURE_INVOKE_SERVER, object,
object->implementation[opcode], client);
wl_closure_destroy(closure);
closure = wl_connection_demarshal(data->read_connection,
size, &objects, &message);
assert(closure);
- wl_closure_invoke(closure, &object, func, data);
+ wl_closure_invoke(closure, WL_CLOSURE_INVOKE_SERVER, &object, func, data);
wl_closure_destroy(closure);
}
object.id = msg[0];
closure = wl_connection_demarshal(data->read_connection,
size, &objects, &message);
- wl_closure_invoke(closure, &object, func, data);
+ wl_closure_invoke(closure, WL_CLOSURE_INVOKE_SERVER, &object, func, data);
wl_closure_destroy(closure);
}
assert(closure);
done = 0;
- wl_closure_invoke(closure, &object, handler, &done);
+ wl_closure_invoke(closure, WL_CLOSURE_INVOKE_SERVER, &object, handler, &done);
wl_closure_destroy(closure);
assert(done);
}
object.id = msg[0];
closure = wl_connection_demarshal(data->read_connection,
size, &objects, &message);
- wl_closure_invoke(closure, &object, func, data);
+ wl_closure_invoke(closure, WL_CLOSURE_INVOKE_SERVER, &object, func, data);
wl_closure_destroy(closure);
}