@@ -160,7 +160,7 @@ async fn main() -> Result<(), BoxError> {
160160 let running_token_run = running_token. clone ( ) ;
161161 let running_handle_run = running_handle. clone ( ) ;
162162 let state_clone = state. clone ( ) ;
163- menubar. add ( "&Main/Run" , Shortcut :: None , MenuFlag :: Normal , move |_m| {
163+ menubar. add ( "&Main/Run\t " , Shortcut :: Alt | 'r' , MenuFlag :: Normal , move |_m| {
164164 let Some ( idx) = * current_node_index_run. borrow ( ) else {
165165 rfd:: MessageDialog :: new ( )
166166 . set_title ( "Error" )
@@ -214,20 +214,33 @@ async fn main() -> Result<(), BoxError> {
214214 let title = config. remarks . clone ( ) . unwrap_or_default ( ) ;
215215 let token = overtls:: CancellationToken :: new ( ) ;
216216 * running_token_run. lock ( ) . unwrap ( ) = Some ( token. clone ( ) ) ;
217- let handle = std:: thread:: spawn ( move || core:: main_task_block ( config, tun2proxy_args, token) ) ;
217+ let title_clone = title. clone ( ) ;
218+ let running_token = running_token_run. clone ( ) ;
219+ let running_handle = running_handle_run. clone ( ) ;
220+ let handle = std:: thread:: spawn ( move || {
221+ let res = core:: main_task_block ( config, tun2proxy_args, token) ;
222+ if let Err ( e) = & res {
223+ log:: error!( "Node '{title_clone}' exited with error: {e}" ) ;
224+ }
225+ if let Ok ( mut token) = running_token. try_lock ( )
226+ && let Some ( token) = token. take ( )
227+ {
228+ token. cancel ( ) ;
229+ }
230+ if let Ok ( mut handle) = running_handle. try_lock ( ) {
231+ handle. take ( ) ;
232+ }
233+ res
234+ } ) ;
218235 * running_handle_run. lock ( ) . unwrap ( ) = Some ( handle) ;
219236 log:: debug!( "Node '{title}' is starting..." ) ;
220237 } ) ;
221238
222239 let running_token_stop = running_token. clone ( ) ;
223240 let running_handle_stop = running_handle. clone ( ) ;
224- menubar. add ( "&Main/Stop" , Shortcut :: None , MenuFlag :: MenuDivider , move |_m| {
241+ menubar. add ( "&Main/Stop\t " , Shortcut :: Alt | 's' , MenuFlag :: MenuDivider , move |_m| {
225242 if let Err ( e) = stop_running_node ( & running_token_stop, & running_handle_stop) {
226- rfd:: MessageDialog :: new ( )
227- . set_title ( "Error" )
228- . set_description ( format ! ( "Failed to stop running node: {e}" ) )
229- . set_level ( rfd:: MessageLevel :: Error )
230- . show ( ) ;
243+ log:: error!( "Failed to stop running node: {e}" ) ;
231244 }
232245 } ) ;
233246
@@ -240,13 +253,13 @@ async fn main() -> Result<(), BoxError> {
240253 if let Some ( token) = running_token. lock ( ) . map_err ( f1) ?. take ( ) {
241254 token. cancel ( ) ;
242255 } else {
243- err_info = Some ( "No running node." ) ;
256+ err_info = Some ( "No running node." . to_string ( ) ) ;
244257 }
245258 let f2 = |e| std:: io:: Error :: other ( format ! ( "running_handle lock error: {e}" ) ) ;
246259 if let Some ( handle) = running_handle. lock ( ) . map_err ( f2) ?. take ( )
247- && util:: thread_handle_join_with_timeout ( handle, 1000 ) . is_none ( )
260+ && let Err ( e ) = util:: thread_handle_join_with_timeout ( handle, 3000 )
248261 {
249- err_info = Some ( "Node thread did not finish in 1 second, force exit." ) ;
262+ err_info = Some ( format ! ( "Failed to join running thread: {e:?}" ) ) ;
250263 }
251264 err_info. map ( |e| Err ( std:: io:: Error :: other ( e) ) ) . unwrap_or ( Ok ( ( ) ) )
252265 }
@@ -722,8 +735,10 @@ async fn main() -> Result<(), BoxError> {
722735 style_buffer. set_text ( new_style) ;
723736 }
724737 log_display. set_highlight_data ( style_buffer. clone ( ) , style_table) ;
725- let lines = log_buffer. count_lines ( 0 , log_buffer. length ( ) ) ;
726- log_display. scroll ( lines, 0 ) ;
738+ if state. borrow ( ) . system_settings . as_ref ( ) . unwrap ( ) . log_auto_scroll . unwrap_or ( true ) {
739+ let lines = log_buffer. count_lines ( 0 , log_buffer. length ( ) ) ;
740+ log_display. scroll ( lines, 0 ) ;
741+ }
727742 }
728743 }
729744 }
0 commit comments