Generate the wl_*_add_listener() stubs as well

dev
Kristian Høgsberg 14 years ago
parent 230ee37361
commit ccb75867ac
  1. 68
      scanner.c
  2. 67
      wayland-client.c

@ -293,7 +293,8 @@ emit_stubs(struct wl_list *message_list, struct interface *interface)
if (ret) if (ret)
printf("\tstruct wl_proxy *%s;\n\n" printf("\tstruct wl_proxy *%s;\n\n"
"\t%s = wl_proxy_create(" "\t%s = wl_proxy_create("
"(struct wl_proxy *) %s, &wl_%s_interface);\n" "(struct wl_proxy *) %s,\n"
"\t\t\t &wl_%s_interface);\n"
"\tif (!%s)\n" "\tif (!%s)\n"
"\t\treturn NULL;\n\n", "\t\treturn NULL;\n\n",
ret->name, ret->name,
@ -301,7 +302,8 @@ emit_stubs(struct wl_list *message_list, struct interface *interface)
interface->name, ret->interface_name, interface->name, ret->interface_name,
ret->name); ret->name);
printf("\twl_proxy_marshal((struct wl_proxy *) %s, WL_%s_%s", printf("\twl_proxy_marshal((struct wl_proxy *) %s,\n"
"\t\t\t WL_%s_%s",
interface->name, interface->name,
interface->uppercase_name, interface->uppercase_name,
m->uppercase_name); m->uppercase_name);
@ -320,12 +322,28 @@ emit_stubs(struct wl_list *message_list, struct interface *interface)
} }
} }
static const char *indent(int n)
{
const char *whitespace[] = {
"\t\t\t\t\t\t\t\t\t\t\t\t",
"\t\t\t\t\t\t\t\t\t\t\t\t ",
"\t\t\t\t\t\t\t\t\t\t\t\t ",
"\t\t\t\t\t\t\t\t\t\t\t\t ",
"\t\t\t\t\t\t\t\t\t\t\t\t ",
"\t\t\t\t\t\t\t\t\t\t\t\t ",
"\t\t\t\t\t\t\t\t\t\t\t\t ",
"\t\t\t\t\t\t\t\t\t\t\t\t "
};
return whitespace[n % 8] + 12 - n / 8;
}
static void static void
emit_structs(struct wl_list *message_list, struct interface *interface) emit_structs(struct wl_list *message_list, struct interface *interface)
{ {
struct message *m; struct message *m;
struct arg *a; struct arg *a;
int is_interface; int is_interface, n;
if (wl_list_empty(message_list)) if (wl_list_empty(message_list))
return; return;
@ -337,28 +355,44 @@ emit_structs(struct wl_list *message_list, struct interface *interface)
wl_list_for_each(m, message_list, link) { wl_list_for_each(m, message_list, link) {
printf("\tvoid (*%s)(", m->name); printf("\tvoid (*%s)(", m->name);
n = strlen(m->name) + 17;
if (is_interface) { if (is_interface) {
printf("struct wl_client *client, struct wl_%s *%s", printf("struct wl_client *client,\n"
"%sstruct wl_%s *%s",
indent(n),
interface->name, interface->name); interface->name, interface->name);
} else { } else {
printf("void *data, struct wl_%s *%s", printf("void *data,\n"),
interface->name, interface->name); printf("%sstruct wl_%s *%s",
indent(n), interface->name, interface->name);
} }
if (!wl_list_empty(&m->arg_list))
printf(", ");
wl_list_for_each(a, &m->arg_list, link) { wl_list_for_each(a, &m->arg_list, link) {
printf(",\n%s", indent(n));
emit_type(a); emit_type(a);
printf("%s%s", printf("%s", a->name);
a->name,
a->link.next == &m->arg_list ? "" : ", ");
} }
printf(");\n"); printf(");\n");
} }
printf("};\n\n"); printf("};\n\n");
if (!is_interface) {
printf("static inline int\n"
"wl_%s_add_listener(struct wl_%s *%s,\n"
"%sconst struct wl_%s_listener *listener, void *data)\n"
"{\n"
"\treturn wl_proxy_add_listener((struct wl_proxy *) %s,\n"
"%s(void (**)(void)) listener, data);\n"
"}\n\n",
interface->name, interface->name, interface->name,
indent(17 + strlen(interface->name)),
interface->name,
interface->name,
indent(37));
}
} }
static void static void
@ -387,9 +421,15 @@ emit_header(struct protocol *protocol, int server)
"extern void\n" "extern void\n"
"wl_proxy_marshal(struct wl_proxy *p, " "wl_proxy_marshal(struct wl_proxy *p, "
"uint32_t opcode, ...);\n" "uint32_t opcode, ...);\n"
"extern struct wl_proxy *\n" "extern struct wl_proxy *\n"
"wl_proxy_create(struct wl_proxy *factory, " "wl_proxy_create(struct wl_proxy *factory,\n"
"const struct wl_interface *interface);\n\n"); "\t\tconst struct wl_interface *interface);\n"
"extern int\n"
"wl_proxy_add_listener(struct wl_proxy *proxy,\n"
"\t\t void (**implementation)(void), "
"void *data);\n\n");
wl_list_for_each(i, &protocol->interface_list, link) { wl_list_for_each(i, &protocol->interface_list, link) {
printf("extern const struct wl_interface " printf("extern const struct wl_interface "

@ -79,26 +79,6 @@ struct wl_visual {
struct wl_proxy proxy; struct wl_proxy proxy;
}; };
struct wl_output {
struct wl_proxy proxy;
};
struct wl_shell {
struct wl_proxy proxy;
};
struct wl_drm {
struct wl_proxy proxy;
};
struct wl_buffer {
struct wl_proxy proxy;
};
struct wl_input_device {
struct wl_proxy proxy;
};
struct wl_display { struct wl_display {
struct wl_proxy proxy; struct wl_proxy proxy;
struct wl_connection *connection; struct wl_connection *connection;
@ -219,7 +199,7 @@ wl_proxy_create(struct wl_proxy *factory, const struct wl_interface *interface)
return proxy; return proxy;
} }
static int WL_EXPORT int
wl_proxy_add_listener(struct wl_proxy *proxy, void (**implementation)(void), void *data) wl_proxy_add_listener(struct wl_proxy *proxy, void (**implementation)(void), void *data)
{ {
struct wl_listener *listener; struct wl_listener *listener;
@ -247,33 +227,6 @@ wl_proxy_marshal(struct wl_proxy *proxy, uint32_t opcode, ...)
va_end(ap); va_end(ap);
} }
WL_EXPORT int
wl_output_add_listener(struct wl_output *output,
const struct wl_output_listener *listener,
void *data)
{
return wl_proxy_add_listener(&output->proxy,
(void (**)(void)) listener, data);
}
WL_EXPORT int
wl_shell_add_listener(struct wl_shell *shell,
const struct wl_shell_listener *listener,
void *data)
{
return wl_proxy_add_listener(&shell->proxy,
(void (**)(void)) listener, data);
}
WL_EXPORT int
wl_drm_add_listener(struct wl_drm *drm,
const struct wl_drm_listener *listener,
void *data)
{
return wl_proxy_add_listener(&drm->proxy,
(void (**)(void)) listener, data);
}
static void static void
add_visual(struct wl_display *display, struct wl_global *global) add_visual(struct wl_display *display, struct wl_global *global)
{ {
@ -308,15 +261,6 @@ wl_display_get_rgb_visual(struct wl_display *display)
return display->rgb_visual; return display->rgb_visual;
} }
WL_EXPORT int
wl_input_device_add_listener(struct wl_input_device *input_device,
const struct wl_input_device_listener *listener,
void *data)
{
return wl_proxy_add_listener(&input_device->proxy,
(void (**)(void)) listener, data);
}
static void static void
display_handle_invalid_object(void *data, display_handle_invalid_object(void *data,
struct wl_display *display, uint32_t id) struct wl_display *display, uint32_t id)
@ -566,15 +510,6 @@ wl_display_get_compositor(struct wl_display *display)
return display->compositor; return display->compositor;
} }
WL_EXPORT int
wl_compositor_add_listener(struct wl_compositor *compositor,
const struct wl_compositor_listener *listener,
void *data)
{
return wl_proxy_add_listener(&compositor->proxy,
(void (**)(void)) listener, data);
}
WL_EXPORT void WL_EXPORT void
wl_surface_set_user_data(struct wl_surface *surface, void *user_data) wl_surface_set_user_data(struct wl_surface *surface, void *user_data)
{ {

Loading…
Cancel
Save