[weston PATCH v9 1/2] add the set_maximised implementation

juan.j.zhao at linux.intel.com juan.j.zhao at linux.intel.com
Wed Feb 8 18:09:30 PST 2012


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

---
 src/shell.c |   89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 88 insertions(+), 1 deletions(-)

diff --git a/src/shell.c b/src/shell.c
index 53b192c..229a027 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -81,6 +81,7 @@ enum shell_surface_type {
 	SHELL_SURFACE_TOPLEVEL,
 	SHELL_SURFACE_TRANSIENT,
 	SHELL_SURFACE_FULLSCREEN,
+	SHELL_SURFACE_MAXIMISED,
 	SHELL_SURFACE_POPUP
 };
 
@@ -351,6 +352,13 @@ reset_shell_surface_type(struct shell_surface *surface)
 		surface->surface->geometry.dirty = 1;
 		surface->surface->fullscreen_output = NULL;
 		break;
+	case SHELL_SURFACE_MAXIMISED:
+		weston_surface_configure(surface->surface,
+					 surface->saved_x,
+					 surface->saved_y,
+					 surface->surface->geometry.width,
+					 surface->surface->geometry.height);
+		break;
 	case SHELL_SURFACE_PANEL:
 	case SHELL_SURFACE_BACKGROUND:
 		wl_list_remove(&surface->link);
@@ -419,10 +427,74 @@ get_default_output(struct weston_compositor *compositor)
 			    struct weston_output, link);
 }
 
+static struct wl_shell *
+shell_surface_get_shell(struct shell_surface *shsurf)
+{
+	struct weston_surface *es = shsurf->surface;
+	struct weston_shell *shell=es->compositor->shell;
+
+	return (struct wl_shell *)container_of(shell, struct wl_shell, shell);
+}
+
+static int
+get_output_panel_height(struct wl_shell *wlshell,struct weston_output *output)
+{
+	struct shell_surface *priv;
+	int panel_height = 0;
+
+	if(!output)
+		return 0;
+
+	wl_list_for_each(priv, &wlshell->panels, link) {
+		if (priv->output == output) {
+			panel_height = priv->surface->geometry.height;
+			break;
+		}
+	}
+	return panel_height;
+}
+
+static void
+shell_surface_set_maximised(struct wl_client *client,
+			    struct wl_resource *resource,
+			    struct wl_resource *output_resource )
+{
+	struct shell_surface *shsurf = resource->data;
+	struct weston_surface *es = shsurf->surface;
+	struct weston_output *output = output_resource?output_resource->data:NULL;
+	struct wl_shell *wlshell = NULL;
+	uint32_t edges = 0, panel_height = 0;
+
+	/* get the default output, if the client set it as NULL
+	   check whether the ouput is available */
+	es->output = output?output:get_default_output(es->compositor);
+
+	if(!es->output) {
+		fprintf(stderr, "Please provide correct output, \
+				 or setting that output to NULL");
+		return;
+	}
+
+	if (reset_shell_surface_type(shsurf))
+		return;
+
+	shsurf->saved_x = es->geometry.x;
+	shsurf->saved_y = es->geometry.y;
+
+	wlshell = shell_surface_get_shell(shsurf);
+	panel_height = get_output_panel_height(wlshell, es->output);
+	edges = WL_SHELL_SURFACE_RESIZE_TOP|WL_SHELL_SURFACE_RESIZE_LEFT;
+	wl_resource_post_event(&shsurf->resource,
+			       WL_SHELL_SURFACE_CONFIGURE,
+			       weston_compositor_get_time(), edges,
+			       es->output->current->width, es->output->current->height-panel_height);
+
+	shsurf->type = SHELL_SURFACE_MAXIMISED;
+}
+
 static void
 shell_surface_set_fullscreen(struct wl_client *client,
 			     struct wl_resource *resource)
-
 {
 	struct shell_surface *shsurf = resource->data;
 	struct weston_surface *es = shsurf->surface;
@@ -572,6 +644,7 @@ static const struct wl_shell_surface_interface shell_surface_implementation = {
 	shell_surface_set_toplevel,
 	shell_surface_set_transient,
 	shell_surface_set_fullscreen,
+	shell_surface_set_maximised,
 	shell_surface_set_popup
 };
 
@@ -1292,6 +1365,7 @@ map(struct weston_shell *base,
 	struct shell_surface *shsurf;
 	enum shell_surface_type surface_type = SHELL_SURFACE_NONE;
 	int do_configure;
+	int panel_height = 0;
 
 	shsurf = get_shell_surface(surface);
 	if (shsurf)
@@ -1320,6 +1394,13 @@ map(struct weston_shell *base,
 	case SHELL_SURFACE_FULLSCREEN:
 		center_on_output(surface, surface->fullscreen_output);
 		break;
+	case SHELL_SURFACE_MAXIMISED:
+		/*use surface configure to set the geometry*/
+		panel_height = get_output_panel_height(shell,surface->output);
+		weston_surface_configure(surface, surface->output->x,
+					 surface->output->y + panel_height,
+					 width, height);
+		break;
 	case SHELL_SURFACE_LOCK:
 		center_on_output(surface, get_default_output(compositor));
 		break;
@@ -1396,6 +1477,7 @@ map(struct weston_shell *base,
 	case SHELL_SURFACE_TOPLEVEL:
 	case SHELL_SURFACE_TRANSIENT:
 	case SHELL_SURFACE_FULLSCREEN:
+	case SHELL_SURFACE_MAXIMISED:
 		if (!shell->locked)
 			activate(base, surface,
 				 (struct weston_input_device *)
@@ -1434,6 +1516,11 @@ configure(struct weston_shell *base, struct weston_surface *surface,
 	case SHELL_SURFACE_FULLSCREEN:
 		center_on_output(surface, surface->fullscreen_output);
 		break;
+	case SHELL_SURFACE_MAXIMISED:
+		/*setting x, y and using configure to change that geometry*/
+		x = surface->output->x;
+		y = surface->output->y+get_output_panel_height(shell,surface->output);
+		break;
 	default:
 		break;
 	}
-- 
1.7.5.4



More information about the wayland-devel mailing list