From 1ce6a2a2b389057529bd46184eb833cd9cb4244f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Thu, 21 Jun 2012 22:34:39 -0400 Subject: [PATCH] shell: Animate input panel mapping We slide it in from below. --- src/compositor.h | 4 +++- src/shell.c | 11 +++++++++-- src/util.c | 26 ++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/compositor.h b/src/compositor.h index bcc8ad2e..8331faa9 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -725,7 +725,9 @@ weston_zoom_run(struct weston_surface *surface, GLfloat start, GLfloat stop, struct weston_surface_animation * weston_fade_run(struct weston_surface *surface, weston_surface_animation_done_func_t done, void *data); - +struct weston_surface_animation * +weston_slide_run(struct weston_surface *surface, GLfloat start, GLfloat stop, + weston_surface_animation_done_func_t done, void *data); void weston_surface_set_color(struct weston_surface *surface, diff --git a/src/shell.c b/src/shell.c index b3a7e68e..c7ff3c54 100644 --- a/src/shell.c +++ b/src/shell.c @@ -1919,12 +1919,17 @@ hide_screensaver(struct desktop_shell *shell, struct shell_surface *surface) static void show_input_panel(struct desktop_shell *shell, struct shell_surface *surface) { + if (weston_surface_is_mapped(surface->surface)) + return; + wl_list_remove(&surface->surface->layer_link); wl_list_insert(&shell->panel_layer.surface_list, &surface->surface->layer_link); surface->surface->output = surface->output; weston_surface_damage(surface->surface); - weston_zoom_run(surface->surface, 0.8, 1.0, NULL, NULL); + weston_slide_run(surface->surface, + surface->surface->geometry.height, 0, + NULL, NULL); } static void @@ -2660,7 +2665,9 @@ map(struct desktop_shell *shell, struct weston_surface *surface, break; case SHELL_SURFACE_INPUT_PANEL: bottom_center_on_output(surface, get_default_output(compositor)); - break; + /* Don't map the input panel here, wait for + * show_input_panels signal. */ + return; case SHELL_SURFACE_POPUP: shell_map_popup(shsurf); case SHELL_SURFACE_NONE: diff --git a/src/util.c b/src/util.c index ff9310dc..cb03ddee 100644 --- a/src/util.c +++ b/src/util.c @@ -234,6 +234,32 @@ weston_fade_run(struct weston_surface *surface, fade_frame, done, data); } +static void +slide_frame(struct weston_surface_animation *animation) +{ + GLfloat scale; + + scale = animation->start + + (animation->stop - animation->start) * + animation->spring.current; + weston_matrix_init(&animation->transform.matrix); + weston_matrix_translate(&animation->transform.matrix, 0, scale, 0); +} + +WL_EXPORT struct weston_surface_animation * +weston_slide_run(struct weston_surface *surface, GLfloat start, GLfloat stop, + weston_surface_animation_done_func_t done, void *data) +{ + struct weston_surface_animation *animation; + + animation = weston_surface_animation_run(surface, start, stop, + slide_frame, done, data); + animation->spring.friction = 900; + animation->spring.k = 300; + + return animation; +} + struct weston_binding { uint32_t key; uint32_t button;