From beff0bd0f90e152889677d23cc96346abc85de7b Mon Sep 17 00:00:00 2001 From: Takuro Ashie Date: Tue, 17 Aug 2021 14:39:48 +0900 Subject: [PATCH] desktop-shell: Fix wrong initial position of input panel When the surface type of input panel is set as an overlay panel, it's expected to be shown at near the input cursor. But the current implementation shows it at center-bottom on the desktop at first then move it to the correct position while typing. Signed-off-by: Takuro Ashie --- desktop-shell/input-panel.c | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/desktop-shell/input-panel.c b/desktop-shell/input-panel.c index 8292f20a..0897ffde 100644 --- a/desktop-shell/input-panel.c +++ b/desktop-shell/input-panel.c @@ -59,6 +59,23 @@ input_panel_slide_done(struct weston_view_animation *animation, void *data) ipsurf->anim = NULL; } +static int +calc_input_panel_position(struct input_panel_surface *ip_surface, float *x, float*y) +{ + struct desktop_shell *shell = ip_surface->shell; + if (ip_surface->panel) { + struct weston_view *view = get_default_view(shell->text_input.surface); + if (view == NULL) + return -1; + *x = view->geometry.x + shell->text_input.cursor_rectangle.x2; + *y = view->geometry.y + shell->text_input.cursor_rectangle.y2; + } else { + *x = ip_surface->output->x + (ip_surface->output->width - ip_surface->surface->width) / 2; + *y = ip_surface->output->y + ip_surface->output->height - ip_surface->surface->height; + } + return 0; +} + static void show_input_panel_surface(struct input_panel_surface *ipsurf) { @@ -77,8 +94,8 @@ show_input_panel_surface(struct input_panel_surface *ipsurf) if (!focus) continue; 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; + if (calc_input_panel_position(ipsurf, &x, &y)) + continue; weston_view_set_position(ipsurf->view, x, y); } @@ -170,23 +187,13 @@ input_panel_committed(struct weston_surface *surface, int32_t sx, int32_t sy) { struct input_panel_surface *ip_surface = surface->committed_private; struct desktop_shell *shell = ip_surface->shell; - struct weston_view *view; float x, y; if (surface->width == 0) return; - if (ip_surface->panel) { - view = get_default_view(shell->text_input.surface); - if (view == NULL) - return; - x = view->geometry.x + shell->text_input.cursor_rectangle.x2; - y = view->geometry.y + shell->text_input.cursor_rectangle.y2; - } else { - x = ip_surface->output->x + (ip_surface->output->width - surface->width) / 2; - y = ip_surface->output->y + ip_surface->output->height - surface->height; - } - + if (calc_input_panel_position(ip_surface, &x, &y)) + return; weston_view_set_position(ip_surface->view, x, y); if (!weston_surface_is_mapped(surface) && shell->showing_input_panels)