[PATCH] shell: move input panels into a designated layer
Kristian Høgsberg
hoegsberg at gmail.com
Thu Aug 9 14:13:31 PDT 2012
On Thu, Aug 09, 2012 at 06:50:43PM +0200, Philipp Brüschweiler wrote:
> This makes the separation between panels and input panels clearer and
> prevents the (desktop) panel from removing existing input panels on
> redraw.
>
> The input panel layer is below the panel layer.
That looks good, thanks.
Kristian
> ---
> src/shell.c | 39 +++++++++++++++++++++++++++++----------
> 1 Datei geändert, 29 Zeilen hinzugefügt(+), 10 Zeilen entfernt(-)
>
> diff --git a/src/shell.c b/src/shell.c
> index 35b19a1..9606775 100644
> --- a/src/shell.c
> +++ b/src/shell.c
> @@ -82,6 +82,7 @@ struct desktop_shell {
> struct weston_layer panel_layer;
> struct weston_layer background_layer;
> struct weston_layer lock_layer;
> + struct weston_layer input_panel_layer;
>
> struct wl_listener pointer_focus_listener;
> struct weston_surface *grab_surface;
> @@ -96,6 +97,7 @@ struct desktop_shell {
> } child;
>
> bool locked;
> + bool showing_input_panels;
> bool prepare_event_sent;
>
> struct weston_surface *lock_surface;
> @@ -2011,7 +2013,14 @@ resume_desktop(struct desktop_shell *shell)
> &shell->fullscreen_layer.link);
> wl_list_insert(&shell->fullscreen_layer.link,
> &shell->panel_layer.link);
> - wl_list_insert(&shell->panel_layer.link, &ws->layer.link);
> + if (shell->showing_input_panels) {
> + wl_list_insert(&shell->panel_layer.link,
> + &shell->input_panel_layer.link);
> + wl_list_insert(&shell->input_panel_layer.link,
> + &ws->layer.link);
> + } else {
> + wl_list_insert(&shell->panel_layer.link, &ws->layer.link);
> + }
>
> restore_focus_state(shell, get_current_workspace(shell));
>
> @@ -2473,6 +2482,8 @@ lock(struct wl_listener *listener, void *data)
>
> wl_list_remove(&shell->panel_layer.link);
> wl_list_remove(&shell->fullscreen_layer.link);
> + if (shell->showing_input_panels)
> + wl_list_remove(&shell->input_panel_layer.link);
> wl_list_remove(&ws->layer.link);
> wl_list_insert(&shell->compositor->cursor_layer.link,
> &shell->lock_layer.link);
> @@ -2512,14 +2523,20 @@ static void
> show_input_panels(struct wl_listener *listener, void *data)
> {
> struct desktop_shell *shell =
> - container_of(listener, struct desktop_shell, show_input_panel_listener);
> + container_of(listener, struct desktop_shell,
> + show_input_panel_listener);
> struct input_panel_surface *surface, *next;
> struct weston_surface *ws;
>
> + shell->showing_input_panels = true;
> +
> + wl_list_insert(&shell->panel_layer.link,
> + &shell->input_panel_layer.link);
> +
> wl_list_for_each_safe(surface, next,
> &shell->input_panel.surfaces, link) {
> ws = surface->surface;
> - wl_list_insert(&shell->panel_layer.surface_list,
> + wl_list_insert(&shell->input_panel_layer.surface_list,
> &ws->layer_link);
> weston_surface_assign_output(ws);
> weston_surface_damage(ws);
> @@ -2528,19 +2545,20 @@ show_input_panels(struct wl_listener *listener, void *data)
> }
>
> 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);
> + container_of(listener, struct desktop_shell,
> + hide_input_panel_listener);
> struct weston_surface *surface, *next;
>
> + shell->showing_input_panels = false;
> +
> + wl_list_remove(&shell->input_panel_layer.link);
> +
> wl_list_for_each_safe(surface, next,
> - &shell->panel_layer.surface_list, layer_link)
> - if (surface->configure == input_panel_configure)
> - weston_surface_unmap(surface);
> + &shell->input_panel_layer.surface_list, layer_link)
> + weston_surface_unmap(surface);
> }
>
> static void
> @@ -3371,6 +3389,7 @@ shell_init(struct weston_compositor *ec)
> weston_layer_init(&shell->panel_layer, &shell->fullscreen_layer.link);
> weston_layer_init(&shell->background_layer, &shell->panel_layer.link);
> weston_layer_init(&shell->lock_layer, NULL);
> + weston_layer_init(&shell->input_panel_layer, NULL);
>
> wl_array_init(&shell->workspaces.array);
>
> --
> 1.7.11.4
>
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
More information about the wayland-devel
mailing list