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-boun...@lists.freedesktop.org] On > Behalf Of Ander Conselvan de Oliveira > Sent: Monday, April 14, 2014 5:48 AM > To: wayland-devel@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.olive...@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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/wayland-devel _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel