[PATCH weston 08/11] compositor: Untangle mapedness from outputs

Pekka Paalanen ppaalanen at gmail.com
Mon Jun 27 10:59:52 UTC 2016


On Thu, 23 Jun 2016 14:41:57 +0200
Giulio Camuffo <giuliocamuffo at gmail.com> wrote:

> 2016-06-18 19:15 GMT+02:00 Armin Krezović <krezovic.armin at gmail.com>:
> > Currently, weston assumes a surface/view is mapped if
> > it has an output assigned. In a zero outputs scenario,
> > this isn't really desirable.
> >
> > This patch introduces a new flag to weston_surface and
> > weston_view, which has to be set manually to indicate
> > that a surface/view is mapped.
> >
> > Signed-off-by: Armin Krezović <krezovic.armin at gmail.com>
> > ---
> >  src/compositor.c  | 29 ++++++++++-------------------
> >  src/compositor.h  |  4 ++++
> >  src/data-device.c |  2 ++
> >  src/input.c       |  2 ++
> >  4 files changed, 18 insertions(+), 19 deletions(-)
> >
> > diff --git a/src/compositor.c b/src/compositor.c
> > index d246046..b25c671 100644
> > --- a/src/compositor.c
> > +++ b/src/compositor.c
> > @@ -1549,19 +1549,13 @@ weston_view_set_mask_infinite(struct weston_view *view)
> >  WL_EXPORT bool
> >  weston_view_is_mapped(struct weston_view *view)
> >  {
> > -       if (view->output)
> > -               return true;
> > -       else
> > -               return false;
> > +       return view->is_mapped;
> >  }
> >
> >  WL_EXPORT bool
> >  weston_surface_is_mapped(struct weston_surface *surface)
> >  {
> > -       if (surface->output)
> > -               return true;
> > -       else
> > -               return false;
> > +       return surface->is_mapped;
> >  }  
> 
> I don't understand what this function means. It's here from before the
> surface/view split happened, but right now i am not sure what the
> purpose of it is, and i would argue it shuold go. How can a surface be
> mapped if no views of it are mapped? Maybe you have a different
> definition of "mapped" than me, in which case i would like to see it
> as part of the documentation for these functions.
> For the use-case Pekka mentioned, remembering if a surface was mapped
> earlier and so retaining information like the position, all that can
> be done by having custom logic in the shell_surface, which knows all
> it needs to know about the surface and the views. We don't need the
> surface mappedness for that.

It can be done, yes, for shell surfaces.

You can check all the calls to weston_surface_is_mapped() with 'git
grep -p weston_surface_is_mapped'. Ignoring all shells, we are left
with the following notable places:

weston_view_unmap():

	Skips checking and fixing input device foci if the surface
	remains mapped after the view is unmapped. This could be
	regarded as a bug though, at least for the foci that are
	tracked by the view rather than the surface.


weston_surface_attach(), called from weston_surface_commit_state():

	Avoids a redundant call to weston_surface_unmap().


view_list_add_subsurface_view(), part of
weston_compositor_build_view_list() machinery:

	Only if surface is mapped, creates a new view for it
	dynamically, as necessary, or re-uses a stashed view for it.
	This is crucial to be done only for mapped surfaces, because
	there are conditions that prevent a sub-surface from being
	mapped even if it has both the role and the content. This can
	also be the first time a view is being created, so there may
	not be a view to check for. Furthermore, sub-surface views are
	to be created for *each* parent surface view. If your shell
	makes multiple views for the parent, the sub-surfaces will come
	along automatically.

There are also other places, but those are either avoiding redundant
calls to weston_surface_unmap() or protecting the layer setup, i.e.
mapping.

You're right, weston_surface_is_mapped() looks like it could go. Each
shell needs to track it's own surface mappedness state, struct
weston_subsurface needs to add that too, weston_surface_unmap() can
probably cope with redundant calls, and weston_view_unmap()'s focus
handling would need fixing anyway.

Changing weston_surface_is_mapped() to look at view assignments to
layerr would not work for sub-surfaces.

IOW, it's not in scope for Armin's project, I don't think.

The immediate goal is to get outputs separated mappedness, so that
Armin can continue his project on outputs.

> 
> >
> >  static void
> > @@ -1738,6 +1732,7 @@ weston_view_unmap(struct weston_view *view)
> >         weston_view_damage_below(view);
> >         view->output = NULL;
> >         view->plane = NULL;
> > +       view->is_mapped = false;
> >         weston_layer_entry_remove(&view->layer_link);
> >         wl_list_remove(&view->link);
> >         wl_list_init(&view->link);
> > @@ -1769,6 +1764,7 @@ weston_surface_unmap(struct weston_surface *surface)
> >
> >         wl_list_for_each(view, &surface->views, surface_link)
> >                 weston_view_unmap(view);
> > +       surface->is_mapped = false;
> >         surface->output = NULL;
> >  }
> >
> > @@ -2131,6 +2127,7 @@ view_list_add_subsurface_view(struct weston_compositor *compositor,
> >
> >         view->parent_view = parent;
> >         weston_view_update_transform(view);
> > +       view->is_mapped = true;
> >
> >         if (wl_list_empty(&sub->surface->subsurface_list)) {
> >                 wl_list_insert(compositor->view_list.prev, &view->link);
> > @@ -2152,6 +2149,7 @@ view_list_add(struct weston_compositor *compositor,
> >         struct weston_subsurface *sub;
> >
> >         weston_view_update_transform(view);
> > +       view->is_mapped = true;  
> 
> If you always set is_mapped to true here, what is the difference to
> just checking if the view is in the view_list?

Subsurfaces get *all* their views dynamically created and destroyed as
needed, so determining whether a sub-surface is mapped yet (should be
drawn or not, e.g. has the parent seen a commit yet etc.) there may not
be views to check.

Did you know anything about the sloppy focus handling with
weston_surface_unmap() and weston_view_unmap(), is it intentional or an
oversight? Does it look equally wrong to you as it does to me?

Do you think dropping "mappedness inference" from
weston_surface_assign_output() path already in this patch causes
problems, or should we just replicate the is_mapped inference logic
from the output assignment logic?


Thanks,
pq
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 811 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/wayland-devel/attachments/20160627/c347bce6/attachment.sig>


More information about the wayland-devel mailing list