mirror of
https://gitlab.freedesktop.org/wayland/weston.git
synced 2026-05-08 22:58:11 +02:00
desktop-shell: handle redundant panels
If for some reason the helper client weston-desktop-shell would create more than one panel surface for the same weston_output, this code would corrupt the surface destroy listener list by adding a link already in one list into another list. Instead, do not store the new, redundant panel surface and do not subscribe to its destruction. Also, tell the helper that the surface is redundant by configuring it with a 0x0 size, so that we don't waste memory on a panel that is never used. (Clone mode is a valid reason why weston-desktop-shell could do that.) Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk> Reviewed-by: Daniel Stone <daniels@collabora.com>
This commit is contained in:
parent
ff5e88d276
commit
1a0239e40f
1 changed files with 16 additions and 7 deletions
|
|
@ -3068,16 +3068,25 @@ desktop_shell_set_panel(struct wl_client *client,
|
|||
weston_surface_set_label_func(surface, panel_get_label);
|
||||
surface->output = weston_output_from_resource(output_resource);
|
||||
view->output = surface->output;
|
||||
weston_desktop_shell_send_configure(resource, 0,
|
||||
surface_resource,
|
||||
surface->output->width,
|
||||
surface->output->height);
|
||||
|
||||
sh_output = find_shell_output_from_weston_output(shell, surface->output);
|
||||
sh_output->panel_surface = surface;
|
||||
if (sh_output->panel_surface) {
|
||||
/* The output already has a panel, tell our helper
|
||||
* there is no need for another one. */
|
||||
weston_desktop_shell_send_configure(resource, 0,
|
||||
surface_resource,
|
||||
0, 0);
|
||||
} else {
|
||||
weston_desktop_shell_send_configure(resource, 0,
|
||||
surface_resource,
|
||||
surface->output->width,
|
||||
surface->output->height);
|
||||
|
||||
sh_output->panel_surface_listener.notify = handle_panel_surface_destroy;
|
||||
wl_signal_add(&surface->destroy_signal, &sh_output->panel_surface_listener);
|
||||
sh_output->panel_surface = surface;
|
||||
|
||||
sh_output->panel_surface_listener.notify = handle_panel_surface_destroy;
|
||||
wl_signal_add(&surface->destroy_signal, &sh_output->panel_surface_listener);
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue