shell: Animate input panel mapping
authorKristian Høgsberg <krh@bitplanet.net>
Fri, 22 Jun 2012 02:34:39 +0000 (22:34 -0400)
committerKristian Høgsberg <krh@bitplanet.net>
Fri, 22 Jun 2012 02:34:39 +0000 (22:34 -0400)
We slide it in from below.

src/compositor.h
src/shell.c
src/util.c

index bcc8ad2..8331faa 100644 (file)
@@ -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,
index b3a7e68..c7ff3c5 100644 (file)
@@ -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:
index ff9310d..cb03dde 100644 (file)
@@ -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;