[PATCH 1/2] compositor: keep track of the weston_layer a weston_view is in

Bryce W. Harrington b.harrington at samsung.com
Tue Jan 28 15:46:40 PST 2014


On Mon, Jan 27, 2014 at 09:46:49PM +0200, Giulio Camuffo wrote:
> This introduces a new struct, weston_layer_entry, which is now used
> in place of wl_list to keep the link for the layer list in weston_view
> and the head of the list in weston_layer.
> weston_layer_entry also has a weston_layer*, which points to the layer
> the view is in or, in the case the entry it's the head of the list, to
> the layer itself.

Both patches appear to compile without adding warnings, and no new
failures turn up via make check with this patch applied, so:

Tested-by: Bryce Harrington <b.harrington at samsung.com>

> ---
>  desktop-shell/exposay.c     |   4 +-
>  desktop-shell/input-panel.c |  11 +++--
>  desktop-shell/shell.c       | 115 +++++++++++++++++++++++---------------------
>  src/compositor.c            |  33 ++++++++++---
>  src/compositor.h            |  14 +++++-
>  src/data-device.c           |   6 +--
>  src/input.c                 |   4 +-
>  tests/weston-test.c         |   6 +--
>  8 files changed, 114 insertions(+), 79 deletions(-)
> 
> diff --git a/desktop-shell/exposay.c b/desktop-shell/exposay.c
> index fe7a3a7..5e4b341 100644
> --- a/desktop-shell/exposay.c
> +++ b/desktop-shell/exposay.c
> @@ -192,7 +192,7 @@ exposay_layout(struct desktop_shell *shell)
>  	wl_list_init(&shell->exposay.surface_list);
>  
>  	shell->exposay.num_surfaces = 0;
> -	wl_list_for_each(view, &workspace->layer.view_list, layer_link) {
> +	wl_list_for_each(view, &workspace->layer.view_list.link, layer_link.link) {
>  		if (!get_shell_surface(view->surface))
>  			continue;
>  		shell->exposay.num_surfaces++;
> @@ -243,7 +243,7 @@ exposay_layout(struct desktop_shell *shell)
>  		shell->exposay.surface_size = output->height / 2;
>  
>  	i = 0;
> -	wl_list_for_each(view, &workspace->layer.view_list, layer_link) {
> +	wl_list_for_each(view, &workspace->layer.view_list.link, layer_link.link) {
>  		int pad;
>  
>  		pad = shell->exposay.surface_size + shell->exposay.padding_inner;
> diff --git a/desktop-shell/input-panel.c b/desktop-shell/input-panel.c
> index c08a403..d97a248 100644
> --- a/desktop-shell/input-panel.c
> +++ b/desktop-shell/input-panel.c
> @@ -70,8 +70,8 @@ show_input_panels(struct wl_listener *listener, void *data)
>  			      &shell->input_panel.surfaces, link) {
>  		if (ipsurf->surface->width == 0)
>  			continue;
> -		wl_list_insert(&shell->input_panel_layer.view_list,
> -			       &ipsurf->view->layer_link);
> +		weston_layer_entry_insert(&shell->input_panel_layer.view_list,
> +					  &ipsurf->view->layer_link);
>  		weston_view_geometry_dirty(ipsurf->view);
>  		weston_view_update_transform(ipsurf->view);
>  		weston_surface_damage(ipsurf->surface);
> @@ -97,7 +97,8 @@ hide_input_panels(struct wl_listener *listener, void *data)
>  		wl_list_remove(&shell->input_panel_layer.link);
>  
>  	wl_list_for_each_safe(view, next,
> -			      &shell->input_panel_layer.view_list, layer_link)
> +			      &shell->input_panel_layer.view_list.link,
> +			      layer_link.link)
>  		weston_view_unmap(view);
>  }
>  
> @@ -136,8 +137,8 @@ input_panel_configure(struct weston_surface *surface, int32_t sx, int32_t sy)
>  	weston_view_set_position(ip_surface->view, x, y);
>  
>  	if (!weston_surface_is_mapped(surface) && shell->showing_input_panels) {
> -		wl_list_insert(&shell->input_panel_layer.view_list,
> -			       &ip_surface->view->layer_link);
> +		weston_layer_entry_insert(&shell->input_panel_layer.view_list,
> +					  &ip_surface->view->layer_link);
>  		weston_view_update_transform(ip_surface->view);
>  		weston_surface_damage(surface);
>  		weston_slide_run(ip_surface->view, ip_surface->view->surface->height * 0.9, 0, NULL, NULL);
> diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c
> index c275543..51cb298 100644
> --- a/desktop-shell/shell.c
> +++ b/desktop-shell/shell.c
> @@ -266,12 +266,12 @@ shell_surface_is_top_fullscreen(struct shell_surface *shsurf)
>  
>  	shell = shell_surface_get_shell(shsurf);
>  
> -	if (wl_list_empty(&shell->fullscreen_layer.view_list))
> +	if (wl_list_empty(&shell->fullscreen_layer.view_list.link))
>  		return false;
>  
> -	top_fs_ev = container_of(shell->fullscreen_layer.view_list.next,
> +	top_fs_ev = container_of(shell->fullscreen_layer.view_list.link.next,
>  			         struct weston_view,
> -				 layer_link);
> +				 layer_link.link);
>  	return (shsurf == get_shell_surface(top_fs_ev->surface));
>  }
>  
> @@ -594,7 +594,8 @@ focus_state_surface_destroy(struct wl_listener *listener, void *data)
>  	main_surface = weston_surface_get_main_surface(state->keyboard_focus);
>  
>  	next = NULL;
> -	wl_list_for_each(view, &state->ws->layer.view_list, layer_link) {
> +	wl_list_for_each(view,
> +			 &state->ws->layer.view_list.link, layer_link.link) {
>  		if (view->surface == main_surface)
>  			continue;
>  		if (is_focus_view(view))
> @@ -750,8 +751,8 @@ animate_focus_change(struct desktop_shell *shell, struct workspace *ws,
>  
>  		focus_surface_created = true;
>  	} else {
> -		wl_list_remove(&ws->fsurf_front->view->layer_link);
> -		wl_list_remove(&ws->fsurf_back->view->layer_link);
> +		weston_layer_entry_remove(&ws->fsurf_front->view->layer_link);
> +		weston_layer_entry_remove(&ws->fsurf_back->view->layer_link);
>  	}
>  
>  	if (ws->focus_animation) {
> @@ -760,11 +761,11 @@ animate_focus_change(struct desktop_shell *shell, struct workspace *ws,
>  	}
>  
>  	if (to)
> -		wl_list_insert(&to->layer_link,
> -			       &ws->fsurf_front->view->layer_link);
> +		weston_layer_entry_insert(&to->layer_link,
> +					  &ws->fsurf_front->view->layer_link);
>  	else if (from)
> -		wl_list_insert(&ws->layer.view_list,
> -			       &ws->fsurf_front->view->layer_link);
> +		weston_layer_entry_insert(&ws->layer.view_list,
> +					  &ws->fsurf_front->view->layer_link);
>  
>  	if (focus_surface_created) {
>  		ws->focus_animation = weston_fade_run(
> @@ -772,15 +773,15 @@ animate_focus_change(struct desktop_shell *shell, struct workspace *ws,
>  			ws->fsurf_front->view->alpha, 0.6, 300,
>  			focus_animation_done, ws);
>  	} else if (from) {
> -		wl_list_insert(&from->layer_link,
> -			       &ws->fsurf_back->view->layer_link);
> +		weston_layer_entry_insert(&from->layer_link,
> +					  &ws->fsurf_back->view->layer_link);
>  		ws->focus_animation = weston_stable_fade_run(
>  			ws->fsurf_front->view, 0.0,
>  			ws->fsurf_back->view, 0.6,
>  			focus_animation_done, ws);
>  	} else if (to) {
> -		wl_list_insert(&ws->layer.view_list,
> -			       &ws->fsurf_back->view->layer_link);
> +		weston_layer_entry_insert(&ws->layer.view_list,
> +					  &ws->fsurf_back->view->layer_link);
>  		ws->focus_animation = weston_stable_fade_run(
>  			ws->fsurf_front->view, 0.0,
>  			ws->fsurf_back->view, 0.6,
> @@ -840,7 +841,7 @@ workspace_create(void)
>  static int
>  workspace_is_empty(struct workspace *ws)
>  {
> -	return wl_list_empty(&ws->layer.view_list);
> +	return wl_list_empty(&ws->layer.view_list.link);
>  }
>  
>  static struct workspace *
> @@ -905,7 +906,7 @@ workspace_translate_out(struct workspace *ws, double fraction)
>  	unsigned int height;
>  	double d;
>  
> -	wl_list_for_each(view, &ws->layer.view_list, layer_link) {
> +	wl_list_for_each(view, &ws->layer.view_list.link, layer_link.link) {
>  		height = get_output_height(view->surface->output);
>  		d = height * fraction;
>  
> @@ -920,7 +921,7 @@ workspace_translate_in(struct workspace *ws, double fraction)
>  	unsigned int height;
>  	double d;
>  
> -	wl_list_for_each(view, &ws->layer.view_list, layer_link) {
> +	wl_list_for_each(view, &ws->layer.view_list.link, layer_link.link) {
>  		height = get_output_height(view->surface->output);
>  
>  		if (fraction > 0)
> @@ -965,7 +966,7 @@ workspace_deactivate_transforms(struct workspace *ws)
>  	struct weston_view *view;
>  	struct weston_transform *transform;
>  
> -	wl_list_for_each(view, &ws->layer.view_list, layer_link) {
> +	wl_list_for_each(view, &ws->layer.view_list.link, layer_link.link) {
>  		if (is_focus_view(view)) {
>  			struct focus_surface *fsurf = get_focus_surface(view->surface);
>  			transform = &fsurf->workspace_transform;
> @@ -1105,7 +1106,7 @@ change_workspace(struct desktop_shell *shell, unsigned int index)
>  		return;
>  
>  	/* Don't change workspace when there is any fullscreen surfaces. */
> -	if (!wl_list_empty(&shell->fullscreen_layer.view_list))
> +	if (!wl_list_empty(&shell->fullscreen_layer.view_list.link))
>  		return;
>  
>  	from = get_current_workspace(shell);
> @@ -1149,7 +1150,7 @@ change_workspace(struct desktop_shell *shell, unsigned int index)
>  static bool
>  workspace_has_only(struct workspace *ws, struct weston_surface *surface)
>  {
> -	struct wl_list *list = &ws->layer.view_list;
> +	struct wl_list *list = &ws->layer.view_list.link;
>  	struct wl_list *e;
>  
>  	if (wl_list_empty(list))
> @@ -1160,7 +1161,7 @@ workspace_has_only(struct workspace *ws, struct weston_surface *surface)
>  	if (e->next != list)
>  		return false;
>  
> -	return container_of(e, struct weston_view, layer_link)->surface == surface;
> +	return container_of(e, struct weston_view, layer_link.link)->surface == surface;
>  }
>  
>  static void
> @@ -1189,8 +1190,8 @@ move_surface_to_workspace(struct desktop_shell *shell,
>  	from = get_current_workspace(shell);
>  	to = get_workspace(shell, workspace);
>  
> -	wl_list_remove(&view->layer_link);
> -	wl_list_insert(&to->layer.view_list, &view->layer_link);
> +	weston_layer_entry_remove(&view->layer_link);
> +	weston_layer_entry_insert(&to->layer.view_list, &view->layer_link);
>  
>  	shell_surface_update_child_surface_layers(shsurf);
>  
> @@ -1229,8 +1230,8 @@ take_surface_to_workspace_by_seat(struct desktop_shell *shell,
>  	from = get_current_workspace(shell);
>  	to = get_workspace(shell, index);
>  
> -	wl_list_remove(&view->layer_link);
> -	wl_list_insert(&to->layer.view_list, &view->layer_link);
> +	weston_layer_entry_remove(&view->layer_link);
> +	weston_layer_entry_insert(&to->layer.view_list, &view->layer_link);
>  
>  	shsurf = get_shell_surface(surface);
>  	if (shsurf != NULL)
> @@ -2014,7 +2015,7 @@ get_output_panel_height(struct desktop_shell *shell,
>  	if (!output)
>  		return 0;
>  
> -	wl_list_for_each(view, &shell->panel_layer.view_list, layer_link) {
> +	wl_list_for_each(view, &shell->panel_layer.view_list.link, layer_link.link) {
>  		if (view->surface->output == output) {
>  			panel_height = view->surface->height;
>  			break;
> @@ -2027,7 +2028,7 @@ get_output_panel_height(struct desktop_shell *shell,
>  /* The surface will be inserted into the list immediately after the link
>   * returned by this function (i.e. will be stacked immediately above the
>   * returned link). */
> -static struct wl_list *
> +static struct weston_layer_entry *
>  shell_surface_calculate_layer_link (struct shell_surface *shsurf)
>  {
>  	struct workspace *ws;
> @@ -2047,7 +2048,8 @@ shell_surface_calculate_layer_link (struct shell_surface *shsurf)
>  			/* TODO: Handle a parent with multiple views */
>  			parent = get_default_view(shsurf->parent);
>  			if (parent)
> -				return parent->layer_link.prev;
> +				return container_of(parent->layer_link.link.prev,
> +						    struct weston_layer_entry, link);
>  		}
>  		break;
>  
> @@ -2071,15 +2073,18 @@ static void
>  shell_surface_update_child_surface_layers (struct shell_surface *shsurf)
>  {
>  	struct shell_surface *child;
> +	struct weston_layer_entry *prev;
>  
>  	/* Move the child layers to the same workspace as shsurf. They will be
>  	 * stacked above shsurf. */
>  	wl_list_for_each_reverse(child, &shsurf->children_list, children_link) {
> -		if (shsurf->view->layer_link.prev != &child->view->layer_link) {
> +		if (shsurf->view->layer_link.link.prev != &child->view->layer_link.link) {
>  			weston_view_geometry_dirty(child->view);
> -			wl_list_remove(&child->view->layer_link);
> -			wl_list_insert(shsurf->view->layer_link.prev,
> -			               &child->view->layer_link);
> +			prev = container_of(shsurf->view->layer_link.link.prev,
> +					    struct weston_layer_entry, link);
> +			weston_layer_entry_remove(&child->view->layer_link);
> +			weston_layer_entry_insert(prev,
> +						  &child->view->layer_link);
>  			weston_view_geometry_dirty(child->view);
>  			weston_surface_damage(child->surface);
>  
> @@ -2100,7 +2105,7 @@ shell_surface_update_child_surface_layers (struct shell_surface *shsurf)
>  static void
>  shell_surface_update_layer(struct shell_surface *shsurf)
>  {
> -	struct wl_list *new_layer_link;
> +	struct weston_layer_entry *new_layer_link;
>  
>  	new_layer_link = shell_surface_calculate_layer_link(shsurf);
>  
> @@ -2108,8 +2113,8 @@ shell_surface_update_layer(struct shell_surface *shsurf)
>  		return;
>  
>  	weston_view_geometry_dirty(shsurf->view);
> -	wl_list_remove(&shsurf->view->layer_link);
> -	wl_list_insert(new_layer_link, &shsurf->view->layer_link);
> +	weston_layer_entry_remove(&shsurf->view->layer_link);
> +	weston_layer_entry_insert(new_layer_link, &shsurf->view->layer_link);
>  	weston_view_geometry_dirty(shsurf->view);
>  	weston_surface_damage(shsurf->surface);
>  
> @@ -2528,9 +2533,9 @@ shell_ensure_fullscreen_black_view(struct shell_surface *shsurf)
>  			                     output->height);
>  
>  	weston_view_geometry_dirty(shsurf->fullscreen.black_view);
> -	wl_list_remove(&shsurf->fullscreen.black_view->layer_link);
> -	wl_list_insert(&shsurf->view->layer_link,
> -	               &shsurf->fullscreen.black_view->layer_link);
> +	weston_layer_entry_remove(&shsurf->fullscreen.black_view->layer_link);
> +	weston_layer_entry_insert(&shsurf->view->layer_link,
> +				  &shsurf->fullscreen.black_view->layer_link);
>  	weston_view_geometry_dirty(shsurf->fullscreen.black_view);
>  	weston_surface_damage(shsurf->surface);
>  }
> @@ -3568,7 +3573,7 @@ configure_static_view(struct weston_view *ev, struct weston_layer *layer)
>  {
>  	struct weston_view *v, *next;
>  
> -	wl_list_for_each_safe(v, next, &layer->view_list, layer_link) {
> +	wl_list_for_each_safe(v, next, &layer->view_list.link, layer_link.link) {
>  		if (v->output == ev->output && v != ev) {
>  			weston_view_unmap(v);
>  			v->surface->configure = NULL;
> @@ -3577,8 +3582,8 @@ configure_static_view(struct weston_view *ev, struct weston_layer *layer)
>  
>  	weston_view_set_position(ev, ev->output->x, ev->output->y);
>  
> -	if (wl_list_empty(&ev->layer_link)) {
> -		wl_list_insert(&layer->view_list, &ev->layer_link);
> +	if (wl_list_empty(&ev->layer_link.link)) {
> +		weston_layer_entry_insert(&layer->view_list, &ev->layer_link);
>  		weston_compositor_schedule_repaint(ev->surface->compositor);
>  	}
>  }
> @@ -3683,8 +3688,8 @@ lock_surface_configure(struct weston_surface *surface, int32_t sx, int32_t sy)
>  	center_on_output(view, get_default_output(shell->compositor));
>  
>  	if (!weston_surface_is_mapped(surface)) {
> -		wl_list_insert(&shell->lock_layer.view_list,
> -			       &view->layer_link);
> +		weston_layer_entry_insert(&shell->lock_layer.view_list,
> +					  &view->layer_link);
>  		weston_view_update_transform(view);
>  		shell_fade(shell, FADE_IN);
>  	}
> @@ -4210,10 +4215,10 @@ lower_fullscreen_layer(struct desktop_shell *shell)
>  
>  	ws = get_current_workspace(shell);
>  	wl_list_for_each_reverse_safe(view, prev,
> -				      &shell->fullscreen_layer.view_list,
> -				      layer_link) {
> -		wl_list_remove(&view->layer_link);
> -		wl_list_insert(&ws->layer.view_list, &view->layer_link);
> +				      &shell->fullscreen_layer.view_list.link,
> +				      layer_link.link) {
> +		weston_layer_entry_remove(&view->layer_link);
> +		weston_layer_entry_insert(&ws->layer.view_list, &view->layer_link);
>  		weston_view_damage_below(view);
>  		weston_surface_damage(view->surface);
>  	}
> @@ -4410,8 +4415,8 @@ shell_fade_create_surface(struct desktop_shell *shell)
>  	weston_surface_set_size(surface, 8192, 8192);
>  	weston_view_set_position(view, 0, 0);
>  	weston_surface_set_color(surface, 0.0, 0.0, 0.0, 1.0);
> -	wl_list_insert(&compositor->fade_layer.view_list,
> -		       &view->layer_link);
> +	weston_layer_entry_insert(&compositor->fade_layer.view_list,
> +				  &view->layer_link);
>  	pixman_region32_init(&surface->input);
>  
>  	return view;
> @@ -4943,6 +4948,7 @@ screensaver_configure(struct weston_surface *surface, int32_t sx, int32_t sy)
>  {
>  	struct desktop_shell *shell = surface->configure_private;
>  	struct weston_view *view;
> +	struct weston_layer_entry *prev;
>  
>  	if (surface->width == 0)
>  		return;
> @@ -4954,9 +4960,10 @@ screensaver_configure(struct weston_surface *surface, int32_t sx, int32_t sy)
>  	view = container_of(surface->views.next, struct weston_view, surface_link);
>  	center_on_output(view, surface->output);
>  
> -	if (wl_list_empty(&view->layer_link)) {
> -		wl_list_insert(shell->lock_layer.view_list.prev,
> -			       &view->layer_link);
> +	if (wl_list_empty(&view->layer_link.link)) {
> +		prev = container_of(shell->lock_layer.view_list.link.prev,
> +				    struct weston_layer_entry, link);
> +		weston_layer_entry_insert(prev, &view->layer_link);
>  		weston_view_update_transform(view);
>  		wl_event_source_timer_update(shell->screensaver.timer,
>  					     shell->screensaver.duration);
> @@ -5035,7 +5042,7 @@ switcher_next(struct switcher *switcher)
>  	struct shell_surface *shsurf;
>  	struct workspace *ws = get_current_workspace(switcher->shell);
>  
> -	wl_list_for_each(view, &ws->layer.view_list, layer_link) {
> +	wl_list_for_each(view, &ws->layer.view_list.link, layer_link.link) {
>  		shsurf = get_shell_surface(view->surface);
>  		if (shsurf &&
>  		    shsurf->type == SHELL_SURFACE_TOPLEVEL &&
> @@ -5091,7 +5098,7 @@ switcher_destroy(struct switcher *switcher)
>  	struct weston_keyboard *keyboard = switcher->grab.keyboard;
>  	struct workspace *ws = get_current_workspace(switcher->shell);
>  
> -	wl_list_for_each(view, &ws->layer.view_list, layer_link) {
> +	wl_list_for_each(view, &ws->layer.view_list.link, layer_link.link) {
>  		if (is_focus_view(view))
>  			continue;
>  
> diff --git a/src/compositor.c b/src/compositor.c
> index 40e4b11..9a269e5 100644
> --- a/src/compositor.c
> +++ b/src/compositor.c
> @@ -437,9 +437,10 @@ weston_view_create(struct weston_surface *surface)
>  
>  	wl_signal_init(&view->destroy_signal);
>  	wl_list_init(&view->link);
> -	wl_list_init(&view->layer_link);
> +	wl_list_init(&view->layer_link.link);
>  
>  	view->plane = NULL;
> +	view->layer_link.layer = NULL;
>  
>  	pixman_region32_init(&view->clip);
>  
> @@ -1375,8 +1376,7 @@ weston_view_unmap(struct weston_view *view)
>  	weston_view_damage_below(view);
>  	view->output = NULL;
>  	view->plane = NULL;
> -	wl_list_remove(&view->layer_link);
> -	wl_list_init(&view->layer_link);
> +	weston_layer_entry_remove(&view->layer_link);
>  	wl_list_remove(&view->link);
>  	wl_list_init(&view->link);
>  	wl_list_remove(&view->output_move_listener.link);
> @@ -1430,7 +1430,7 @@ weston_view_destroy(struct weston_view *view)
>  	}
>  
>  	wl_list_remove(&view->link);
> -	wl_list_remove(&view->layer_link);
> +	weston_layer_entry_remove(&view->layer_link);
>  
>  	pixman_region32_fini(&view->clip);
>  	pixman_region32_fini(&view->transform.boundingbox);
> @@ -1796,18 +1796,18 @@ weston_compositor_build_view_list(struct weston_compositor *compositor)
>  	struct weston_layer *layer;
>  
>  	wl_list_for_each(layer, &compositor->layer_list, link)
> -		wl_list_for_each(view, &layer->view_list, layer_link)
> +		wl_list_for_each(view, &layer->view_list.link, layer_link.link)
>  			surface_stash_subsurface_views(view->surface);
>  
>  	wl_list_init(&compositor->view_list);
>  	wl_list_for_each(layer, &compositor->layer_list, link) {
> -		wl_list_for_each(view, &layer->view_list, layer_link) {
> +		wl_list_for_each(view, &layer->view_list.link, layer_link.link) {
>  			view_list_add(compositor, view);
>  		}
>  	}
>  
>  	wl_list_for_each(layer, &compositor->layer_list, link)
> -		wl_list_for_each(view, &layer->view_list, layer_link)
> +		wl_list_for_each(view, &layer->view_list.link, layer_link.link)
>  			surface_free_unused_subsurface_views(view->surface);
>  }
>  
> @@ -1926,9 +1926,26 @@ idle_repaint(void *data)
>  }
>  
>  WL_EXPORT void
> +weston_layer_entry_insert(struct weston_layer_entry *list,
> +			  struct weston_layer_entry *entry)
> +{
> +	wl_list_insert(&list->link, &entry->link);
> +	entry->layer = list->layer;
> +}
> +
> +WL_EXPORT void
> +weston_layer_entry_remove(struct weston_layer_entry *entry)
> +{
> +	wl_list_remove(&entry->link);
> +	wl_list_init(&entry->link);
> +	entry->layer = NULL;
> +}
> +
> +WL_EXPORT void
>  weston_layer_init(struct weston_layer *layer, struct wl_list *below)
>  {
> -	wl_list_init(&layer->view_list);
> +	wl_list_init(&layer->view_list.link);
> +	layer->view_list.layer = layer;
>  	if (below != NULL)
>  		wl_list_insert(below, &layer->link);
>  }
> diff --git a/src/compositor.h b/src/compositor.h
> index 22a485f..7140bdf 100644
> --- a/src/compositor.h
> +++ b/src/compositor.h
> @@ -522,8 +522,13 @@ enum {
>                                           * to off */
>  };
>  
> +struct weston_layer_entry {
> +	struct wl_list link;
> +	struct weston_layer *layer;
> +};
> +
>  struct weston_layer {
> -	struct wl_list view_list;
> +	struct weston_layer_entry view_list;
>  	struct wl_list link;
>  };
>  
> @@ -762,7 +767,7 @@ struct weston_view {
>  	struct wl_signal destroy_signal;
>  
>  	struct wl_list link;
> -	struct wl_list layer_link;
> +	struct weston_layer_entry layer_link;
>  	struct weston_plane *plane;
>  
>  	pixman_region32_t clip;
> @@ -1001,6 +1006,11 @@ notify_touch(struct weston_seat *seat, uint32_t time, int touch_id,
>  	     wl_fixed_t x, wl_fixed_t y, int touch_type);
>  
>  void
> +weston_layer_entry_insert(struct weston_layer_entry *list,
> +			  struct weston_layer_entry *entry);
> +void
> +weston_layer_entry_remove(struct weston_layer_entry *entry);
> +void
>  weston_layer_init(struct weston_layer *layer, struct wl_list *below);
>  
>  void
> diff --git a/src/data-device.c b/src/data-device.c
> index 483e22e..ce735d1 100644
> --- a/src/data-device.c
> +++ b/src/data-device.c
> @@ -187,7 +187,7 @@ drag_surface_configure(struct weston_drag *drag,
>  		       struct weston_surface *es,
>  		       int32_t sx, int32_t sy)
>  {
> -	struct wl_list *list;
> +	struct weston_layer_entry *list;
>  	float fx, fy;
>  
>  	assert((pointer != NULL && touch == NULL) ||
> @@ -200,8 +200,8 @@ drag_surface_configure(struct weston_drag *drag,
>  		else
>  			list = &es->compositor->cursor_layer.view_list;
>  
> -		wl_list_remove(&drag->icon->layer_link);
> -		wl_list_insert(list, &drag->icon->layer_link);
> +		weston_layer_entry_remove(&drag->icon->layer_link);
> +		weston_layer_entry_insert(list, &drag->icon->layer_link);
>  		weston_view_update_transform(drag->icon);
>  		empty_region(&es->pending.input);
>  	}
> diff --git a/src/input.c b/src/input.c
> index 157066c..808af0d 100644
> --- a/src/input.c
> +++ b/src/input.c
> @@ -1531,8 +1531,8 @@ pointer_cursor_surface_configure(struct weston_surface *es,
>  	empty_region(&es->pending.input);
>  
>  	if (!weston_surface_is_mapped(es)) {
> -		wl_list_insert(&es->compositor->cursor_layer.view_list,
> -			       &pointer->sprite->layer_link);
> +		weston_layer_entry_insert(&es->compositor->cursor_layer.view_list,
> +					  &pointer->sprite->layer_link);
>  		weston_view_update_transform(pointer->sprite);
>  	}
>  }
> diff --git a/tests/weston-test.c b/tests/weston-test.c
> index 844059d..0268195 100644
> --- a/tests/weston-test.c
> +++ b/tests/weston-test.c
> @@ -87,9 +87,9 @@ test_surface_configure(struct weston_surface *surface, int32_t sx, int32_t sy)
>  	struct weston_test_surface *test_surface = surface->configure_private;
>  	struct weston_test *test = test_surface->test;
>  
> -	if (wl_list_empty(&test_surface->view->layer_link))
> -		wl_list_insert(&test->layer.view_list,
> -			       &test_surface->view->layer_link);
> +	if (wl_list_empty(&test_surface->view->layer_link.link))
> +		weston_layer_entry_insert(&test->layer.view_list,
> +					  &test_surface->view->layer_link);
>  
>  	weston_view_set_position(test_surface->view,
>  				 test_surface->x, test_surface->y);
> -- 
> 1.8.5.3
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel


More information about the wayland-devel mailing list