From cb1153804948d184ddcd4d0b42710639e3369971 Mon Sep 17 00:00:00 2001 From: Pekka Paalanen Date: Thu, 7 Dec 2017 12:15:01 +0200 Subject: [PATCH] clients/desktop-shell: avoid invalid sized background If for some reason the desktop-shell plugin would configure a background with an invalid size, just destroy the whole background and forget about it for this wl_output. A following patch will cause desktop-shell to configure 0x0 background when it deems the background redundant. Fortify weston-desktop-shell against not every output having a background. Signed-off-by: Pekka Paalanen Reviewed-by: Daniel Stone --- clients/desktop-shell.c | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/clients/desktop-shell.c b/clients/desktop-shell.c index 12bc971..8723411 100644 --- a/clients/desktop-shell.c +++ b/clients/desktop-shell.c @@ -92,6 +92,8 @@ struct surface { int32_t width, int32_t height); }; +struct output; + struct panel { struct surface base; struct window *window; @@ -106,6 +108,9 @@ struct panel { struct background { struct surface base; + + struct output *owner; + struct window *window; struct widget *widget; int painted; @@ -813,14 +818,26 @@ background_draw(struct widget *widget, void *data) } static void +background_destroy(struct background *background); + +static void background_configure(void *data, struct weston_desktop_shell *desktop_shell, uint32_t edges, struct window *window, int32_t width, int32_t height) { + struct output *owner; struct background *background = (struct background *) window_get_user_data(window); + if (width < 1 || height < 1) { + /* Shell plugin configures 0x0 for redundant background. */ + owner = background->owner; + background_destroy(background); + owner->background = NULL; + return; + } + widget_schedule_resize(background->widget, width, height); } @@ -1094,13 +1111,14 @@ background_destroy(struct background *background) } static struct background * -background_create(struct desktop *desktop) +background_create(struct desktop *desktop, struct output *output) { struct background *background; struct weston_config_section *s; char *type; background = xzalloc(sizeof *background); + background->owner = output; background->base.configure = background_configure; background->window = window_create_custom(desktop->display); background->widget = window_add_widget(background->window, background); @@ -1178,7 +1196,8 @@ grab_surface_create(struct desktop *desktop) static void output_destroy(struct output *output) { - background_destroy(output->background); + if (output->background) + background_destroy(output->background); if (output->panel) panel_destroy(output->panel); wl_output_destroy(output->output); @@ -1212,7 +1231,8 @@ output_handle_geometry(void *data, if (output->panel) window_set_buffer_transform(output->panel->window, transform); - window_set_buffer_transform(output->background->window, transform); + if (output->background) + window_set_buffer_transform(output->background->window, transform); } static void @@ -1240,7 +1260,8 @@ output_handle_scale(void *data, if (output->panel) window_set_buffer_scale(output->panel->window, scale); - window_set_buffer_scale(output->background->window, scale); + if (output->background) + window_set_buffer_scale(output->background->window, scale); } static const struct wl_output_listener output_listener = { @@ -1262,7 +1283,7 @@ output_init(struct output *output, struct desktop *desktop) output->output, surface); } - output->background = background_create(desktop); + output->background = background_create(desktop, output); surface = window_get_wl_surface(output->background->window); weston_desktop_shell_set_background(desktop->shell, output->output, surface); -- 2.7.4