On Fri,  3 Feb 2017 16:10:39 +0100
Emilio Pozuelo Monfort <poch...@gmail.com> wrote:

> We were calling weston_surface::committed on surfaces with
> no buffer attached. Stop doing that, since surface::committed
> will map the surfaces and put them in a visible layer. That may
> not be a problem for a single surface as it wouldn't be visible
> anyway because it's got no contents, but it is a problem if the
> surface has subsurfaces.
> 
> This fixes the subsurface_mapped test, so mark it as expected
> to succeed.
> 
> https://bugs.freedesktop.org/show_bug.cgi?id=94735
> 
> Signed-off-by: Emilio Pozuelo Monfort <emilio.pozu...@collabora.co.uk>
> ---
>  libweston/compositor.c       | 10 +++++++++-
>  tests/subsurface-shot-test.c |  2 +-
>  2 files changed, 10 insertions(+), 2 deletions(-)
> 
> diff --git a/libweston/compositor.c b/libweston/compositor.c
> index 81392063..8a018897 100644
> --- a/libweston/compositor.c
> +++ b/libweston/compositor.c
> @@ -1589,6 +1589,12 @@ weston_surface_is_mapped(struct weston_surface 
> *surface)
>       return surface->is_mapped;
>  }
>  
> +static bool
> +weston_surface_has_content(struct weston_surface *surface)
> +{
> +     return surface->width > 0 && surface->height > 0;
> +}
> +
>  static void
>  surface_set_size(struct weston_surface *surface, int32_t width, int32_t 
> height)
>  {
> @@ -2928,7 +2934,9 @@ weston_surface_commit_state(struct weston_surface 
> *surface,
>  
>       if (state->newly_attached || state->buffer_viewport.changed) {
>               weston_surface_update_size(surface);
> -             if (surface->committed)
> +             if (surface->committed &&
> +                 (state->newly_attached &&
> +                  weston_surface_has_content(surface)))
>                       surface->committed(surface, state->sx, state->sy);

Hi,

I think this isn't right. The shells need to know when a surface
unmaps or changes dimensions, and they get that via the ->committed
hook (currently less well named, as ->configure was more descriptive,
but I think in the long term we'd like to eliminate the two hooks and
have just one called on every commit regardless of state - maybe have
the hook call weston_surface_apply_state so it can inspect
weston_surface state before and after).

If the viewport changed, it must lead to a call to ->committed, with or
without an attach.

Another thing is that weston_surface_update_size() updates the width,
height you use in weston_surface_has_content(). This means that a
surface first having content, receiving attach NULL + commit, will not
call ->committed.

When I was last thinking about the committed() hook, I came up with:
https://docs.google.com/spreadsheets/d/1b5azX4_gq9ZlYe4Y6UyHnHF8Wsiqnf1uHt9hR4whni4/edit#gid=0
but that just proves how complicated that design is, while not really
saving much in the committed() implementations.

Given my comments to the previous patch (the test), I think the fix
might be completely elsewhere.


Thanks,
pq

>       }
>  
> diff --git a/tests/subsurface-shot-test.c b/tests/subsurface-shot-test.c
> index e7da1e0e..275d4726 100644
> --- a/tests/subsurface-shot-test.c
> +++ b/tests/subsurface-shot-test.c
> @@ -261,7 +261,7 @@ TEST(subsurface_z_order)
>                       buffer_destroy(bufs[i]);
>  }
>  
> -FAIL_TEST(subsurface_mapped)
> +TEST(subsurface_mapped)
>  {
>       const char *test_name = get_test_name();
>       struct client *client;

Attachment: pgpvSML_E2MAm.pgp
Description: OpenPGP digital signature

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

Reply via email to