@@ -645,6 +645,12 @@ async fn main() -> Result<(), BoxError> {
645645 // Deal with settings dialog results
646646 while let Ok ( new_settings) = settings_rx. try_recv ( ) {
647647 let tun2proxy_enable = new_settings. tun2proxy_enable . unwrap_or_default ( ) ;
648+ let equal_log_level = state
649+ . borrow ( )
650+ . system_settings
651+ . as_ref ( )
652+ . map ( |s| s. is_log_level_equal ( & new_settings) )
653+ . unwrap_or ( false ) ;
648654 state. borrow_mut ( ) . system_settings = Some ( new_settings) ;
649655 if tun2proxy_enable && !run_as:: is_elevated ( ) {
650656 if let Ok ( status) = core:: restart_as_admin ( ) {
@@ -657,8 +663,18 @@ async fn main() -> Result<(), BoxError> {
657663 . set_level ( rfd:: MessageLevel :: Error )
658664 . show ( ) ;
659665 }
666+ } else if !equal_log_level {
667+ rfd:: MessageDialog :: new ( )
668+ . set_title ( "Restart Required" )
669+ . set_description ( "Log level changes will take effect after restart." )
670+ . set_level ( rfd:: MessageLevel :: Info )
671+ . show ( ) ;
672+ save_final_app_state ( & state, & remote_nodes, & win, & current_node_index) ?;
673+ if let Err ( e) = run_as:: restart_self ( None , false ) {
674+ log:: error!( "Failed to restart self: {e}" ) ;
675+ }
676+ :: fltk:: app:: quit ( ) ;
660677 }
661- log:: info!( "Settings updated. Log filter changes will take effect after restart." ) ;
662678 }
663679
664680 // Handle results from node details dialogs
@@ -725,11 +741,21 @@ async fn main() -> Result<(), BoxError> {
725741 }
726742 }
727743
728- state. borrow_mut ( ) . remote_nodes = remote_nodes. borrow ( ) . clone ( ) ;
729- state. borrow_mut ( ) . window . refresh_window ( & win) ;
730- state. borrow_mut ( ) . current_node_index = * current_node_index. borrow ( ) ;
744+ fn save_final_app_state (
745+ state : & Rc < RefCell < states_manager:: AppState > > ,
746+ remote_nodes : & Rc < RefCell < Vec < OverTlsNode > > > ,
747+ win : & Window ,
748+ current_node_index : & Rc < RefCell < Option < usize > > > ,
749+ ) -> std:: io:: Result < ( ) > {
750+ state. borrow_mut ( ) . remote_nodes = remote_nodes. borrow ( ) . clone ( ) ;
751+ state. borrow_mut ( ) . window . refresh_window ( win) ;
752+ state. borrow_mut ( ) . current_node_index = * current_node_index. borrow ( ) ;
753+
754+ states_manager:: save_app_state ( & state. borrow ( ) ) ?;
755+ Ok ( ( ) )
756+ }
731757
732- states_manager :: save_app_state ( & state. borrow ( ) ) ?;
758+ save_final_app_state ( & state, & remote_nodes , & win , & current_node_index ) ?;
733759
734760 if let Err ( e) = stop_running_node ( & running_token, & running_handle) {
735761 log:: debug!( "Failed to stop running node: {e}" ) ;
0 commit comments