[PATCH weston 04/12] window: move buffer type and transform into struct surface
Pekka Paalanen
ppaalanen at gmail.com
Wed Feb 13 06:17:15 PST 2013
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 <ppaalanen at gmail.com>
---
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 a9d2fae..0185dd2 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;
}
@@ -4492,7 +4497,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);
@@ -4504,7 +4509,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 4cde0f6..792b309 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,
--
1.7.12.4
More information about the wayland-devel
mailing list