surface, name, width, height, stride);
}
-static const struct wl_argument attach_arguments[] = {
- { WL_ARGUMENT_UINT32 },
- { WL_ARGUMENT_UINT32 },
- { WL_ARGUMENT_UINT32 },
- { WL_ARGUMENT_UINT32 },
-};
-
static void
wl_surface_map(struct wl_client *client, struct wl_surface *surface,
int32_t x, int32_t y, int32_t width, int32_t height)
surface, &surface->map);
}
-static const struct wl_argument map_arguments[] = {
- { WL_ARGUMENT_UINT32 },
- { WL_ARGUMENT_UINT32 },
- { WL_ARGUMENT_UINT32 },
- { WL_ARGUMENT_UINT32 },
-};
-
static void
wl_surface_copy(struct wl_client *client, struct wl_surface *surface,
int32_t dst_x, int32_t dst_y, uint32_t name, uint32_t stride,
name, stride, x, y, width, height);
}
-static const struct wl_argument copy_arguments[] = {
- { WL_ARGUMENT_UINT32 },
- { WL_ARGUMENT_UINT32 },
- { WL_ARGUMENT_UINT32 },
- { WL_ARGUMENT_UINT32 },
- { WL_ARGUMENT_UINT32 },
- { WL_ARGUMENT_UINT32 },
- { WL_ARGUMENT_UINT32 },
- { WL_ARGUMENT_UINT32 },
- { WL_ARGUMENT_UINT32 },
- { WL_ARGUMENT_UINT32 },
-};
-
static void
wl_surface_damage(struct wl_client *client, struct wl_surface *surface,
int32_t x, int32_t y, int32_t width, int32_t height)
surface, x, y, width, height);
}
-static const struct wl_argument damage_arguments[] = {
- { WL_ARGUMENT_UINT32 },
- { WL_ARGUMENT_UINT32 },
- { WL_ARGUMENT_UINT32 },
- { WL_ARGUMENT_UINT32 },
-};
-
static const struct wl_method surface_methods[] = {
- { "destroy", wl_surface_destroy,
- 0, NULL },
- { "attach", wl_surface_attach,
- ARRAY_LENGTH(attach_arguments), attach_arguments },
- { "map", wl_surface_map,
- ARRAY_LENGTH(map_arguments), map_arguments },
- { "copy", wl_surface_copy,
- ARRAY_LENGTH(copy_arguments), copy_arguments },
- { "damage", wl_surface_damage,
- ARRAY_LENGTH(damage_arguments), damage_arguments }
+ { "destroy", wl_surface_destroy, "" },
+ { "attach", wl_surface_attach, "uuuu" },
+ { "map", wl_surface_map, "iiii" },
+ { "copy", wl_surface_copy, "iiuuiiii" },
+ { "damage", wl_surface_damage, "iiii" }
};
static const struct wl_interface surface_interface = {
{
const struct wl_event *event;
struct wl_object *object;
- uint32_t args[10], size, *p;
+ uint32_t args[10], size;
va_list ap;
- int i;
+ int i, count;
event = &sender->interface->events[opcode];
+ count = strlen(event->signature) + 2;
+ assert(count <= ARRAY_LENGTH(args));
+
size = 0;
va_start(ap, opcode);
- p = &args[2];
- for (i = 0; i < event->argument_count; i++) {
- switch (event->arguments[i].type) {
- case WL_ARGUMENT_UINT32:
- p[i] = va_arg(ap, uint32_t);
- size += sizeof p[i];
+ for (i = 2; i < count; i++) {
+ switch (event->signature[i - 2]) {
+ case 'u':
+ case 'i':
+ args[i] = va_arg(ap, uint32_t);
+ size += sizeof args[i];
break;
- case WL_ARGUMENT_STRING:
+ case 's':
/* FIXME */
- p[i] = 0;
- size += sizeof p[i];
+ args[i] = 0;
+ size += sizeof args[i];
break;
- case WL_ARGUMENT_OBJECT:
+ case 'o':
object = va_arg(ap, struct wl_object *);
- p[i] = object->id;
- size += sizeof p[i];
+ args[i] = object->id;
+ size += sizeof args[i];
break;
- case WL_ARGUMENT_NEW_ID:
default:
assert(0);
break;
ffi_type *types[20];
ffi_cif cif;
uint32_t *p, result;
- int i;
+ int i, j, count;
union {
uint32_t uint32;
const char *string;
struct wl_object *object;
uint32_t data[64];
- if (method->argument_count > ARRAY_LENGTH(types)) {
- printf("too many args (%d)\n", method->argument_count);
+ count = strlen(method->signature) + 2;
+ if (count > ARRAY_LENGTH(types)) {
+ printf("too many args (%d)\n", count);
return;
}
wl_connection_copy(client->connection, data, size);
p = &data[2];
- for (i = 0; i < method->argument_count; i++) {
- switch (method->arguments[i].type) {
- case WL_ARGUMENT_UINT32:
- types[i + 2] = &ffi_type_uint32;
- values[i + 2].uint32 = *p;
+ j = 0;
+ for (i = 2; i < count; i++) {
+ switch (method->signature[i - 2]) {
+ case 'u':
+ case 'i':
+ types[i] = &ffi_type_uint32;
+ values[i].uint32 = *p;
p++;
break;
- case WL_ARGUMENT_STRING:
- types[i + 2] = &ffi_type_pointer;
+ case 's':
+ types[i] = &ffi_type_pointer;
/* FIXME */
- values[i + 2].uint32 = *p++;
+ values[i].uint32 = *p++;
break;
- case WL_ARGUMENT_OBJECT:
- types[i + 2] = &ffi_type_pointer;
+ case 'o':
+ types[i] = &ffi_type_pointer;
object = wl_hash_lookup(&client->display->objects, *p);
if (object == NULL)
printf("unknown object (%d)\n", *p);
- if (object->interface != method->arguments[i].data)
+ if (object->interface != method->types[j])
printf("wrong object type\n");
- values[i + 2].object = object;
+ values[i].object = object;
p++;
+ j++;
break;
- case WL_ARGUMENT_NEW_ID:
- types[i + 2] = &ffi_type_uint32;
- values[i + 2].new_id = *p;
+ case 'n':
+ types[i] = &ffi_type_uint32;
+ values[i].new_id = *p;
object = wl_hash_lookup(&client->display->objects, *p);
if (object != NULL)
printf("object already exists (%d)\n", *p);
printf("unknown type\n");
break;
}
- args[i + 2] = &values[i + 2];
+ args[i] = &values[i];
}
- ffi_prep_cif(&cif, FFI_DEFAULT_ABI, method->argument_count + 2,
- &ffi_type_uint32, types);
+ ffi_prep_cif(&cif, FFI_DEFAULT_ABI, count, &ffi_type_uint32, types);
ffi_call(&cif, FFI_FN(method->func), &result, args);
}
return 0;
}
-static const struct wl_argument create_surface_arguments[] = {
- { WL_ARGUMENT_NEW_ID }
-};
-
static int
wl_display_commit(struct wl_client *client,
struct wl_display *display, uint32_t key)
return 0;
}
-static const struct wl_argument commit_arguments[] = {
- { WL_ARGUMENT_UINT32 }
-};
-
static const struct wl_method display_methods[] = {
- { "create_surface", wl_display_create_surface,
- ARRAY_LENGTH(create_surface_arguments), create_surface_arguments },
- { "commit", wl_display_commit,
- ARRAY_LENGTH(commit_arguments), commit_arguments },
-};
-
-static const struct wl_argument invalid_object_arguments[] = {
- { WL_ARGUMENT_UINT32 }
-};
-
-static const struct wl_argument invalid_method_arguments[] = {
- { WL_ARGUMENT_UINT32 },
- { WL_ARGUMENT_UINT32 }
-};
-
-static const struct wl_argument acknowledge_arguments[] = {
- { WL_ARGUMENT_UINT32 },
- { WL_ARGUMENT_UINT32 }
-};
-
-static const struct wl_argument frame_arguments[] = {
- { WL_ARGUMENT_UINT32 },
- { WL_ARGUMENT_UINT32 }
+ { "create_surface", wl_display_create_surface, "n" },
+ { "commit", wl_display_commit, "u" }
};
static const struct wl_event display_events[] = {
- { "invalid_object",
- ARRAY_LENGTH(invalid_object_arguments), invalid_object_arguments },
- { "invalid_method",
- ARRAY_LENGTH(invalid_method_arguments), invalid_method_arguments },
- { "no_memory",
- 0, NULL },
- { "acknowledge",
- ARRAY_LENGTH(acknowledge_arguments), acknowledge_arguments },
- { "frame",
- ARRAY_LENGTH(frame_arguments), frame_arguments },
+ { "invalid_object", "u" },
+ { "invalid_method", "uu" },
+ { "no_memory", "" },
+ { "acknowledge", "uu" },
+ { "frame", "uu" }
};
static const struct wl_interface display_interface = {