[5/5] ivi-shell: introduce get_weston_view

Submitted by Ucan, Emre (ADITG/ESB) on Aug. 28, 2015, 12:59 p.m.

Details

Message ID AF835182DB40564F805CF05008AAFCA1A0EF9B@HI2EXCH01.adit-jv.com
State Accepted
Commit 64635ee69988b0da28bd8beed282c432eecdc4bc
Delegated to: Nobuhiko Tanibata
Headers show

Not browsing as part of any series.

Commit Message

Ucan, Emre (ADITG/ESB) Aug. 28, 2015, 12:59 p.m.
The internal API "get_weston_view" is introduced, which returns the weston_view
of the given ivi_layout_surface. The API returns a NULL pointer, if the ivi_layout_surface
does not have any weston_view.

The weston_view is required in many places of ivi-shell implementation.
Therefore, this API will reduce lines of code. Furthermore, it will increase
the maintainability of the ivi-shell implementation.

Old way of getting the weston_view was flawed, because the views list of the weston_surface
is read without controlling the existence of the weston_surface.
New implementation explicitly throws an error if the weston_surface does not exist.

Signed-off-by: Emre Ucan <eucan@de.adit-jv.com>
---
 ivi-shell/ivi-layout.c |   75 +++++++++++++++++++++---------------------------
 1 file changed, 33 insertions(+), 42 deletions(-)

Patch hide | download patch | download mbox

diff --git a/ivi-shell/ivi-layout.c b/ivi-shell/ivi-layout.c
index 49e789e..702878f 100644
--- a/ivi-shell/ivi-layout.c
+++ b/ivi-shell/ivi-layout.c
@@ -150,6 +150,22 @@  get_layer(struct wl_list *layer_list, uint32_t id_layer)
 	return NULL;
 }
 
+static struct weston_view *
+get_weston_view(struct ivi_layout_surface *ivisurf)
+{
+	struct weston_view *view = NULL;
+
+	assert(ivisurf->surface != NULL);
+
+	/* One view per surface */
+	if(wl_list_empty(&ivisurf->surface->views))
+		view = NULL;
+	else
+		view = wl_container_of(ivisurf->surface->views.next, view, surface_link);
+
+	return view;
+}
+
 static void
 remove_configured_listener(struct ivi_layout_surface *ivisurf)
 {
@@ -302,18 +318,15 @@  static void
 update_opacity(struct ivi_layout_layer *ivilayer,
 	       struct ivi_layout_surface *ivisurf)
 {
+	struct weston_view *tmpview = NULL;
 	double layer_alpha = wl_fixed_to_double(ivilayer->prop.opacity);
 	double surf_alpha  = wl_fixed_to_double(ivisurf->prop.opacity);
 
 	if ((ivilayer->event_mask & IVI_NOTIFICATION_OPACITY) ||
 	    (ivisurf->event_mask  & IVI_NOTIFICATION_OPACITY)) {
-		struct weston_view *tmpview = NULL;
-		wl_list_for_each(tmpview, &ivisurf->surface->views, surface_link) {
-			if (tmpview == NULL) {
-				continue;
-			}
-			tmpview->alpha = layer_alpha * surf_alpha;
-		}
+		tmpview = get_weston_view(ivisurf);
+		assert(tmpview != NULL);
+		tmpview->alpha = layer_alpha * surf_alpha;
 	}
 }
 
@@ -590,11 +603,8 @@  update_prop(struct ivi_layout_layer *ivilayer,
 
 	update_opacity(ivilayer, ivisurf);
 
-	wl_list_for_each(tmpview, &ivisurf->surface->views, surface_link) {
-		if (tmpview != NULL) {
-			break;
-		}
-	}
+	tmpview = get_weston_view(ivisurf);
+	assert(tmpview != NULL);
 
 	if (ivisurf->prop.source_width == 0 || ivisurf->prop.source_height == 0) {
 		weston_log("ivi-shell: source rectangle is not yet set by ivi_layout_surface_set_source_rectangle\n");
@@ -613,24 +623,18 @@  update_prop(struct ivi_layout_layer *ivilayer,
 		calc_surface_to_global_matrix_and_mask_to_weston_surface(
 			ivilayer, ivisurf, &ivisurf->transform.matrix, &r);
 
-		if (tmpview != NULL) {
-			weston_view_set_mask(tmpview, r.x, r.y, r.width, r.height);
-			wl_list_insert(&tmpview->geometry.transformation_list,
-				       &ivisurf->transform.link);
+		weston_view_set_mask(tmpview, r.x, r.y, r.width, r.height);
+		wl_list_insert(&tmpview->geometry.transformation_list,
+			       &ivisurf->transform.link);
 
-			weston_view_set_transform_parent(tmpview, NULL);
-		}
+		weston_view_set_transform_parent(tmpview, NULL);
 	}
 
 	ivisurf->update_count++;
 
-	if (tmpview != NULL) {
-		weston_view_geometry_dirty(tmpview);
-	}
+	weston_view_geometry_dirty(tmpview);
 
-	if (ivisurf->surface != NULL) {
-		weston_surface_damage(ivisurf->surface);
-	}
+	weston_surface_damage(ivisurf->surface);
 }
 
 static void
@@ -799,6 +803,7 @@  commit_screen_list(struct ivi_layout *layout)
 	struct ivi_layout_layer   *ivilayer = NULL;
 	struct ivi_layout_layer   *next     = NULL;
 	struct ivi_layout_surface *ivisurf  = NULL;
+	struct weston_view *tmpview = NULL;
 
 	wl_list_for_each(iviscrn, &layout->screen_list, link) {
 		if (iviscrn->order.dirty) {
@@ -831,17 +836,11 @@  commit_screen_list(struct ivi_layout *layout)
 				continue;
 
 			wl_list_for_each(ivisurf, &ivilayer->order.surface_list, order.link) {
-				struct weston_view *tmpview = NULL;
-				wl_list_for_each(tmpview, &ivisurf->surface->views, surface_link) {
-					if (tmpview != NULL) {
-						break;
-					}
-				}
-
 				if (ivisurf->prop.visibility == false)
 					continue;
-				if (ivisurf->surface == NULL || tmpview == NULL)
-					continue;
+
+				tmpview = get_weston_view(ivisurf);
+				assert(tmpview != NULL);
 
 				weston_layer_entry_insert(&layout->layout_layer.view_list,
 							  &tmpview->layer_link);
@@ -2554,18 +2553,10 @@  ivi_layout_surface_dump(struct weston_surface *surface,
 struct weston_view *
 ivi_layout_get_weston_view(struct ivi_layout_surface *surface)
 {
-	struct weston_view *tmpview = NULL;
-
 	if (surface == NULL)
 		return NULL;
 
-	wl_list_for_each(tmpview, &surface->surface->views, surface_link)
-	{
-		if (tmpview != NULL) {
-			break;
-		}
-	}
-	return tmpview;
+	return get_weston_view(surface);
 }
 
 void

Comments

Hi,

Tested-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp>
Reviewed-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp>

Best Regards,
Nobuhiko Tanibata

2015-08-28 21:59 に Ucan, Emre (ADITG/SW1) さんは書きました:
> The internal API "get_weston_view" is introduced, which returns the 
> weston_view
> of the given ivi_layout_surface. The API returns a NULL pointer, if
> the ivi_layout_surface
> does not have any weston_view.
> 
> The weston_view is required in many places of ivi-shell implementation.
> Therefore, this API will reduce lines of code. Furthermore, it will 
> increase
> the maintainability of the ivi-shell implementation.
> 
> Old way of getting the weston_view was flawed, because the views list
> of the weston_surface
> is read without controlling the existence of the weston_surface.
> New implementation explicitly throws an error if the weston_surface
> does not exist.
> 
> Signed-off-by: Emre Ucan <eucan@de.adit-jv.com>
> ---
>  ivi-shell/ivi-layout.c |   75 
> +++++++++++++++++++++---------------------------
>  1 file changed, 33 insertions(+), 42 deletions(-)
> 
> diff --git a/ivi-shell/ivi-layout.c b/ivi-shell/ivi-layout.c
> index 49e789e..702878f 100644
> --- a/ivi-shell/ivi-layout.c
> +++ b/ivi-shell/ivi-layout.c
> @@ -150,6 +150,22 @@ get_layer(struct wl_list *layer_list, uint32_t 
> id_layer)
>  	return NULL;
>  }
> 
> +static struct weston_view *
> +get_weston_view(struct ivi_layout_surface *ivisurf)
> +{
> +	struct weston_view *view = NULL;
> +
> +	assert(ivisurf->surface != NULL);
> +
> +	/* One view per surface */
> +	if(wl_list_empty(&ivisurf->surface->views))
> +		view = NULL;
> +	else
> +		view = wl_container_of(ivisurf->surface->views.next, view, 
> surface_link);
> +
> +	return view;
> +}
> +
>  static void
>  remove_configured_listener(struct ivi_layout_surface *ivisurf)
>  {
> @@ -302,18 +318,15 @@ static void
>  update_opacity(struct ivi_layout_layer *ivilayer,
>  	       struct ivi_layout_surface *ivisurf)
>  {
> +	struct weston_view *tmpview = NULL;
>  	double layer_alpha = wl_fixed_to_double(ivilayer->prop.opacity);
>  	double surf_alpha  = wl_fixed_to_double(ivisurf->prop.opacity);
> 
>  	if ((ivilayer->event_mask & IVI_NOTIFICATION_OPACITY) ||
>  	    (ivisurf->event_mask  & IVI_NOTIFICATION_OPACITY)) {
> -		struct weston_view *tmpview = NULL;
> -		wl_list_for_each(tmpview, &ivisurf->surface->views, surface_link) {
> -			if (tmpview == NULL) {
> -				continue;
> -			}
> -			tmpview->alpha = layer_alpha * surf_alpha;
> -		}
> +		tmpview = get_weston_view(ivisurf);
> +		assert(tmpview != NULL);
> +		tmpview->alpha = layer_alpha * surf_alpha;
>  	}
>  }
> 
> @@ -590,11 +603,8 @@ update_prop(struct ivi_layout_layer *ivilayer,
> 
>  	update_opacity(ivilayer, ivisurf);
> 
> -	wl_list_for_each(tmpview, &ivisurf->surface->views, surface_link) {
> -		if (tmpview != NULL) {
> -			break;
> -		}
> -	}
> +	tmpview = get_weston_view(ivisurf);
> +	assert(tmpview != NULL);
> 
>  	if (ivisurf->prop.source_width == 0 || ivisurf->prop.source_height == 
> 0) {
>  		weston_log("ivi-shell: source rectangle is not yet set by
> ivi_layout_surface_set_source_rectangle\n");
> @@ -613,24 +623,18 @@ update_prop(struct ivi_layout_layer *ivilayer,
>  		calc_surface_to_global_matrix_and_mask_to_weston_surface(
>  			ivilayer, ivisurf, &ivisurf->transform.matrix, &r);
> 
> -		if (tmpview != NULL) {
> -			weston_view_set_mask(tmpview, r.x, r.y, r.width, r.height);
> -			wl_list_insert(&tmpview->geometry.transformation_list,
> -				       &ivisurf->transform.link);
> +		weston_view_set_mask(tmpview, r.x, r.y, r.width, r.height);
> +		wl_list_insert(&tmpview->geometry.transformation_list,
> +			       &ivisurf->transform.link);
> 
> -			weston_view_set_transform_parent(tmpview, NULL);
> -		}
> +		weston_view_set_transform_parent(tmpview, NULL);
>  	}
> 
>  	ivisurf->update_count++;
> 
> -	if (tmpview != NULL) {
> -		weston_view_geometry_dirty(tmpview);
> -	}
> +	weston_view_geometry_dirty(tmpview);
> 
> -	if (ivisurf->surface != NULL) {
> -		weston_surface_damage(ivisurf->surface);
> -	}
> +	weston_surface_damage(ivisurf->surface);
>  }
> 
>  static void
> @@ -799,6 +803,7 @@ commit_screen_list(struct ivi_layout *layout)
>  	struct ivi_layout_layer   *ivilayer = NULL;
>  	struct ivi_layout_layer   *next     = NULL;
>  	struct ivi_layout_surface *ivisurf  = NULL;
> +	struct weston_view *tmpview = NULL;
> 
>  	wl_list_for_each(iviscrn, &layout->screen_list, link) {
>  		if (iviscrn->order.dirty) {
> @@ -831,17 +836,11 @@ commit_screen_list(struct ivi_layout *layout)
>  				continue;
> 
>  			wl_list_for_each(ivisurf, &ivilayer->order.surface_list, 
> order.link) {
> -				struct weston_view *tmpview = NULL;
> -				wl_list_for_each(tmpview, &ivisurf->surface->views, surface_link) 
> {
> -					if (tmpview != NULL) {
> -						break;
> -					}
> -				}
> -
>  				if (ivisurf->prop.visibility == false)
>  					continue;
> -				if (ivisurf->surface == NULL || tmpview == NULL)
> -					continue;
> +
> +				tmpview = get_weston_view(ivisurf);
> +				assert(tmpview != NULL);
> 
>  				weston_layer_entry_insert(&layout->layout_layer.view_list,
>  							  &tmpview->layer_link);
> @@ -2554,18 +2553,10 @@ ivi_layout_surface_dump(struct weston_surface 
> *surface,
>  struct weston_view *
>  ivi_layout_get_weston_view(struct ivi_layout_surface *surface)
>  {
> -	struct weston_view *tmpview = NULL;
> -
>  	if (surface == NULL)
>  		return NULL;
> 
> -	wl_list_for_each(tmpview, &surface->surface->views, surface_link)
> -	{
> -		if (tmpview != NULL) {
> -			break;
> -		}
> -	}
> -	return tmpview;
> +	return get_weston_view(surface);
>  }
> 
>  void