aboutsummaryrefslogtreecommitdiffstats
path: root/sway/tree/view.c
diff options
context:
space:
mode:
authorLibravatar Brian Ashworth <bosrsf04@gmail.com>2019-03-09 02:23:20 -0500
committerLibravatar emersion <contact@emersion.fr>2019-03-11 10:02:52 +0100
commit017a7c4da169ace601f282c87a9aaabc138a34d3 (patch)
treea5c0370608ad04223fecdcd7890c3b1559dff39e /sway/tree/view.c
parentdetect_proprietary: use strncmp (diff)
downloadsway-017a7c4da169ace601f282c87a9aaabc138a34d3.tar.gz
sway-017a7c4da169ace601f282c87a9aaabc138a34d3.tar.zst
sway-017a7c4da169ace601f282c87a9aaabc138a34d3.zip
sway_view_child: add listener for view unmap
Since not all child views's have an unmap event, it is possible for it to still be mapped (default state) in the destruction handler. When the destruction handler is called, the corresponding view may have already been freed and the memory location reallocated. This adds a listener for the view unmapping and removes the mapped status. This ensures that the child view is damaged due to destruction while the view still exists and not after.
Diffstat (limited to 'sway/tree/view.c')
-rw-r--r--sway/tree/view.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/sway/tree/view.c b/sway/tree/view.c
index 14cc07d9..4759c998 100644
--- a/sway/tree/view.c
+++ b/sway/tree/view.c
@@ -820,6 +820,14 @@ static void view_child_handle_surface_unmap(struct wl_listener *listener,
820 child->mapped = false; 820 child->mapped = false;
821} 821}
822 822
823static void view_child_handle_view_unmap(struct wl_listener *listener,
824 void *data) {
825 struct sway_view_child *child =
826 wl_container_of(listener, child, view_unmap);
827 view_child_damage(child, true);
828 child->mapped = false;
829}
830
823void view_child_init(struct sway_view_child *child, 831void view_child_init(struct sway_view_child *child,
824 const struct sway_view_child_impl *impl, struct sway_view *view, 832 const struct sway_view_child_impl *impl, struct sway_view *view,
825 struct wlr_surface *surface) { 833 struct wlr_surface *surface) {
@@ -840,6 +848,9 @@ void view_child_init(struct sway_view_child *child,
840 child->surface_map.notify = view_child_handle_surface_map; 848 child->surface_map.notify = view_child_handle_surface_map;
841 child->surface_unmap.notify = view_child_handle_surface_unmap; 849 child->surface_unmap.notify = view_child_handle_surface_unmap;
842 850
851 wl_signal_add(&view->events.unmap, &child->view_unmap);
852 child->view_unmap.notify = view_child_handle_view_unmap;
853
843 struct sway_output *output = child->view->container->workspace->output; 854 struct sway_output *output = child->view->container->workspace->output;
844 wlr_surface_send_enter(child->surface, output->wlr_output); 855 wlr_surface_send_enter(child->surface, output->wlr_output);
845 856
@@ -853,6 +864,7 @@ void view_child_destroy(struct sway_view_child *child) {
853 864
854 wl_list_remove(&child->surface_commit.link); 865 wl_list_remove(&child->surface_commit.link);
855 wl_list_remove(&child->surface_destroy.link); 866 wl_list_remove(&child->surface_destroy.link);
867 wl_list_remove(&child->view_unmap.link);
856 868
857 if (child->impl && child->impl->destroy) { 869 if (child->impl && child->impl->destroy) {
858 child->impl->destroy(child); 870 child->impl->destroy(child);