[PATCH weston] smoke: Don't commit an xdg_surface with a NULL buffer

Jasper St. Pierre jstpierre at mecheye.net
Thu Oct 16 20:03:57 PDT 2014


On Tue, Oct 14, 2014 at 2:45 AM, Giulio Camuffo <giuliocamuffo at gmail.com>
wrote:

> 2014-10-13 4:57 GMT+03:00 Jasper St. Pierre <jstpierre at mecheye.net>:
> > Committing to an xdg_surface with a NULL buffer is currently illegal in
> > the mutter implementation, so this simply causes the client to error and
> > exit.
>
> The patch looks good to me.
> However, this leaves me wondering how does a client hide a surface.
> Does it have to destroy the xdg_surface? I'd expect a compositor to
> show a window at the same position it was when hidden, but destroying
> the xdg_surface loses all the state
>

When combined with map / unmap animations, I think we have to decide that
"show" means "the window is presented in a compositor-chosen place". As
such, I chose to make attaching a NULL buffer against the rules.

Are there any use cases for hiding a window while keeping it in the same
place? We couldn't think of any on IRC.


> --
> Giulio
>
> >
> > It seems the reason the client did this was so it could add its own
> > frame callback, but toytoolkit actually provides accurate everything we
> > need. Just use its functions instead to get the time and schedule a
> > redraw.
> > ---
> >  clients/smoke.c | 24 ++----------------------
> >  1 file changed, 2 insertions(+), 22 deletions(-)
> >
> > diff --git a/clients/smoke.c b/clients/smoke.c
> > index 65b6e03..7f0d5e5 100644
> > --- a/clients/smoke.c
> > +++ b/clients/smoke.c
> > @@ -39,7 +39,6 @@ struct smoke {
> >         struct widget *widget;
> >         int width, height;
> >         int current;
> > -       uint32_t time;
> >         struct { float *d, *u, *v; } b[2];
> >  };
> >
> > @@ -171,27 +170,10 @@ static void render(struct smoke *smoke,
> cairo_surface_t *surface)
> >  }
> >
> >  static void
> > -frame_callback(void *data, struct wl_callback *callback, uint32_t time)
> > -{
> > -       struct smoke *smoke = data;
> > -
> > -       window_schedule_redraw(smoke->window);
> > -       smoke->time = time;
> > -
> > -       if (callback)
> > -               wl_callback_destroy(callback);
> > -}
> > -
> > -static const struct wl_callback_listener listener = {
> > -       frame_callback,
> > -};
> > -
> > -static void
> >  redraw_handler(struct widget *widget, void *data)
> >  {
> >         struct smoke *smoke = data;
> > -       uint32_t time = smoke->time;
> > -       struct wl_callback *callback;
> > +       uint32_t time = widget_get_last_time(smoke->widget);
> >         cairo_surface_t *surface;
> >
> >         diffuse(smoke, time / 30, smoke->b[0].u, smoke->b[1].u);
> > @@ -222,9 +204,7 @@ redraw_handler(struct widget *widget, void *data)
> >
> >         cairo_surface_destroy(surface);
> >
> > -       callback =
> wl_surface_frame(window_get_wl_surface(smoke->window));
> > -       wl_callback_add_listener(callback, &listener, smoke);
> > -       wl_surface_commit(window_get_wl_surface(smoke->window));
> > +       widget_schedule_redraw(smoke->widget);
> >  }
> >
> >  static void
> > --
> > 2.1.0
> >
> > _______________________________________________
> > wayland-devel mailing list
> > wayland-devel at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/wayland-devel
>



-- 
  Jasper
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/wayland-devel/attachments/20141016/fdd5784c/attachment.html>


More information about the wayland-devel mailing list