summaryrefslogtreecommitdiff
path: root/desktop-shell/input-panel.c
diff options
context:
space:
mode:
Diffstat (limited to 'desktop-shell/input-panel.c')
-rw-r--r--desktop-shell/input-panel.c61
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