From 8cc992d3b8ef746386f1cc57d11d5f029f074b79 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Fri, 28 Mar 2025 20:04:01 +0100 Subject: [PATCH] Allow user thread to return a result --- crates/fj-viewer/src/viewer.rs | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/crates/fj-viewer/src/viewer.rs b/crates/fj-viewer/src/viewer.rs index 558ee26cb..96456d684 100644 --- a/crates/fj-viewer/src/viewer.rs +++ b/crates/fj-viewer/src/viewer.rs @@ -1,4 +1,4 @@ -use std::{collections::BTreeMap, thread}; +use std::{collections::BTreeMap, panic, thread}; use fj_interop::TriMesh; use futures::executor::block_on; @@ -32,9 +32,12 @@ use crate::{ /// /// This function should be called from the application's main thread, or /// displaying models might end up not working correctly. -pub fn make_viewer_and_spawn_thread( - f: impl FnOnce(Viewer) + Send + 'static, -) -> Result<(), Error> { +pub fn make_viewer_and_spawn_thread( + f: impl FnOnce(Viewer) -> R + Send + 'static, +) -> Result +where + R: Send + 'static, +{ let mut builder = EventLoop::with_user_event(); let event_loop = builder.build()?; @@ -43,11 +46,16 @@ pub fn make_viewer_and_spawn_thread( }; let proxy = event_loop.create_proxy(); - thread::spawn(|| f(Viewer { event_loop: proxy })); + let handle = thread::spawn(|| f(Viewer { event_loop: proxy })); event_loop.run_app(&mut display_state)?; - Ok(()) + let result = match handle.join() { + Ok(result) => result, + Err(payload) => panic::resume_unwind(payload), + }; + + Ok(result) } /// # Fornjot model viewer