[weston PATCH v6 1/2] add implementation for set_maximised
Juan Zhao
juan.j.zhao at linux.intel.com
Sun Feb 5 19:21:06 PST 2012
On Fri, 2012-02-03 at 11:08 +0200, Pekka Paalanen wrote:
> On Fri, 3 Feb 2012 16:16:17 +0800
> juan.j.zhao at linux.intel.com wrote:
>
> > From: Juan Zhao <juan.j.zhao at linux.intel.com>
> >
> > ---
> > src/shell.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
> > 1 files changed, 53 insertions(+), 0 deletions(-)
> >
> > diff --git a/src/shell.c b/src/shell.c
> > index d15c8e2..48f1ceb 100644
> > --- a/src/shell.c
> > +++ b/src/shell.c
> > @@ -417,6 +417,58 @@ get_default_output(struct weston_compositor *compositor)
> > return container_of(compositor->output_list.next,
> > 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 void
> > +shell_surface_set_maximised(struct wl_client *client,
> > + struct wl_resource *resource)
>
> Ah, I forgot in the reply to the protocol bits. Krh said something
> about wanting the output as a parameter here, explicitly set by the
> client. There was some scheme about letting clients know which output
> currently has their surfaces...
That output parameter is used for fullscreen. For example, when
demonstrate some presentation.
Setting maximize should go with the output the current surface is on.
>
> > +{
> > + struct shell_surface *shsurf = resource->data;
> > + struct weston_surface *es = shsurf->surface;
> > + struct weston_output *output = NULL;
> > + struct wl_shell *wlshell = NULL;
> > + uint32_t edges = 0, panel_height = 0;
> > + struct shell_surface *priv;
> > +
> > + if (reset_shell_surface_type(shsurf))
> > + return;
> > +
> > + /* FIXME: set maximised 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;
> > +
> > + wlshell = shell_surface_get_shell(shsurf);
> > + wl_list_for_each(priv, &wlshell->panels, link) {
> > + if (priv->output == es->output) {
> > + panel_height = priv->surface->geometry.height;
> > + break;
> > + }
> > + }
> > +
> > + es->geometry.x = 0;
> > + es->geometry.y = panel_height;
>
> If you change anything in geometry, you must set geometry.dirty = 1.
>
> But, I don't think we can change it here directly. This change will
> affect the very next redraw, which might be before the client has
> reacted to the configure event, and we end up rendering intermediate
> state (position set, but old buffer).
>
> Maybe all you need to do here is to send the event and set a flag in
> struct shell_surface, and then carry out the actual procedure during
> shell->map() and shell->configure() time.
>
> Hmm, the window type could be all the flag we need...
Yeah, looks like we need one type "SHELL_SURFACE_MAXIMIZED" here.
>
> > + edges = WL_SHELL_SURFACE_RESIZE_TOP|WL_SHELL_SURFACE_RESIZE_LEFT;
> > +
> > + fprintf(stderr, "configure: width=%d, height=%d",
> > + output->current->width,
> > + output->current->height-panel_height);
>
> Should drop this printf, we see the same info in the protocol dump
> anyway.
no problem
Thanks,
Juan
>
> > + wl_resource_post_event(&shsurf->resource,
> > + WL_SHELL_SURFACE_CONFIGURE,
> > + weston_compositor_get_time(), edges,
> > + output->current->width, output->current->height-panel_height);
> > + weston_surface_damage(es);
> > +}
> >
> > static void
> > shell_surface_set_fullscreen(struct wl_client *client,
> > @@ -557,6 +609,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
> > };
> >
>
> Thanks,
> pq
More information about the wayland-devel
mailing list