[weston PATCH v6 1/7] compositor, shell: add fullscreen implementation shell part

juan.j.zhao at linux.intel.com juan.j.zhao at linux.intel.com
Thu Feb 16 23:26:10 PST 2012


From: Juan Zhao <juan.j.zhao at linux.intel.com>

---
 clients/window.c     |    3 +-
 src/compositor-drm.c |   10 ++++-
 src/compositor.c     |    5 ++-
 src/compositor.h     |   11 +++++-
 src/shell.c          |   97 +++++++++++++++++++++++++++++++++++++++++---------
 5 files changed, 103 insertions(+), 23 deletions(-)

diff --git a/clients/window.c b/clients/window.c
index ae5a791..1e7e89f 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -786,9 +786,10 @@ window_set_type(struct window *window)
 	if (!window->shell_surface)
 		return;
 
+#define FRAMERATE 0
 	switch (window->type) {
 	case TYPE_FULLSCREEN:
-		wl_shell_surface_set_fullscreen(window->shell_surface);
+		wl_shell_surface_set_fullscreen(window->shell_surface, 0, FRAMERATE, 0);
 		break;
 	case TYPE_TOPLEVEL:
 		wl_shell_surface_set_toplevel(window->shell_surface);
diff --git a/src/compositor-drm.c b/src/compositor-drm.c
index de6feb4..623799f 100644
--- a/src/compositor-drm.c
+++ b/src/compositor-drm.c
@@ -161,8 +161,14 @@ drm_output_repaint(struct weston_output *output_base)
 
 	drm_output_prepare_scanout_surface(output);
 
-	wl_list_for_each_reverse(surface, &compositor->base.surface_list, link)
-		weston_surface_draw(surface, &output->base);
+	wl_list_for_each_reverse(surface, &compositor->base.surface_list, link){
+		if(!surface->fs_support.fullscreen_output) {
+			weston_surface_draw(surface, &output->base);
+		} else {
+			glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+			weston_surface_draw(surface, &output->base);
+		}
+	}
 
 	glFlush();
 
diff --git a/src/compositor.c b/src/compositor.c
index ab90ded..8e2e7e9 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -194,7 +194,8 @@ weston_surface_create(struct weston_compositor *compositor)
 	surface->image = EGL_NO_IMAGE_KHR;
 	surface->alpha = 255;
 
-	surface->fullscreen_output = NULL;
+	surface->fs_support.fullscreen_output = NULL;
+	surface->fs_support.fs_method = WESTON_SURFACE_FULLSCREEN_DEFAULT;
 	surface->buffer = NULL;
 	surface->output = NULL;
 
@@ -214,7 +215,7 @@ weston_surface_create(struct weston_compositor *compositor)
 	return surface;
 }
 
-static void
+WL_EXPORT void
 weston_surface_set_color(struct weston_surface *surface,
 		 GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
 {
diff --git a/src/compositor.h b/src/compositor.h
index 966d3f4..82d7d51 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -35,6 +35,11 @@
 
 #include "matrix.h"
 
+#define WESTON_SURFACE_FULLSCREEN_DEFAULT 0
+#define WESTON_SURFACE_FULLSCREEN_SCALE 1
+#define WESTON_SURFACE_FULLSCREEN_DRIVER 2
+#define WESTON_SURFACE_FULLSCREEN_FILL 3
+
 struct weston_transform {
 	struct weston_matrix matrix;
 	struct wl_list link;
@@ -282,6 +287,11 @@ struct weston_surface {
 
 		struct weston_transform position; /* matrix from x, y */
 	} transform;
+	struct {
+		uint32_t framerate;
+		uint32_t fs_method;
+		struct weston_output *fullscreen_output;
+	} fs_support;
 
 	/*
 	 * Which output to vsync this surface to.
@@ -290,7 +300,6 @@ struct weston_surface {
 	 */
 	struct weston_output *output;
 
-	struct weston_output *fullscreen_output;
 	struct wl_list frame_callback_list;
 
 	EGLImageKHR image;
diff --git a/src/shell.c b/src/shell.c
index 66c4f01..b77cef3 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -349,7 +349,7 @@ reset_shell_surface_type(struct shell_surface *surface)
 		weston_surface_set_position(surface->surface,
 					    surface->saved_x,
 					    surface->saved_y);
-		surface->surface->fullscreen_output = NULL;
+		surface->surface->fs_support.fullscreen_output = NULL;
 		break;
 	case SHELL_SURFACE_PANEL:
 	case SHELL_SURFACE_BACKGROUND:
@@ -417,28 +417,59 @@ get_default_output(struct weston_compositor *compositor)
 
 static void
 shell_surface_set_fullscreen(struct wl_client *client,
-			     struct wl_resource *resource)
+			     struct wl_resource *resource,
+			     uint32_t method,
+			     uint32_t framerate,
+			     struct wl_resource *output_resource)
 
 {
 	struct shell_surface *shsurf = resource->data;
 	struct weston_surface *es = shsurf->surface;
-	struct weston_output *output;
+
+	if (output_resource)
+		shsurf->output = output_resource->data;
+	else
+		shsurf->output = get_default_output(es->compositor);
 
 	if (reset_shell_surface_type(shsurf))
 		return;
 
-	/* FIXME: Fullscreen on first output */
-	/* FIXME: Handle output going away */
-	output = get_default_output(es->compositor);
-	es->output = output;
-
 	shsurf->saved_x = es->geometry.x;
 	shsurf->saved_y = es->geometry.y;
 	weston_surface_set_position(es,
-		(output->current->width - es->geometry.width) / 2,
-		(output->current->height - es->geometry.height) / 2);
-	es->fullscreen_output = output;
+		(shsurf->output->current->width - es->geometry.width) / 2,
+		(shsurf->output->current->height - es->geometry.height) / 2);
+	es->fs_support.fullscreen_output = shsurf->output;
+	es->fs_support.framerate = framerate;
+
+	wl_resource_post_event( &shsurf->resource,
+				WL_SHELL_SURFACE_CONFIGURE,
+				weston_compositor_get_time(), 0,
+				shsurf->output->current->width,
+				shsurf->output->current->height);
 	shsurf->type = SHELL_SURFACE_FULLSCREEN;
+
+	switch(method){
+		case WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT:
+			es->fs_support.fs_method = WESTON_SURFACE_FULLSCREEN_DEFAULT;
+			break;
+		case WL_SHELL_SURFACE_FULLSCREEN_METHOD_SCALE:
+			es->fs_support.fs_method = WESTON_SURFACE_FULLSCREEN_SCALE;
+			break;
+		case WL_SHELL_SURFACE_FULLSCREEN_METHOD_DRIVER:
+			es->fs_support.fs_method =
+					WESTON_SURFACE_FULLSCREEN_DRIVER;
+			break;
+		case WL_SHELL_SURFACE_FULLSCREEN_METHOD_FILL:
+			es->fs_support.fs_method = WESTON_SURFACE_FULLSCREEN_FILL;
+			break;
+		default :
+			fprintf(stderr,
+				"unknown parameter for fullscreen support, \
+				 fall back to default\n");
+			es->fs_support.fs_method = WESTON_SURFACE_FULLSCREEN_DEFAULT;
+			break;
+	}
 }
 
 static void
@@ -1266,6 +1297,35 @@ center_on_output(struct weston_surface *surface, struct weston_output *output)
 	weston_surface_set_position(surface, output->x + x, output->y + y);
 }
 
+static int
+weston_surface_set_fullscreen(struct weston_surface *surface)
+{
+	struct weston_output *output = surface->fs_support.fullscreen_output;
+	center_on_output(surface, output);
+
+	if(output->current->width == surface->geometry.width &&
+	   output->current->height == surface->geometry.height)
+	        return 0;
+
+	switch(surface->fs_support.fs_method) {
+	case WESTON_SURFACE_FULLSCREEN_DEFAULT:
+		weston_surface_damage(surface);
+		break;
+	case WESTON_SURFACE_FULLSCREEN_SCALE:
+		weston_surface_damage(surface);
+		break;
+	case WESTON_SURFACE_FULLSCREEN_DRIVER:
+		break;
+	case WESTON_SURFACE_FULLSCREEN_FILL:
+		weston_surface_damage(surface);
+		break;
+	default:
+		break;
+	}
+
+	return 0;
+}
+
 static void
 map(struct weston_shell *base,
     struct weston_surface *surface, int32_t width, int32_t height)
@@ -1300,12 +1360,12 @@ map(struct weston_shell *base,
 					    10 + random() % 400);
 		break;
 	case SHELL_SURFACE_SCREENSAVER:
-	case SHELL_SURFACE_FULLSCREEN:
-		center_on_output(surface, surface->fullscreen_output);
-		break;
 	case SHELL_SURFACE_LOCK:
 		center_on_output(surface, get_default_output(compositor));
 		break;
+	case SHELL_SURFACE_FULLSCREEN:
+		weston_surface_set_fullscreen(surface);
+		break;
 	case SHELL_SURFACE_POPUP:
 		shell_map_popup(shsurf, shsurf->popup.time);
 		break;
@@ -1357,6 +1417,8 @@ map(struct weston_shell *base,
 	if (do_configure) {
 		weston_surface_assign_output(surface);
 		weston_compositor_repick(compositor);
+		if (surface_type == SHELL_SURFACE_FULLSCREEN)
+			surface->output = shsurf->output;
 	}
 
 	switch (surface_type) {
@@ -1399,7 +1461,7 @@ configure(struct weston_shell *base, struct weston_surface *surface,
 		do_configure = !do_configure;
 		/* fall through */
 	case SHELL_SURFACE_FULLSCREEN:
-		center_on_output(surface, surface->fullscreen_output);
+		weston_surface_set_fullscreen(surface);
 		break;
 	default:
 		break;
@@ -1410,7 +1472,8 @@ configure(struct weston_shell *base, struct weston_surface *surface,
 		weston_surface_configure(surface, x, y, width, height);
 		weston_surface_assign_output(surface);
 
-		if (surface_type == SHELL_SURFACE_SCREENSAVER)
+		if (surface_type == SHELL_SURFACE_SCREENSAVER ||
+		    surface_type == SHELL_SURFACE_FULLSCREEN)
 			surface->output = shsurf->output;
 	}
 }
@@ -1518,7 +1581,7 @@ screensaver_set_surface(struct wl_client *client,
 
 	surface->type = SHELL_SURFACE_SCREENSAVER;
 
-	surface->surface->fullscreen_output = output;
+	surface->surface->fs_support.fullscreen_output = output;
 	surface->output = output;
 	wl_list_insert(shell->screensaver.surfaces.prev, &surface->link);
 }
-- 
1.7.5.4



More information about the wayland-devel mailing list