scanner: emit event wrapper functions for server

Generate typed wrapper functions for sending events in a server.

This allows compile time type checking, unlike the existing method of
calling the variadic function wl_resource_post_event().

The stuff in wayland-server.h had to be slightly reordered to have all
(forward) declarations before use.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
This commit is contained in:
Pekka Paalanen 2012-03-02 15:16:33 +02:00
parent 0d22d25b87
commit 86a5d17afe
2 changed files with 51 additions and 8 deletions

View file

@ -560,6 +560,47 @@ emit_stubs(struct wl_list *message_list, struct interface *interface)
} }
} }
static void
emit_event_wrappers(struct wl_list *message_list, struct interface *interface)
{
struct message *m;
struct arg *a;
/* We provide hand written functions for the display object */
if (strcmp(interface->name, "wl_display") == 0)
return;
wl_list_for_each(m, message_list, link) {
printf("static inline void\n"
"%s_send_%s(struct wl_resource *resource_",
interface->name, m->name);
wl_list_for_each(a, &m->arg_list, link) {
printf(", ");
switch (a->type) {
case NEW_ID:
case OBJECT:
printf("struct wl_resource *");
break;
default:
emit_type(a);
}
printf("%s", a->name);
}
printf(")\n"
"{\n"
"\twl_resource_post_event(resource_, %s_%s",
interface->uppercase_name, m->uppercase_name);
wl_list_for_each(a, &m->arg_list, link)
printf(", %s", a->name);
printf(");\n");
printf("}\n\n");
}
}
static const char *indent(int n) static const char *indent(int n)
{ {
const char *whitespace[] = { const char *whitespace[] = {
@ -774,6 +815,7 @@ emit_header(struct protocol *protocol, int server)
if (server) { if (server) {
emit_structs(&i->request_list, i); emit_structs(&i->request_list, i);
emit_opcodes(&i->event_list, i); emit_opcodes(&i->event_list, i);
emit_event_wrappers(&i->event_list, i);
} else { } else {
emit_structs(&i->event_list, i); emit_structs(&i->event_list, i);
emit_opcodes(&i->request_list, i); emit_opcodes(&i->request_list, i);

View file

@ -30,7 +30,6 @@ extern "C" {
#include <sys/types.h> #include <sys/types.h>
#include <stdint.h> #include <stdint.h>
#include "wayland-util.h" #include "wayland-util.h"
#include "wayland-server-protocol.h"
enum { enum {
WL_EVENT_READABLE = 0x01, WL_EVENT_READABLE = 0x01,
@ -121,6 +120,13 @@ struct wl_resource {
void *data; void *data;
}; };
struct wl_buffer {
struct wl_resource resource;
int32_t width, height;
uint32_t busy_count;
void *user_data;
};
struct wl_shm_callbacks { struct wl_shm_callbacks {
void (*buffer_created)(struct wl_buffer *buffer); void (*buffer_created)(struct wl_buffer *buffer);
@ -131,13 +137,6 @@ struct wl_shm_callbacks {
void (*buffer_destroyed)(struct wl_buffer *buffer); void (*buffer_destroyed)(struct wl_buffer *buffer);
}; };
struct wl_buffer {
struct wl_resource resource;
int32_t width, height;
uint32_t busy_count;
void *user_data;
};
struct wl_listener { struct wl_listener {
struct wl_list link; struct wl_list link;
void (*func)(struct wl_listener *listener, void (*func)(struct wl_listener *listener,
@ -265,6 +264,8 @@ void wl_resource_post_error(struct wl_resource *resource,
uint32_t code, const char *msg, ...); uint32_t code, const char *msg, ...);
void wl_resource_post_no_memory(struct wl_resource *resource); void wl_resource_post_no_memory(struct wl_resource *resource);
#include "wayland-server-protocol.h"
void void
wl_display_post_frame(struct wl_display *display, struct wl_surface *surface, wl_display_post_frame(struct wl_display *display, struct wl_surface *surface,
uint32_t msecs); uint32_t msecs);