On Sun, 12 Oct 2014 18:57:31 -0700
"Jasper St. Pierre" <jstpie...@mecheye.net> wrote:

> 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 is good, but I'd like to reiterate on what this actually
fixes.

AFAICS, neither toytoolkit nor smoke ever actually does a
wl_surface(attach, NULL, x, y). If you do a WAYLAND_DEBUG=client dump
from 'smoke' without this patch, there is not a single attach with a
null buffer.

However, there is a sequence in the beginning:

[1995969.194]  -> wl_compositor@3.create_surface(new id wl_surface@14)
[1995969.214]  -> xdg_shell@11.get_xdg_surface(new id xdg_surface@15, 
wl_surface@14)
[1995969.227]  -> xdg_surface@15.set_title("smoke")
[1995969.254]  -> wl_compositor@3.create_region(new id wl_region@16)
[1995969.523]  -> wl_shm@6.create_pool(new id wl_shm_pool@17, fd 10, 160000)
[1995969.546]  -> wl_shm_pool@17.create_buffer(new id wl_buffer@18, 0, 200, 
200, 800, 0)
[1995969.571]  -> wl_surface@14.frame(new id wl_callback@19)
[1995985.307]  -> wl_surface@14.damage(0, 0, 200, 200)
[1995985.339]  -> wl_surface@14.frame(new id wl_callback@20)
[1995985.348]  -> wl_surface@14.commit()

There is a commit of damage without ever attaching a buffer. That is
quite useless indeed, especially if asking for frame events, since the
surface won't be mapped without content, and so the frame callback
won't be replied until a buffer actually is attached and committed.

xdg_surface specification should probably say something about
committing surfaces without content, and what removing content from a
wl_surface does in the context of xdg_shell.

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

Yup, pushed. This patch fixes the strange init sequence.


Thanks,
pq


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

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to