[weston PATCH v8 1/2] add the set_maximised implementation
juan.j.zhao at linux.intel.com
juan.j.zhao at linux.intel.com
Tue Feb 7 20:02:19 PST 2012
From: Juan Zhao <juan.j.zhao at linux.intel.com>
---
src/shell.c | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 100 insertions(+), 0 deletions(-)
diff --git a/src/shell.c b/src/shell.c
index 53b192c..ae66d3d 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
};
@@ -366,6 +367,7 @@ reset_shell_surface_type(struct shell_surface *surface)
case SHELL_SURFACE_TOPLEVEL:
case SHELL_SURFACE_TRANSIENT:
case SHELL_SURFACE_POPUP:
+ case SHELL_SURFACE_MAXIMISED:
break;
}
@@ -419,6 +421,91 @@ 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 struct weston_output *
+get_available_output(struct weston_output *output,
+ struct weston_compositor *compositor)
+{
+ struct weston_output *privo = NULL;
+ struct weston_output *reto = NULL;
+
+ if(!output)
+ reto = get_default_output(compositor);
+
+ if(!reto) {
+ wl_list_for_each(privo, &compositor->output_list, link){
+ if ( privo == output ) {
+ reto = output;
+ break;
+ }
+ };
+ }
+
+ return reto;
+}
+
+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, if no, give a message
+ and return */
+ es->output = get_available_output(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;
+
+ 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)
@@ -572,6 +659,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
};
@@ -1320,6 +1408,12 @@ 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*/
+ weston_surface_configure(surface, 0,
+ get_output_panel_height(shell,surface->output),
+ width, height);
+ break;
case SHELL_SURFACE_LOCK:
center_on_output(surface, get_default_output(compositor));
break;
@@ -1396,6 +1490,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 +1529,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 = 0;
+ y = get_output_panel_height(shell,surface->output);
+ break;
default:
break;
}
--
1.7.5.4
More information about the wayland-devel
mailing list