mirror of
https://github.com/labwc/labwc.git
synced 2025-10-29 05:40:24 -04:00
parent
a8df2487b2
commit
30248e1ba3
4 changed files with 35 additions and 0 deletions
|
|
@ -9,6 +9,7 @@ struct output;
|
|||
struct seat;
|
||||
|
||||
struct lab_layer_surface {
|
||||
struct wlr_layer_surface_v1 *layer_surface;
|
||||
struct wlr_scene_layer_surface_v1 *scene_layer_surface;
|
||||
struct server *server;
|
||||
struct output *output;
|
||||
|
|
|
|||
23
src/layers.c
23
src/layers.c
|
|
@ -314,6 +314,22 @@ handle_node_destroy(struct wl_listener *listener, void *data)
|
|||
{
|
||||
struct lab_layer_surface *layer =
|
||||
wl_container_of(listener, layer, node_destroy);
|
||||
|
||||
/*
|
||||
* Important:
|
||||
*
|
||||
* We can no longer access layer->scene_layer_surface anymore
|
||||
* because it has already been free'd by wlroots.
|
||||
* Set it to NULL to run into a proper crash rather than accessing
|
||||
* random free'd memory.
|
||||
*/
|
||||
layer->scene_layer_surface = NULL;
|
||||
|
||||
struct wlr_xdg_popup *popup, *tmp;
|
||||
wl_list_for_each_safe(popup, tmp, &layer->layer_surface->popups, link) {
|
||||
wlr_xdg_popup_destroy(popup);
|
||||
}
|
||||
|
||||
/*
|
||||
* TODO: Determine if this layer is being used by an exclusive client.
|
||||
* If it is, try and find another layer owned by this client to pass
|
||||
|
|
@ -377,6 +393,12 @@ handle_popup_destroy(struct wl_listener *listener, void *data)
|
|||
{
|
||||
struct lab_layer_popup *popup =
|
||||
wl_container_of(listener, popup, destroy);
|
||||
|
||||
struct wlr_xdg_popup *_popup, *tmp;
|
||||
wl_list_for_each_safe(_popup, tmp, &popup->wlr_popup->base->popups, link) {
|
||||
wlr_xdg_popup_destroy(_popup);
|
||||
}
|
||||
|
||||
wl_list_remove(&popup->destroy.link);
|
||||
wl_list_remove(&popup->new_popup.link);
|
||||
wl_list_remove(&popup->reposition.link);
|
||||
|
|
@ -565,6 +587,7 @@ handle_new_layer_surface(struct wl_listener *listener, void *data)
|
|||
}
|
||||
|
||||
struct lab_layer_surface *surface = znew(*surface);
|
||||
surface->layer_surface = layer_surface;
|
||||
|
||||
struct output *output = layer_surface->output->data;
|
||||
surface->output = output;
|
||||
|
|
|
|||
|
|
@ -73,6 +73,12 @@ static void
|
|||
handle_destroy(struct wl_listener *listener, void *data)
|
||||
{
|
||||
struct xdg_popup *popup = wl_container_of(listener, popup, destroy);
|
||||
|
||||
struct wlr_xdg_popup *_popup, *tmp;
|
||||
wl_list_for_each_safe(_popup, tmp, &popup->wlr_popup->base->popups, link) {
|
||||
wlr_xdg_popup_destroy(_popup);
|
||||
}
|
||||
|
||||
wl_list_remove(&popup->destroy.link);
|
||||
wl_list_remove(&popup->new_popup.link);
|
||||
wl_list_remove(&popup->reposition.link);
|
||||
|
|
|
|||
|
|
@ -345,6 +345,11 @@ handle_destroy(struct wl_listener *listener, void *data)
|
|||
struct xdg_toplevel_view *xdg_toplevel_view =
|
||||
xdg_toplevel_view_from_view(view);
|
||||
|
||||
struct wlr_xdg_popup *popup, *tmp;
|
||||
wl_list_for_each_safe(popup, tmp, &xdg_toplevel_view->xdg_surface->popups, link) {
|
||||
wlr_xdg_popup_destroy(popup);
|
||||
}
|
||||
|
||||
xdg_toplevel_view->xdg_surface->data = NULL;
|
||||
xdg_toplevel_view->xdg_surface = NULL;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue