[PATCH weston 02/12] window: create new struct surface with wl_surface

Pekka Paalanen ppaalanen at gmail.com
Wed Feb 13 06:17:13 PST 2013


Struct window has many fields that are directly related to the
wl_surface, more than to the window as a whole. When we start composing
a window from several wl_surfaces, these fields need to be per
wl_surface, not per window.

Start separating such fields from struct window into struct surface by
moving the wl_surface.

Signed-off-by: Pekka Paalanen <ppaalanen at gmail.com>
---
 clients/window.c | 96 ++++++++++++++++++++++++++++++++++++++------------------
 1 file changed, 66 insertions(+), 30 deletions(-)

diff --git a/clients/window.c b/clients/window.c
index 08486be..862b1e6 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -1,6 +1,6 @@
 /*
  * Copyright © 2008 Kristian Høgsberg
- * Copyright © 2012 Collabora, Ltd.
+ * Copyright © 2012-2013 Collabora, Ltd.
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -189,12 +189,16 @@ struct toysurface {
 	void (*destroy)(struct toysurface *base);
 };
 
+struct surface {
+	struct window *window;
+
+	struct wl_surface *surface;
+};
+
 struct window {
 	struct display *display;
 	struct window *parent;
 	struct wl_list window_output_list;
-	struct wl_surface *surface;
-	struct wl_shell_surface *shell_surface;
 	struct wl_region *input_region;
 	struct wl_region *opaque_region;
 	char *title;
@@ -227,6 +231,8 @@ struct window {
 	window_fullscreen_handler_t fullscreen_handler;
 	window_output_handler_t output_handler;
 
+	struct surface *main_surface;
+	struct wl_shell_surface *shell_surface;
 	struct wl_callback *frame_cb;
 
 	struct frame *frame;
@@ -1163,14 +1169,14 @@ window_attach_surface(struct window *window)
 	}
 
 	if (window->opaque_region) {
-		wl_surface_set_opaque_region(window->surface,
+		wl_surface_set_opaque_region(window->main_surface->surface,
 					     window->opaque_region);
 		wl_region_destroy(window->opaque_region);
 		window->opaque_region = NULL;
 	}
 
 	if (window->input_region) {
-		wl_surface_set_input_region(window->surface,
+		wl_surface_set_input_region(window->main_surface->surface,
 					    window->input_region);
 		wl_region_destroy(window->input_region);
 		window->input_region = NULL;
@@ -1230,14 +1236,15 @@ window_create_surface(struct window *window)
 	    window->display->dpy) {
 		window->toysurface =
 			egl_window_surface_create(window->display,
-						  window->surface, flags,
+						  window->main_surface->surface,
+						  flags,
 						  &allocation);
 	}
 
 	if (!window->toysurface)
 		window->toysurface = shm_surface_create(window->display,
-							window->surface, flags,
-							&allocation);
+						window->main_surface->surface,
+						flags, &allocation);
 
 	if (window->resizing)
 		flags = SURFACE_HINT_RESIZE;
@@ -1263,11 +1270,19 @@ window_set_buffer_transform(struct window *window,
 			    enum wl_output_transform transform)
 {
 	window->buffer_transform = transform;
-	wl_surface_set_buffer_transform(window->surface, transform);
+	wl_surface_set_buffer_transform(window->main_surface->surface,
+					transform);
 }
 
 static void frame_destroy(struct frame *frame);
 
+static void
+surface_destroy(struct surface *surface)
+{
+	wl_surface_destroy(surface->surface);
+	free(surface);
+}
+
 void
 window_destroy(struct window *window)
 {
@@ -1304,7 +1319,9 @@ window_destroy(struct window *window)
 
 	if (window->shell_surface)
 		wl_shell_surface_destroy(window->shell_surface);
-	wl_surface_destroy(window->surface);
+
+	surface_destroy(window->main_surface);
+
 	wl_list_remove(&window->link);
 
 	if (window->toysurface)
@@ -1498,7 +1515,7 @@ window_get_surface(struct window *window)
 struct wl_surface *
 window_get_wl_surface(struct window *window)
 {
-	return window->surface;
+	return window->main_surface->surface;
 }
 
 struct wl_shell_surface *
@@ -2076,16 +2093,18 @@ frame_menu_func(struct window *window, int index, void *data)
 	case 1: /* move to workspace above */
 		display = window->display;
 		if (display->workspace > 0)
-			workspace_manager_move_surface(display->workspace_manager,
-						       window->surface,
-						       display->workspace - 1);
+			workspace_manager_move_surface(
+				display->workspace_manager,
+				window->main_surface->surface,
+				display->workspace - 1);
 		break;
 	case 2: /* move to workspace below */
 		display = window->display;
 		if (display->workspace < display->workspace_count - 1)
-			workspace_manager_move_surface(display->workspace_manager,
-						       window->surface,
-						       display->workspace + 1);
+			workspace_manager_move_surface(
+				display->workspace_manager,
+				window->main_surface->surface,
+				display->workspace + 1);
 		break;
 	case 3: /* fullscreen */
 		/* we don't have a way to get out of fullscreen for now */
@@ -3300,7 +3319,7 @@ idle_redraw(struct task *task, uint32_t events)
 	window->redraw_needed = 0;
 	wl_list_init(&window->redraw_task.link);
 
-	window->frame_cb = wl_surface_frame(window->surface);
+	window->frame_cb = wl_surface_frame(window->main_surface->surface);
 	wl_callback_add_listener(window->frame_cb, &listener, window);
 	window_flush(window);
 }
@@ -3465,16 +3484,16 @@ window_set_text_cursor_position(struct window *window, int32_t x, int32_t y)
 		return;
 
 	text_cursor_position_notify(text_cursor_position,
-						window->surface,
-						wl_fixed_from_int(x),
-						wl_fixed_from_int(y));
+				    window->main_surface->surface,
+				    wl_fixed_from_int(x),
+				    wl_fixed_from_int(y));
 }
 
 void
 window_damage(struct window *window, int32_t x, int32_t y,
 	      int32_t width, int32_t height)
 {
-	wl_surface_damage(window->surface, x, y, width, height);
+	wl_surface_damage(window->main_surface->surface, x, y, width, height);
 }
 
 static void
@@ -3537,6 +3556,23 @@ static const struct wl_surface_listener surface_listener = {
 	surface_leave
 };
 
+static struct surface *
+surface_create(struct window *window)
+{
+	struct display *display = window->display;
+	struct surface *surface;
+
+	surface = calloc(1, sizeof *surface);
+	if (!surface)
+		return NULL;
+
+	surface->window = window;
+	surface->surface = wl_compositor_create_surface(display->compositor);
+	wl_surface_add_listener(surface->surface, &surface_listener, window);
+
+	return surface;
+}
+
 static struct window *
 window_create_internal(struct display *display,
 		       struct window *parent, int type)
@@ -3550,12 +3586,11 @@ window_create_internal(struct display *display,
 	memset(window, 0, sizeof *window);
 	window->display = display;
 	window->parent = parent;
-	window->surface = wl_compositor_create_surface(display->compositor);
-	wl_surface_add_listener(window->surface, &surface_listener, window);
+	window->main_surface = surface_create(window);
 	if (type != TYPE_CUSTOM && display->shell) {
 		window->shell_surface =
 			wl_shell_get_shell_surface(display->shell,
-						   window->surface);
+				window->main_surface->surface);
 	}
 	window->allocation.x = 0;
 	window->allocation.y = 0;
@@ -3577,7 +3612,7 @@ window_create_internal(struct display *display,
 	else
 		window->buffer_type = WINDOW_BUFFER_TYPE_SHM;
 
-	wl_surface_set_user_data(window->surface, window);
+	wl_surface_set_user_data(window->main_surface->surface, window);
 	wl_list_insert(display->window_list.prev, &window->link);
 	wl_list_init(&window->redraw_task.link);
 
@@ -3631,9 +3666,10 @@ window_create_transient(struct display *display, struct window *parent,
 	window->y = y;
 
 	if (display->shell)
-		wl_shell_surface_set_transient(window->shell_surface,
-					       window->parent->surface,
-					       window->x, window->y, flags);
+		wl_shell_surface_set_transient(
+			window->shell_surface,
+			window->parent->main_surface->surface,
+			window->x, window->y, flags);
 
 	return window;
 }
@@ -3783,7 +3819,7 @@ window_show_menu(struct display *display,
 	input_ungrab(input);
 	wl_shell_surface_set_popup(window->shell_surface, input->seat,
 				   display_get_serial(window->display),
-				   window->parent->surface,
+				   window->parent->main_surface->surface,
 				   window->x, window->y, 0);
 
 	widget_set_redraw_handler(menu->widget, menu_redraw_handler);
-- 
1.7.12.4



More information about the wayland-devel mailing list