From 0636ac307e900c08fe6b90784637d6c9ca46601a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kristian=20H=C3=B8gsberg?= Date: Wed, 27 Jun 2012 10:22:15 -0400 Subject: [PATCH] shell: Make input_panel just a regular wl_surface --- clients/keyboard.c | 5 +- protocol/desktop-shell.xml | 2 +- src/shell.c | 151 +++++++++++++++------------------------------ 3 files changed, 52 insertions(+), 106 deletions(-) diff --git a/clients/keyboard.c b/clients/keyboard.c index f7bddeb..9fdd8cc 100644 --- a/clients/keyboard.c +++ b/clients/keyboard.c @@ -156,11 +156,10 @@ keyboard_create(struct output *output, struct virtual_keyboard *virtual_keyboard memset(keyboard, 0, sizeof *keyboard); keyboard->keyboard = virtual_keyboard; - keyboard->window = window_create(virtual_keyboard->display); + keyboard->window = window_create_custom(virtual_keyboard->display); keyboard->widget = window_add_widget(keyboard->window, keyboard); window_set_title(keyboard->window, "Virtual keyboard"); - window_set_custom(keyboard->window); window_set_user_data(keyboard->window, keyboard); keyboard->cx = 40; @@ -173,7 +172,7 @@ keyboard_create(struct output *output, struct virtual_keyboard *virtual_keyboard window_schedule_resize(keyboard->window, keyboard->cx * 10, keyboard->cy * 5); input_panel_set_surface(virtual_keyboard->input_panel, - window_get_wl_shell_surface(keyboard->window), + window_get_wl_surface(keyboard->window), output_get_wl_output(output)); } diff --git a/protocol/desktop-shell.xml b/protocol/desktop-shell.xml index 01cc6a9..687f169 100644 --- a/protocol/desktop-shell.xml +++ b/protocol/desktop-shell.xml @@ -74,7 +74,7 @@ A keybaord surface is only shown, when a text model is active - + diff --git a/src/shell.c b/src/shell.c index cd5717f..1d82e43 100644 --- a/src/shell.c +++ b/src/shell.c @@ -128,9 +128,6 @@ struct desktop_shell { enum shell_surface_type { SHELL_SURFACE_NONE, - - SHELL_SURFACE_INPUT_PANEL, - SHELL_SURFACE_TOPLEVEL, SHELL_SURFACE_TRANSIENT, SHELL_SURFACE_FULLSCREEN, @@ -1221,10 +1218,6 @@ reset_shell_surface_type(struct shell_surface *surface) surface->saved_x, surface->saved_y); break; - case SHELL_SURFACE_INPUT_PANEL: - wl_list_remove(&surface->link); - wl_list_init(&surface->link); - break; case SHELL_SURFACE_NONE: case SHELL_SURFACE_TOPLEVEL: case SHELL_SURFACE_TRANSIENT: @@ -1845,33 +1838,6 @@ terminate_screensaver(struct desktop_shell *shell) } 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_slide_run(surface->surface, - surface->surface->geometry.height, 0, - NULL, NULL); -} - -static void -hide_input_panel(struct desktop_shell *shell, struct shell_surface *surface) -{ - weston_surface_damage_below(surface->surface); - wl_list_remove(&surface->surface->layer_link); - wl_list_init(&surface->surface->layer_link); - surface->surface->output = NULL; - - weston_compositor_schedule_repaint(surface->surface->compositor); -} - -static void configure_static_surface(struct weston_surface *es, struct weston_layer *layer) { struct weston_surface *s, *next; @@ -2084,17 +2050,9 @@ move_binding(struct wl_seat *seat, uint32_t time, uint32_t button, void *data) return; shsurf = get_shell_surface(surface); - if (shsurf == NULL) + if (shsurf == NULL || shsurf->type == SHELL_SURFACE_FULLSCREEN) return; - switch (shsurf->type) { - case SHELL_SURFACE_FULLSCREEN: - case SHELL_SURFACE_INPUT_PANEL: - return; - default: - break; - } - surface_move(shsurf, (struct weston_seat *) seat); } @@ -2111,17 +2069,9 @@ resize_binding(struct wl_seat *seat, uint32_t time, uint32_t button, void *data) return; shsurf = get_shell_surface(surface); - if (!shsurf) + if (!shsurf || shsurf->type == SHELL_SURFACE_FULLSCREEN) return; - switch (shsurf->type) { - case SHELL_SURFACE_FULLSCREEN: - case SHELL_SURFACE_INPUT_PANEL: - return; - default: - break; - } - weston_surface_from_global(surface, wl_fixed_to_int(seat->pointer->grab_x), wl_fixed_to_int(seat->pointer->grab_y), @@ -2345,17 +2295,9 @@ rotate_binding(struct wl_seat *seat, uint32_t time, uint32_t button, return; surface = get_shell_surface(base_surface); - if (!surface) + if (!surface || surface->type == SHELL_SURFACE_FULLSCREEN) return; - switch (surface->type) { - case SHELL_SURFACE_FULLSCREEN: - case SHELL_SURFACE_INPUT_PANEL: - return; - default: - break; - } - rotate = malloc(sizeof *rotate); if (!rotate) return; @@ -2419,9 +2361,6 @@ activate(struct desktop_shell *shell, struct weston_surface *es, weston_surface_activate(es, seat); switch (get_shell_surface_type(es)) { - case SHELL_SURFACE_INPUT_PANEL: - break; - case SHELL_SURFACE_FULLSCREEN: /* should on top of panels */ shell_stack_fullscreen(get_shell_surface(es)); @@ -2468,13 +2407,8 @@ click_to_activate_binding(struct wl_seat *seat, uint32_t time, uint32_t button, if (is_black_surface(focus, &upper)) focus = upper; - switch (get_shell_surface_type(focus)) { - case SHELL_SURFACE_INPUT_PANEL: - case SHELL_SURFACE_NONE: - return; - default: - break; - } + if (get_shell_surface_type(focus) == SHELL_SURFACE_NONE) + return; if (seat->pointer->grab == &seat->pointer->default_grab) activate(shell, focus, ws); @@ -2547,23 +2481,37 @@ show_input_panels(struct wl_listener *listener, void *data) { struct desktop_shell *shell = container_of(listener, struct desktop_shell, show_input_panel_listener); - struct shell_surface *priv; + struct weston_surface *surface, *next; - wl_list_for_each(priv, &shell->input_panel.surfaces, link) { - show_input_panel(shell, priv); + wl_list_for_each_safe(surface, next, + &shell->input_panel.surfaces, layer_link) { + wl_list_remove(&surface->layer_link); + wl_list_insert(&shell->panel_layer.surface_list, + &surface->layer_link); + weston_surface_assign_output(surface); + weston_surface_damage(surface); + weston_slide_run(surface, + surface->geometry.height, 0, NULL, NULL); } } static void +input_panel_configure(struct weston_surface *surface, int32_t sx, int32_t sy); + +static void hide_input_panels(struct wl_listener *listener, void *data) { struct desktop_shell *shell = container_of(listener, struct desktop_shell, hide_input_panel_listener); - struct shell_surface *priv; - - wl_list_for_each(priv, &shell->input_panel.surfaces, link) { - hide_input_panel(shell, priv); - } + struct weston_surface *surface, *next; + + wl_list_for_each_safe(surface, next, + &shell->panel_layer.surface_list, layer_link) + if (surface->configure == input_panel_configure) { + weston_surface_unmap(surface); + wl_list_insert(&shell->input_panel.surfaces, + &surface->layer_link); + } } static void @@ -2578,17 +2526,6 @@ center_on_output(struct weston_surface *surface, struct weston_output *output) surface->buffer->height); } - -static void -bottom_center_on_output(struct weston_surface *surface, struct weston_output *output) -{ - struct weston_mode *mode = output->current; - GLfloat x = (mode->width - surface->geometry.width) / 2; - GLfloat y = mode->height - surface->geometry.height; - - weston_surface_set_position(surface, output->x + x, output->y + y); -} - static void map(struct desktop_shell *shell, struct weston_surface *surface, int32_t width, int32_t height, int32_t sx, int32_t sy) @@ -2620,11 +2557,6 @@ map(struct desktop_shell *shell, struct weston_surface *surface, weston_surface_set_position(surface, surface->output->x, surface->output->y + panel_height); break; - case SHELL_SURFACE_INPUT_PANEL: - bottom_center_on_output(surface, get_default_output(compositor)); - /* 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: @@ -2645,7 +2577,6 @@ map(struct desktop_shell *shell, struct weston_surface *surface, break; case SHELL_SURFACE_FULLSCREEN: case SHELL_SURFACE_NONE: - case SHELL_SURFACE_INPUT_PANEL: break; default: ws = get_current_workspace(shell); @@ -2923,20 +2854,36 @@ bind_screensaver(struct wl_client *client, } static void +input_panel_configure(struct weston_surface *surface, int32_t sx, int32_t sy) +{ + struct weston_mode *mode = surface->output->current; + GLfloat x = (mode->width - surface->buffer->width) / 2; + GLfloat y = mode->height - surface->buffer->height; + + /* Don't map the input panel here, wait for + * show_input_panels signal. */ + + weston_surface_configure(surface, + surface->output->x + x, + surface->output->y + y, + surface->buffer->width, + surface->buffer->height); +} + +static void input_panel_set_surface(struct wl_client *client, struct wl_resource *resource, - struct wl_resource *shell_surface_resource, + struct wl_resource *surface_resource, struct wl_resource *output_resource) { struct desktop_shell *shell = resource->data; - struct shell_surface *surface = shell_surface_resource->data; + struct weston_surface *surface = surface_resource->data; struct weston_output *output = output_resource->data; - surface->next_type = SHELL_SURFACE_INPUT_PANEL; - - surface->fullscreen_output = output; + surface->configure = input_panel_configure; + surface->private = shell; surface->output = output; - wl_list_insert(shell->input_panel.surfaces.prev, &surface->link); + wl_list_insert(shell->input_panel.surfaces.prev, &surface->layer_link); } static const struct input_panel_interface input_panel_implementation = { -- 2.7.4