diff options
| author | 2024-07-11 10:44:44 +0200 | |
|---|---|---|
| committer | 2024-07-11 10:44:44 +0200 | |
| commit | 1c1bee6fd822db1e5fdf45953d3b3970a7e50510 (patch) | |
| tree | 3e5a7904b2d84bd9b171458f755569088bbc46a5 /winit/src | |
| parent | 8c110c1be92b8ede654aa605813e758fc5195d1c (diff) | |
| download | iced-1c1bee6fd822db1e5fdf45953d3b3970a7e50510.tar.gz iced-1c1bee6fd822db1e5fdf45953d3b3970a7e50510.tar.bz2 iced-1c1bee6fd822db1e5fdf45953d3b3970a7e50510.zip  | |
Finish `window::open` only when window fully opens
... and run initial `Task` after `window::open` for
applications. This fixes certain race conditions.
Diffstat (limited to '')
| -rw-r--r-- | winit/src/program.rs | 47 | 
1 files changed, 22 insertions, 25 deletions
diff --git a/winit/src/program.rs b/winit/src/program.rs index 1590cd3c..e7d3294d 100644 --- a/winit/src/program.rs +++ b/winit/src/program.rs @@ -202,6 +202,16 @@ where      };      let (program, task) = runtime.enter(|| P::new(flags)); +    let is_daemon = window_settings.is_none(); + +    let task = if let Some(window_settings) = window_settings { +        let mut task = Some(task); + +        runtime::window::open(window_settings) +            .then(move |_| task.take().unwrap_or(Task::none())) +    } else { +        task +    };      if let Some(stream) = runtime::task::into_stream(task) {          runtime.run(stream); @@ -223,6 +233,7 @@ where          boot_receiver,          event_receiver,          control_sender, +        is_daemon,      ));      let context = task::Context::from_waker(task::noop_waker_ref()); @@ -231,7 +242,7 @@ where          instance: std::pin::Pin<Box<F>>,          context: task::Context<'static>,          id: Option<String>, -        boot: Option<BootConfig<Message, C>>, +        boot: Option<BootConfig<C>>,          sender: mpsc::UnboundedSender<Event<Action<Message>>>,          receiver: mpsc::UnboundedReceiver<Control>,          error: Option<Error>, @@ -242,11 +253,9 @@ where          queued_events: Vec<Event<Action<Message>>>,      } -    struct BootConfig<Message: 'static, C> { -        proxy: Proxy<Message>, +    struct BootConfig<C> {          sender: oneshot::Sender<Boot<C>>,          fonts: Vec<Cow<'static, [u8]>>, -        window_settings: Option<window::Settings>,          graphics_settings: graphics::Settings,      } @@ -255,10 +264,8 @@ where          context,          id: settings.id,          boot: Some(BootConfig { -            proxy,              sender: boot_sender,              fonts: settings.fonts, -            window_settings,              graphics_settings,          }),          sender: event_sender, @@ -280,10 +287,8 @@ where      {          fn resumed(&mut self, event_loop: &winit::event_loop::ActiveEventLoop) {              let Some(BootConfig { -                mut proxy,                  sender,                  fonts, -                window_settings,                  graphics_settings,              }) = self.boot.take()              else { @@ -316,23 +321,10 @@ where                          compositor,                          clipboard,                          window: window.id(), -                        is_daemon: window_settings.is_none(),                      })                      .ok()                      .expect("Send boot event"); -                if let Some(window_settings) = window_settings { -                    let (sender, _receiver) = oneshot::channel(); - -                    proxy.send_action(Action::Window( -                        runtime::window::Action::Open( -                            window::Id::unique(), -                            window_settings, -                            sender, -                        ), -                    )); -                } -                  Ok::<_, graphics::Error>(())              }; @@ -490,6 +482,7 @@ where                                  settings,                                  title,                                  monitor, +                                on_open,                              } => {                                  let exit_on_close_request =                                      settings.exit_on_close_request; @@ -567,6 +560,7 @@ where                                          window,                                          exit_on_close_request,                                          make_visible: visible, +                                        on_open,                                      },                                  );                              } @@ -608,7 +602,6 @@ struct Boot<C> {      compositor: C,      clipboard: Clipboard,      window: winit::window::WindowId, -    is_daemon: bool,  }  enum Event<Message: 'static> { @@ -617,6 +610,7 @@ enum Event<Message: 'static> {          window: winit::window::Window,          exit_on_close_request: bool,          make_visible: bool, +        on_open: oneshot::Sender<window::Id>,      },      EventLoopAwakened(winit::event::Event<Message>),  } @@ -629,6 +623,7 @@ enum Control {          settings: window::Settings,          title: String,          monitor: Option<winit::monitor::MonitorHandle>, +        on_open: oneshot::Sender<window::Id>,      },  } @@ -640,6 +635,7 @@ async fn run_instance<P, C>(      mut boot: oneshot::Receiver<Boot<C>>,      mut event_receiver: mpsc::UnboundedReceiver<Event<Action<P::Message>>>,      mut control_sender: mpsc::UnboundedSender<Control>, +    is_daemon: bool,  ) where      P: Program + 'static,      C: Compositor<Renderer = P::Renderer> + 'static, @@ -652,7 +648,6 @@ async fn run_instance<P, C>(          mut compositor,          mut clipboard,          window: boot_window, -        is_daemon,      } = boot.try_recv().ok().flatten().expect("Receive boot");      let mut window_manager = WindowManager::new(); @@ -673,6 +668,7 @@ async fn run_instance<P, C>(                  window,                  exit_on_close_request,                  make_visible, +                on_open,              } => {                  let window = window_manager.insert(                      id, @@ -708,6 +704,8 @@ async fn run_instance<P, C>(                          size: window.size(),                      }),                  )); + +                let _ = on_open.send(id);              }              Event::EventLoopAwakened(event) => {                  match event { @@ -1180,10 +1178,9 @@ fn run_action<P, C>(                          settings,                          title: program.title(id),                          monitor, +                        on_open: channel,                      })                      .expect("Send control action"); - -                let _ = channel.send(id);              }              window::Action::Close(id) => {                  let _ = window_manager.remove(id);  | 
