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

Giulio Camuffo giuliocamuffo at gmail.com
Tue Oct 14 02:45:10 PDT 2014


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.


--
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


More information about the wayland-devel mailing list