From dd9576d94e482a4aa406d9475499d432f0c9a7d7 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Wed, 6 Nov 2024 15:41:22 -0800 Subject: [PATCH] subsurface_widget: Clear subsurface list after calls to `::draw()` Otherwise the `draw` call in response to `AboutToWait` causes this list to grow, and eventually hit errors in `sendmsg` due to too many buffered file descriptors from creating subsurfaces. Probably the number of places `UserInterface::draw` are called should be cleaned up. And it shouldn't be called in `AboutToWiat` like this. Some improvements could probably be made in upstream iced. --- winit/src/lib.rs | 1 + winit/src/platform_specific/mod.rs | 7 +++++++ winit/src/platform_specific/wayland/mod.rs | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/winit/src/lib.rs b/winit/src/lib.rs index 086bb8ca..a2da3372 100644 --- a/winit/src/lib.rs +++ b/winit/src/lib.rs @@ -1133,6 +1133,7 @@ async fn run_instance

( }, cursor, ); + platform_specific_handler.clear_subsurface_list(); draw_span.finish(); if let user_interface::State::Updated { diff --git a/winit/src/platform_specific/mod.rs b/winit/src/platform_specific/mod.rs index 7969c203..ef65b2c5 100644 --- a/winit/src/platform_specific/mod.rs +++ b/winit/src/platform_specific/mod.rs @@ -72,6 +72,13 @@ impl PlatformSpecific { } } + pub(crate) fn clear_subsurface_list(&mut self) { + #[cfg(all(feature = "wayland", target_os = "linux"))] + { + self.wayland.clear_subsurface_list(); + } + } + pub(crate) fn update_subsurfaces( &mut self, id: window::Id, diff --git a/winit/src/platform_specific/wayland/mod.rs b/winit/src/platform_specific/wayland/mod.rs index 81c4c0ad..ad65b52a 100644 --- a/winit/src/platform_specific/wayland/mod.rs +++ b/winit/src/platform_specific/wayland/mod.rs @@ -181,6 +181,10 @@ impl WaylandSpecific { }; } + pub(crate) fn clear_subsurface_list(&mut self) { + let _ = crate::subsurface_widget::take_subsurfaces(); + } + pub(crate) fn update_subsurfaces( &mut self, id: window::Id,