From 02bba7ceb07e30489ce6da2114242bed5cdc6f49 Mon Sep 17 00:00:00 2001 From: Pekka Paalanen Date: Wed, 13 Feb 2013 16:17:15 +0200 Subject: [PATCH] window: move buffer type and transform into struct surface These are surface specifics, since buffers are surface specific. SURFACE_HINT_RESIZE is moved together to the other SURFACE_* flags, so that surface_create_surface() would not need two flags arguments. struct toysurface::prepare vfunc checks for SURFACE_HINT_RESIZE, and egl_window_surface_create() and shm_surface_create() check for the non-HINT flags. Signed-off-by: Pekka Paalanen --- clients/window.c | 81 +++++++++++++++++++++++++----------------------- clients/window.h | 2 ++ 2 files changed, 45 insertions(+), 38 deletions(-) diff --git a/clients/window.c b/clients/window.c index e0b1879f..c4a679b7 100644 --- a/clients/window.c +++ b/clients/window.c @@ -145,10 +145,6 @@ struct window_output { struct wl_list link; }; -enum toysurface_prepare_flags { - SURFACE_HINT_RESIZE = 0x01, -}; - struct toysurface { /* * Prepare the surface for drawing. Makes sure there is a surface @@ -197,6 +193,9 @@ struct surface { struct rectangle allocation; struct rectangle server_allocation; + + enum window_buffer_type buffer_type; + enum wl_output_transform buffer_transform; }; struct window { @@ -219,8 +218,6 @@ struct window { int transparent; int focus_count; - enum window_buffer_type buffer_type; - enum wl_output_transform buffer_transform; cairo_surface_t *cairo_surface; int resizing; @@ -1221,18 +1218,13 @@ window_get_display(struct window *window) return window->display; } -static void -window_create_surface(struct window *window) +static cairo_surface_t * +surface_create_surface(struct surface *surface, int dx, int dy, uint32_t flags) { - struct surface *surface = window->main_surface; + struct display *display = surface->window->display; struct rectangle allocation = surface->allocation; - uint32_t flags = 0; - int dx, dy; - - if (!window->transparent) - flags = SURFACE_OPAQUE; - switch (window->buffer_transform) { + switch (surface->buffer_transform) { case WL_OUTPUT_TRANSFORM_90: case WL_OUTPUT_TRANSFORM_270: case WL_OUTPUT_TRANSFORM_FLIPPED_90: @@ -1244,45 +1236,54 @@ window_create_surface(struct window *window) break; } - if (!surface->toysurface && - window->buffer_type == WINDOW_BUFFER_TYPE_EGL_WINDOW && - window->display->dpy) { + if (!surface->toysurface && display->dpy && + surface->buffer_type == WINDOW_BUFFER_TYPE_EGL_WINDOW) { surface->toysurface = - egl_window_surface_create(window->display, + egl_window_surface_create(display, surface->surface, flags, &allocation); } if (!surface->toysurface) - surface->toysurface = shm_surface_create(window->display, + surface->toysurface = shm_surface_create(display, surface->surface, flags, &allocation); + return surface->toysurface->prepare(surface->toysurface, dx, dy, + allocation.width, + allocation.height, + flags); +} + +static void +window_create_surface(struct window *window) +{ + uint32_t flags = 0; + int dx, dy; + + if (!window->transparent) + flags |= SURFACE_OPAQUE; + if (window->resizing) - flags = SURFACE_HINT_RESIZE; - else - flags = 0; + flags |= SURFACE_HINT_RESIZE; window_get_resize_dx_dy(window, &dx, &dy); window->cairo_surface = - surface->toysurface->prepare(surface->toysurface, dx, dy, - allocation.width, - allocation.height, - flags); + surface_create_surface(window->main_surface, dx, dy, flags); } int window_get_buffer_transform(struct window *window) { - return window->buffer_transform; + return window->main_surface->buffer_transform; } void window_set_buffer_transform(struct window *window, enum wl_output_transform transform) { - window->buffer_transform = transform; + window->main_surface->buffer_transform = transform; wl_surface_set_buffer_transform(window->main_surface->surface, transform); } @@ -3598,6 +3599,7 @@ window_create_internal(struct display *display, struct window *parent, int type) { struct window *window; + struct surface *surface; window = malloc(sizeof *window); if (window == NULL) @@ -3606,11 +3608,14 @@ window_create_internal(struct display *display, memset(window, 0, sizeof *window); window->display = display; window->parent = parent; - window->main_surface = surface_create(window); + + surface = surface_create(window); + window->main_surface = surface; + if (type != TYPE_CUSTOM && display->shell) { window->shell_surface = wl_shell_get_shell_surface(display->shell, - window->main_surface->surface); + surface->surface); } window->transparent = 1; @@ -3621,14 +3626,14 @@ window_create_internal(struct display *display, if (display->argb_device) #ifdef HAVE_CAIRO_EGL - window->buffer_type = WINDOW_BUFFER_TYPE_EGL_WINDOW; + surface->buffer_type = WINDOW_BUFFER_TYPE_EGL_WINDOW; #else - window->buffer_type = WINDOW_BUFFER_TYPE_SHM; + surface->buffer_type = WINDOW_BUFFER_TYPE_SHM; #endif else - window->buffer_type = WINDOW_BUFFER_TYPE_SHM; + surface->buffer_type = WINDOW_BUFFER_TYPE_SHM; - wl_surface_set_user_data(window->main_surface->surface, window); + wl_surface_set_user_data(surface->surface, window); wl_list_insert(display->window_list.prev, &window->link); wl_list_init(&window->redraw_task.link); @@ -3851,7 +3856,7 @@ window_show_menu(struct display *display, void window_set_buffer_type(struct window *window, enum window_buffer_type type) { - window->buffer_type = type; + window->main_surface->buffer_type = type; } @@ -4499,7 +4504,7 @@ display_acquire_window_surface(struct display *display, { struct surface *surface = window->main_surface; - if (window->buffer_type != WINDOW_BUFFER_TYPE_EGL_WINDOW) + if (surface->buffer_type != WINDOW_BUFFER_TYPE_EGL_WINDOW) return -1; return surface->toysurface->acquire(surface->toysurface, ctx); @@ -4511,7 +4516,7 @@ display_release_window_surface(struct display *display, { struct surface *surface = window->main_surface; - if (window->buffer_type != WINDOW_BUFFER_TYPE_EGL_WINDOW) + if (surface->buffer_type != WINDOW_BUFFER_TYPE_EGL_WINDOW) return; surface->toysurface->release(surface->toysurface); diff --git a/clients/window.h b/clients/window.h index 4cde0f67..792b309b 100644 --- a/clients/window.h +++ b/clients/window.h @@ -126,6 +126,8 @@ display_release_window_surface(struct display *display, #define SURFACE_OPAQUE 0x01 #define SURFACE_SHM 0x02 +#define SURFACE_HINT_RESIZE 0x10 + cairo_surface_t * display_create_surface(struct display *display, struct wl_surface *surface,