[PATCH weston 3/3] shell: Destroy a previous input panel animation when showing it again

Eoff, Ullysses A ullysses.a.eoff at intel.com
Tue Apr 15 14:37:55 PDT 2014


This patch series fixes https://bugs.freedesktop.org/show_bug.cgi?id=77347 for me

U. Artie Eoff

> -----Original Message-----
> From: wayland-devel [mailto:wayland-devel-bounces at lists.freedesktop.org] On Behalf Of Ander Conselvan de Oliveira
> Sent: Monday, April 14, 2014 5:48 AM
> To: wayland-devel at lists.freedesktop.org
> Cc: Conselvan De Oliveira, Ander
> Subject: [PATCH weston 3/3] shell: Destroy a previous input panel animation when showing it again
> 
> From: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira at intel.com>
> 
> It is possible that an input panel will be shown quickly, hidden and
> shown again, before the animation for the first appeareance finished.
> In that case, another animation would be created and the effect of the
> two combined could cause the panel to not appear in the screen.
> 
> This patch fixes this by keeping a reference to the previous animation
> and deleting it when a new one is created.
> ---
>  desktop-shell/input-panel.c | 48 ++++++++++++++++++++++++++++++++-------------
>  1 file changed, 34 insertions(+), 14 deletions(-)
> 
> diff --git a/desktop-shell/input-panel.c b/desktop-shell/input-panel.c
> index 12fe686..601b289 100644
> --- a/desktop-shell/input-panel.c
> +++ b/desktop-shell/input-panel.c
> @@ -43,11 +43,41 @@ struct input_panel_surface {
>  	struct weston_view *view;
>  	struct wl_listener surface_destroy_listener;
> 
> +	struct weston_view_animation *anim;
> +
>  	struct weston_output *output;
>  	uint32_t panel;
>  };
> 
>  static void
> +input_panel_slide_done(struct weston_view_animation *animation, void *data)
> +{
> +	struct input_panel_surface *ipsurf = data;
> +
> +	ipsurf->anim = NULL;
> +}
> +
> +static void
> +show_input_panel_surface(struct input_panel_surface *ipsurf)
> +{
> +	struct desktop_shell *shell = ipsurf->shell;
> +
> +	wl_list_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);
> +
> +	if (ipsurf->anim)
> +		weston_view_animation_destroy(ipsurf->anim);
> +
> +	ipsurf->anim =
> +		weston_slide_run(ipsurf->view,
> +				 ipsurf->surface->height * 0.9, 0,
> +				 input_panel_slide_done, ipsurf);
> +}
> +
> +static void
>  show_input_panels(struct wl_listener *listener, void *data)
>  {
>  	struct desktop_shell *shell =
> @@ -70,13 +100,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_view_geometry_dirty(ipsurf->view);
> -		weston_view_update_transform(ipsurf->view);
> -		weston_surface_damage(ipsurf->surface);
> -		weston_slide_run(ipsurf->view, ipsurf->surface->height * 0.9,
> -				 0, NULL, NULL);
> +
> +		show_input_panel_surface(ipsurf);
>  	}
>  }
> 
> @@ -135,13 +160,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_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);
> -	}
> +	if (!weston_surface_is_mapped(surface) && shell->showing_input_panels)
> +		show_input_panel_surface(ip_surface);
>  }
> 
>  static void
> --
> 1.8.3.2
> 
> _______________________________________________
> 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