static struct window * create_window(struct display *display, int width, int height) { struct window *window; int i; int ret; window = zalloc(sizeof *window); if (!window) return NULL; window->callback = NULL; window->display = display; window->width = width; window->height = height; window->surface = wl_compositor_create_surface(display->compositor); if (display->shell) { window->xdg_surface = xdg_shell_get_xdg_surface(display->shell, window->surface); assert(window->xdg_surface); xdg_surface_add_listener(window->xdg_surface, &xdg_surface_listener, window); xdg_surface_set_title(window->xdg_surface, "simple-dmabuf"); } else if (display->fshell) { zwp_fullscreen_shell_v1_present_surface(display->fshell, window->surface, ZWP_FULLSCREEN_SHELL_V1_PRESENT_METHOD_DEFAULT, NULL); } else { assert(0); } for (i = 0; i < 2; ++i) { ret = create_dmabuf_buffer(display, &window->buffers[i], width, height); if (ret < 0) return NULL; } return window; }
static struct buffer * window_next_buffer(struct window *window) { struct buffer *buffer; int ret = 0; if (!window->buffers[0].busy) buffer = &window->buffers[0]; else if (!window->buffers[1].busy) buffer = &window->buffers[1]; else return NULL; if (!buffer->buffer) { ret = create_dmabuf_buffer(window->display, buffer, window->width, window->height); if (ret < 0) return NULL; } return buffer; }