[PATCH weston v2] ivi-shell: bugfix, an ivi_surface is not removed from list of ivi_layer when the ivi_surface is removed from the compositor.

Tanibata, Nobuhiko (ADITJ/SWG) ntanibata at jp.adit-jv.com
Sun Aug 16 22:51:12 PDT 2015



> -----Original Message-----
> From: wayland-devel
> [mailto:wayland-devel-bounces at lists.freedesktop.org] On Behalf Of Pekka
> Paalanen
> Sent: Thursday, August 13, 2015 10:21 PM
> To: Nobuhiko Tanibata
> Cc: securitycheck at denso.co.jp; wayland-devel at lists.freedesktop.org
> Subject: Re: [PATCH weston v2] ivi-shell: bugfix, an ivi_surface is not
> removed from list of ivi_layer when the ivi_surface is removed from the
> compositor.
> 
> On Fri,  7 Aug 2015 09:47:02 +0900
> Nobuhiko Tanibata <nobuhiko_tanibata at xddp.denso.co.jp> wrote:
> 
> > The api, ivi_layout_layer_remove_surface, shall remove a ivi_surface
> > from a list of ivi_layer. In previous code, there is no trigger to
> > refresh order of list, removing the ivi_surface, in commit_layer_list.
> >
> > To fix this bug, set a mask; IVI_NOTIFICATION_REMOVE in order to
> > trigger refresh list of surface in commit_layer_list.
> >
> > In commit_layer_list, this patch also removes duplicated code in two
> > conditions for IVI_NOTIFICATION_ADD/REMOVE.
> >
> > Signed-off-by: Nobuhiko Tanibata <nobuhiko_tanibata at xddp.denso.co.jp>
> > ---
> > v2 changes:
> >  - fix 8 spaces to tab.
> >  - clean up duplicate code in commit_layer_list.
> >  - improve commit message.
> >
> >  ivi-shell/ivi-layout.c | 28 +++++++++-------------------
> >  1 file changed, 9 insertions(+), 19 deletions(-)
> >
> > diff --git a/ivi-shell/ivi-layout.c b/ivi-shell/ivi-layout.c index
> > 2974bb7..1b45003 100644
> > --- a/ivi-shell/ivi-layout.c
> > +++ b/ivi-shell/ivi-layout.c
> > @@ -812,25 +812,7 @@ commit_layer_list(struct ivi_layout *layout)
> >  		if (!(ivilayer->event_mask &
> >  		      (IVI_NOTIFICATION_ADD |
> IVI_NOTIFICATION_REMOVE)) ) {
> >  			continue;
> 
> Hi Tanibata-san,
> 
> using 'continue', there is no need to have an else-branch. This would save
> one level of indent in the remaining code.
> 
> > -		}
> > -
> > -		if (ivilayer->event_mask & IVI_NOTIFICATION_REMOVE) {
> > -			wl_list_for_each_safe(ivisurf, next,
> > -				&ivilayer->order.surface_list,
> order.link) {
> > -
> 	remove_ordersurface_from_layer(ivisurf);
> > -
> > -				if
> (!wl_list_empty(&ivisurf->order.link)) {
> > -
> 	wl_list_remove(&ivisurf->order.link);
> > -				}
> > -
> > -				wl_list_init(&ivisurf->order.link);
> > -				ivisurf->event_mask |=
> IVI_NOTIFICATION_REMOVE;
> 
> You are removing this setting of the flag IVI_NOTIFICATION_REMOVE, but in
> the code that remains I do not see that happening anymore in
> commit_layer_list().
> 
> However, I see it being set by ivi_layout_layer_remove_surface(). At which
> time should the flag be set? Should the ADD flag not work the same way?
> 
> Would it be essential to flag ivi-surfaces that get removed from
> ivilayer->order.surface_list with IVI_NOTIFICATION_REMOVE, and surfaces
> that are added to flag with IVI_NOTIFICATION_ADD, and all remaining surfaces
> even if they are reordered not be flagged at all?
> 
> Or is it intended that all surfaces that are originally in the
> ivilayer->order.surface_list are flagged as REMOVE, and all surfaces in
> the pending list are flagged as ADD? That would imply that surfaces that
> were and still remain in the order list are flagged as both REMOVE and ADD.
> 
> > -			}
> > -
> > -			wl_list_init(&ivilayer->order.surface_list);
> > -		}
> > -
> > -		if (ivilayer->event_mask & IVI_NOTIFICATION_ADD) {
> > +		} else {
> >  			wl_list_for_each_safe(ivisurf, next,
> >
> &ivilayer->order.surface_list, order.link) {
> >
> 	remove_ordersurface_from_layer(ivisurf);
> > @@ -843,6 +825,13 @@ commit_layer_list(struct ivi_layout *layout)
> >  			}
> >
> >  			wl_list_init(&ivilayer->order.surface_list);
> > +
> > +			/**
> > +			 * Following ivilayer->pending.surface_list must
> be maintained by
> > +			 * a function who will set these masks. Order of
> surfaces in a
> > +			 * layer is restructured here. if there is no
> surface in
> > +			 * surface_list, the following code is skipped.
> > +			 */
> >  			wl_list_for_each(ivisurf,
> &ivilayer->pending.surface_list,
> >  					 pending.link) {
> >
> 	if(!wl_list_empty(&ivisurf->order.link)){
> > @@ -2565,6 +2554,7 @@ ivi_layout_layer_remove_surface(struct
> ivi_layout_layer *ivilayer,
> >  	}
> >
> >  	remsurf->event_mask |= IVI_NOTIFICATION_REMOVE;
> > +	ivilayer->event_mask |= IVI_NOTIFICATION_REMOVE;
> >  }
> >
> >  static int32_t
> 
> All the flagging issues aside, I see what this patch does.
> 
> Previously removing a ivi-surface didn't work at all. With this patch,
> whether ivi-surfaces are added or removed from the ivi-layer, the code will
> always completely reconstruct the ivilayer->order.surface_list from the
> pending list. In that sense:
> 
> Reviewed-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
> 
> Do you want me to push this patch as is?
[ntanibata] Hi Pekka-san,
Thank you for review. No, I don't. I shall reconsider name of masks: IVI_NOTIFICATION_REMOVE/ADD.

BR,
Nobuhiko Tanibata
> 
> 
> Thanks,
> pq


More information about the wayland-devel mailing list