summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Ryan Dwyer <ryandwyer1@gmail.com>2018-10-22 18:36:47 +1000
committerLibravatar Ryan Dwyer <ryandwyer1@gmail.com>2018-10-22 18:36:47 +1000
commit6deb7268738699ba9d654db5aba53866184f1fda (patch)
tree2b0aba9ba2012952ad774aab8a120cb0a5d9ddeb
parentMerge pull request #2913 from emersion/fix-swaybar-hotplug (diff)
downloadsway-6deb7268738699ba9d654db5aba53866184f1fda.tar.gz
sway-6deb7268738699ba9d654db5aba53866184f1fda.tar.zst
sway-6deb7268738699ba9d654db5aba53866184f1fda.zip
Fix crash when quitting a QT app on the wayland backend using menu
QT unmaps the view before destroying the popup. We destroyed the popup in response to the view unmapping, but then we'd attempt to destroy it a second time which caused a crash. The patch removes the listener. I tested it with GTK as well, and can confirm the popup is still being destroyed.
-rw-r--r--include/sway/tree/view.h1
-rw-r--r--sway/tree/view.c11
2 files changed, 0 insertions, 12 deletions
diff --git a/include/sway/tree/view.h b/include/sway/tree/view.h
index dc1f0b02..a0b4dd46 100644
--- a/include/sway/tree/view.h
+++ b/include/sway/tree/view.h
@@ -226,7 +226,6 @@ struct sway_view_child {
226 struct wl_listener surface_map; 226 struct wl_listener surface_map;
227 struct wl_listener surface_unmap; 227 struct wl_listener surface_unmap;
228 struct wl_listener surface_destroy; 228 struct wl_listener surface_destroy;
229 struct wl_listener view_unmap;
230}; 229};
231 230
232struct sway_xdg_popup_v6 { 231struct sway_xdg_popup_v6 {
diff --git a/sway/tree/view.c b/sway/tree/view.c
index b23afb97..a8486dd7 100644
--- a/sway/tree/view.c
+++ b/sway/tree/view.c
@@ -731,13 +731,6 @@ static void view_child_handle_surface_destroy(struct wl_listener *listener,
731 view_child_destroy(child); 731 view_child_destroy(child);
732} 732}
733 733
734static void view_child_handle_view_unmap(struct wl_listener *listener,
735 void *data) {
736 struct sway_view_child *child =
737 wl_container_of(listener, child, view_unmap);
738 view_child_destroy(child);
739}
740
741static void view_init_subsurfaces(struct sway_view *view, 734static void view_init_subsurfaces(struct sway_view *view,
742 struct wlr_surface *surface) { 735 struct wlr_surface *surface) {
743 struct wlr_subsurface *subsurface; 736 struct wlr_subsurface *subsurface;
@@ -779,9 +772,6 @@ void view_child_init(struct sway_view_child *child,
779 child->surface_map.notify = view_child_handle_surface_map; 772 child->surface_map.notify = view_child_handle_surface_map;
780 child->surface_unmap.notify = view_child_handle_surface_unmap; 773 child->surface_unmap.notify = view_child_handle_surface_unmap;
781 774
782 wl_signal_add(&view->events.unmap, &child->view_unmap);
783 child->view_unmap.notify = view_child_handle_view_unmap;
784
785 struct sway_output *output = child->view->container->workspace->output; 775 struct sway_output *output = child->view->container->workspace->output;
786 wlr_surface_send_enter(child->surface, output->wlr_output); 776 wlr_surface_send_enter(child->surface, output->wlr_output);
787 777
@@ -791,7 +781,6 @@ void view_child_init(struct sway_view_child *child,
791void view_child_destroy(struct sway_view_child *child) { 781void view_child_destroy(struct sway_view_child *child) {
792 wl_list_remove(&child->surface_commit.link); 782 wl_list_remove(&child->surface_commit.link);
793 wl_list_remove(&child->surface_destroy.link); 783 wl_list_remove(&child->surface_destroy.link);
794 wl_list_remove(&child->view_unmap.link);
795 784
796 if (child->impl && child->impl->destroy) { 785 if (child->impl && child->impl->destroy) {
797 child->impl->destroy(child); 786 child->impl->destroy(child);