[PATCH weston 1/2] desktop-shell: fix output removal for background/panel

Pekka Paalanen ppaalanen at gmail.com
Wed Jun 27 08:49:07 UTC 2018


On Tue, 26 Jun 2018 09:28:42 +0000
Marius-cristian Vlad <marius-cristian.vlad at nxp.com> wrote:

> On Thu, 2018-06-21 at 15:53 +0300, Pekka Paalanen wrote:
> > From: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
> > 
> > When the compositor has multiple outputs (not clones) and one of them
> > is
> > removed, the ones remaining to the right will be moved to close the
> > gap.
> > Because reflowing the remaining outputs happens before removing the
> > wl_output global, we get the new output x,y before the removal. This
> > causes us to consider the remaining output immediately to the right
> > of
> > the removed output to be a clone of the removed output whose x,y
> > don't
> > get updated. That will then hit the two assertions this patch
> > removes.
> > 
> > The reason the assertions were not actually hit is because of a
> > compositor bug which moved the remaining outputs in the wrong
> > direction.
> > The next patch will fix the reflow, so we need this patch first to
> > avoid
> > the asserts.
> > 
> > Remove the assertions and hand over the background and panel if the
> > "clone" does not already have them. If the clone already has them, we
> > destroy the unnecessary background and panel.
> > 
> > Signed-off-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
> > ---
> >  clients/desktop-shell.c | 37 ++++++++++++++++++++++++-------------
> >  1 file changed, 24 insertions(+), 13 deletions(-)
> > 
> > diff --git a/clients/desktop-shell.c b/clients/desktop-shell.c
> > index 6d19d029..fcc0b657 100644
> > --- a/clients/desktop-shell.c
> > +++ b/clients/desktop-shell.c
> > @@ -1337,19 +1337,30 @@ output_remove(struct desktop *desktop, struct
> > output *output)
> >  	}
> >  
> >  	if (rep) {
> > -		/* If found, hand over the background and panel so
> > they don't
> > -		 * get destroyed. */
> > -		assert(!rep->background);
> > -		assert(!rep->panel);
> > -
> > -		rep->background = output->background;
> > -		output->background = NULL;
> > -		rep->background->owner = rep;
> > -
> > -		rep->panel = output->panel;
> > -		output->panel = NULL;
> > -		if (rep->panel)
> > -			rep->panel->owner = rep;
> > +		/* If found and it does not already have a
> > background or panel,
> > +		 * hand over the background and panel so they don't
> > get
> > +		 * destroyed.
> > +		 *
> > +		 * We never create multiple backgrounds or panels
> > for clones,
> > +		 * but if the compositor moves outputs, a pair of
> > wl_outputs
> > +		 * might become "clones". This may happen
> > temporarily when
> > +		 * an output is about to be removed and the rest are
> > reflowed.
> > +		 * In this case it is correct to let the
> > background/panel be
> > +		 * destroyed.
> > +		 */
> > +
> > +		if (!rep->background) {
> > +			rep->background = output->background;
> > +			output->background = NULL;
> > +			rep->background->owner = rep;
> > +		}
> > +
> > +		if (!rep->panel) {
> > +			rep->panel = output->panel;
> > +			output->panel = NULL;
> > +			if (rep->panel)  
> Guess copy-pasta from above, but is the test necessary? 

A background is mandatory, but a panel is optional: output->panel can
be NULL. Therefore the test is not needed for the background but it is
needed for the panel. This is the same as in the old code.

> 
> Reviewed-by: Marius Vlad <marius-cristian.vlad at nxp.com>

Thanks,
pq


> 
> > +				rep->panel->owner = rep;
> > +		}
> >  	}
> >  
> >  	output_destroy(output)  

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


More information about the wayland-devel mailing list