diff options
Diffstat (limited to 'wayland-client.c')
-rw-r--r-- | wayland-client.c | 57 |
1 files changed, 55 insertions, 2 deletions
diff --git a/wayland-client.c b/wayland-client.c index c51d9bd..37bf32e 100644 --- a/wayland-client.c +++ b/wayland-client.c @@ -56,6 +56,7 @@ struct wl_display { uint32_t id; uint32_t mask; struct wl_list global_list; + struct wl_list visual_list; wl_display_update_func_t update; void *update_data; @@ -72,6 +73,11 @@ struct wl_surface { struct wl_proxy proxy; }; +struct wl_visual { + struct wl_proxy proxy; + struct wl_list link; +}; + static int connection_update(struct wl_connection *connection, uint32_t mask, void *data) @@ -86,6 +92,45 @@ connection_update(struct wl_connection *connection, return 0; } +static void +add_visual(struct wl_display *display, struct wl_global *global) +{ + struct wl_visual *visual; + + visual = malloc(sizeof *visual); + if (visual == NULL) + return; + + visual->proxy.display = display; + visual->proxy.id = global->id; + wl_list_insert(display->visual_list.prev, &visual->link); + + printf("added visual, id %d\n", global->id); +} + +WL_EXPORT struct wl_visual * +wl_display_get_argb_visual(struct wl_display *display) +{ + return container_of(display->visual_list.next, + struct wl_visual, link); +} + +WL_EXPORT struct wl_visual * +wl_display_get_premultiplied_argb_visual(struct wl_display *display) +{ + return container_of(display->visual_list.next->next, + struct wl_visual, link); +} + +WL_EXPORT struct wl_visual * +wl_display_get_rgb_visual(struct wl_display *display) +{ + /* FIXME: Where's cddar when you need it... */ + + return container_of(display->visual_list.next->next->next, + struct wl_visual, link); +} + WL_EXPORT struct wl_display * wl_display_create(const char *name, size_t name_size) { @@ -125,6 +170,7 @@ wl_display_create(const char *name, size_t name_size) read(display->fd, &count, sizeof count); wl_list_init(&display->global_list); + wl_list_init(&display->visual_list); for (i = 0; i < count; i++) { /* FIXME: actually discover advertised objects here. */ read(display->fd, &id, sizeof id); @@ -140,6 +186,9 @@ wl_display_create(const char *name, size_t name_size) memcpy(global->interface, buffer, length); global->interface[length] = '\0'; wl_list_insert(display->global_list.prev, &global->link); + + if (strcmp(global->interface, "visual") == 0) + add_visual(display, global); } display->proxy.display = display; @@ -327,9 +376,10 @@ wl_surface_destroy(struct wl_surface *surface) WL_EXPORT void wl_surface_attach(struct wl_surface *surface, uint32_t name, - int32_t width, int32_t height, uint32_t stride) + int32_t width, int32_t height, uint32_t stride, + struct wl_visual *visual) { - uint32_t request[6]; + uint32_t request[7]; request[0] = surface->proxy.id; request[1] = WL_SURFACE_ATTACH | ((sizeof request) << 16); @@ -337,6 +387,9 @@ wl_surface_attach(struct wl_surface *surface, uint32_t name, request[3] = width; request[4] = height; request[5] = stride; + request[6] = visual->proxy.id; + + printf("attach, visual id is %d\n", visual->proxy.id); wl_connection_write(surface->proxy.display->connection, request, sizeof request); |