diff options
Diffstat (limited to 'desktop-shell/input-panel.c')
-rw-r--r-- | desktop-shell/input-panel.c | 61 |
1 files changed, 47 insertions, 14 deletions
diff --git a/desktop-shell/input-panel.c b/desktop-shell/input-panel.c index 12fe686f..7623f6cb 100644 --- a/desktop-shell/input-panel.c +++ b/desktop-shell/input-panel.c @@ -43,11 +43,54 @@ 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; + struct weston_seat *seat; + struct weston_surface *focus; + float x, y; + + wl_list_for_each(seat, &shell->compositor->seat_list, link) { + if (!seat->keyboard) + continue; + focus = weston_surface_get_main_surface(seat->keyboard->focus); + ipsurf->output = focus->output; + x = ipsurf->output->x + (ipsurf->output->width - ipsurf->surface->width) / 2; + y = ipsurf->output->y + ipsurf->output->height - ipsurf->surface->height; + weston_view_set_position(ipsurf->view, x, y); + } + + 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 +113,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 +173,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 |