@@ -22,6 +22,7 @@ mod imp {
2222 pub struct TerminalComboRow {
2323 #[ property( get, set) ]
2424 root_store : RefCell < RootStore > ,
25+ pub selected_item_signal_handler : RefCell < Option < glib:: SignalHandlerId > > ,
2526 }
2627
2728 #[ glib:: derived_properties]
@@ -33,13 +34,15 @@ mod imp {
3334 obj. set_title ( "Preferred Terminal" ) ;
3435 obj. set_use_subtitle ( true ) ;
3536
36- obj. connect_selected_item_notify ( clone ! (
37+ let signal_handler = obj. connect_selected_item_notify ( clone ! (
3738 #[ weak]
3839 obj,
3940 move |combo| {
40- let Some ( selected) = combo. selected_item( ) . and_downcast:: <StringObject >( ) else {
41+ let Some ( selected) = combo. selected_item( ) . and_downcast:: <StringObject >( )
42+ else {
4143 return ;
4244 } ;
45+
4346 if let Some ( terminal) = obj
4447 . root_store( )
4548 . terminal_repository( )
@@ -50,6 +53,9 @@ mod imp {
5053 }
5154 ) ) ;
5255
56+ self . selected_item_signal_handler
57+ . replace ( Some ( signal_handler) ) ;
58+
5359 obj. reload_terminals ( ) ;
5460 }
5561
@@ -120,7 +126,8 @@ impl TerminalComboRow {
120126 }
121127
122128 pub fn set_selected_by_name ( & self , name : & str ) {
123- let Some ( terminals_strings) = self . model ( ) . unwrap ( ) . downcast :: < gtk:: StringList > ( ) . ok ( ) else {
129+ let Some ( terminals_strings) = self . model ( ) . unwrap ( ) . downcast :: < gtk:: StringList > ( ) . ok ( )
130+ else {
124131 return ;
125132 } ;
126133 for i in 0 ..terminals_strings. n_items ( ) {
@@ -145,11 +152,16 @@ impl TerminalComboRow {
145152 . collect :: < Vec < _ > > ( ) ;
146153
147154 let terminal_list = gtk:: StringList :: new ( & terminals) ;
148- self . set_model ( Some ( & terminal_list) ) ;
149155
150- if let Some ( selected_terminal) = self . root_store ( ) . selected_terminal ( ) {
151- self . set_selected_by_name ( & selected_terminal. name ) ;
156+ let signal_handler = self . imp ( ) . selected_item_signal_handler . borrow ( ) ;
157+ self . block_signal ( & signal_handler. as_ref ( ) . unwrap ( ) ) ;
158+ {
159+ self . set_model ( Some ( & terminal_list) ) ;
160+ if let Some ( selected_terminal) = self . root_store ( ) . selected_terminal ( ) {
161+ self . set_selected_by_name ( & selected_terminal. name ) ;
162+ }
152163 }
164+ self . unblock_signal ( & signal_handler. as_ref ( ) . unwrap ( ) ) ;
153165 }
154166}
155167
0 commit comments