From: Juan Zhao <juan.j.z...@linux.intel.com> --- src/shell.c | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 94 insertions(+), 5 deletions(-)
diff --git a/src/shell.c b/src/shell.c index 53b192c..d7c2476 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 }; @@ -341,6 +342,13 @@ shell_surface_resize(struct wl_client *client, struct wl_resource *resource, wl_resource_post_no_memory(resource); } +static struct weston_output * +get_default_output(struct weston_compositor *compositor) +{ + return container_of(compositor->output_list.next, + struct weston_output, link); +} + static int reset_shell_surface_type(struct shell_surface *surface) { @@ -351,6 +359,14 @@ reset_shell_surface_type(struct shell_surface *surface) surface->surface->geometry.dirty = 1; surface->surface->fullscreen_output = NULL; break; + case SHELL_SURFACE_MAXIMISED: + surface->output = get_default_output(surface->surface->compositor); + 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); @@ -412,17 +428,71 @@ shell_surface_set_transient(struct wl_client *client, shsurf->type = SHELL_SURFACE_TRANSIENT; } -static struct weston_output * -get_default_output(struct weston_compositor *compositor) +static struct wl_shell * +shell_surface_get_shell(struct shell_surface *shsurf) { - return container_of(compositor->output_list.next, - struct weston_output, link); + 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 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 (output_resource) + shsurf->output = output_resource->data; + else + shsurf->output = get_default_output(es->compositor); + + 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 +642,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 +1363,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 +1392,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; @@ -1390,12 +1469,15 @@ map(struct weston_shell *base, surface->geometry.y, width, height); weston_compositor_repick(compositor); + if (surface_type == SHELL_SURFACE_MAXIMISED) + surface->output = shsurf->output; } switch (surface_type) { 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; } @@ -1449,6 +1536,8 @@ configure(struct weston_shell *base, struct weston_surface *surface, if (surface_type == SHELL_SURFACE_SCREENSAVER) surface->output = shsurf->output; + else if (surface_type == SHELL_SURFACE_MAXIMISED) + surface->output = shsurf->output; } } -- 1.7.5.4 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel