shell: Destroy a previous input panel animation when showing it again
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.
This commit is contained in:
parent
a4a6f16129
commit
75c373c76c
|
@ -43,10 +43,40 @@ struct input_panel_surface {
|
||||||
struct weston_view *view;
|
struct weston_view *view;
|
||||||
struct wl_listener surface_destroy_listener;
|
struct wl_listener surface_destroy_listener;
|
||||||
|
|
||||||
|
struct weston_view_animation *anim;
|
||||||
|
|
||||||
struct weston_output *output;
|
struct weston_output *output;
|
||||||
uint32_t panel;
|
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
|
static void
|
||||||
show_input_panels(struct wl_listener *listener, void *data)
|
show_input_panels(struct wl_listener *listener, void *data)
|
||||||
{
|
{
|
||||||
|
@ -70,13 +100,8 @@ show_input_panels(struct wl_listener *listener, void *data)
|
||||||
&shell->input_panel.surfaces, link) {
|
&shell->input_panel.surfaces, link) {
|
||||||
if (ipsurf->surface->width == 0)
|
if (ipsurf->surface->width == 0)
|
||||||
continue;
|
continue;
|
||||||
wl_list_insert(&shell->input_panel_layer.view_list,
|
|
||||||
&ipsurf->view->layer_link);
|
show_input_panel_surface(ipsurf);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
weston_view_set_position(ip_surface->view, x, y);
|
||||||
|
|
||||||
if (!weston_surface_is_mapped(surface) && shell->showing_input_panels) {
|
if (!weston_surface_is_mapped(surface) && shell->showing_input_panels)
|
||||||
wl_list_insert(&shell->input_panel_layer.view_list,
|
show_input_panel_surface(ip_surface);
|
||||||
&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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Reference in New Issue