[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