Skip to content
Snippets Groups Projects
Commit beff0bd0 authored by Takuro Ashie's avatar Takuro Ashie
Browse files

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: default avatarTakuro Ashie <ashie@clear-code.com>
parent eb53d7c1
No related branches found
No related tags found
Loading
......@@ -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)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment