@@ -9,7 +9,7 @@ use adw::subclass::prelude::ObjectSubclassIsExt;
99use dbus:: blocking:: Connection ;
1010use dbus:: message:: SignalArgs ;
1111use dbus:: { Error , Path } ;
12- use glib:: { clone, Cast } ;
12+ use glib:: { clone, Cast , PropertySet } ;
1313use gtk:: glib:: Variant ;
1414use gtk:: prelude:: { ActionableExt , ButtonExt , ListBoxRowExt , WidgetExt } ;
1515use gtk:: { gio, StringObject } ;
@@ -48,6 +48,7 @@ fn setup_callbacks(
4848 let bluetooth_box_ref = bluetooth_box. clone ( ) ;
4949 let listeners_ref = listeners. clone ( ) ;
5050 let imp = bluetooth_box. imp ( ) ;
51+ imp. reset_switch_initial . set ( true ) ;
5152 imp. reset_visibility . set_activatable ( true ) ;
5253 imp. reset_visibility
5354 . set_action_name ( Some ( "navigation.push" ) ) ;
@@ -77,11 +78,15 @@ fn setup_callbacks(
7778 set_bluetooth_adapter_pairability( imp. reset_current_bluetooth_adapter. borrow( ) . path. clone( ) , state. is_active( ) ) ;
7879 } ) ) ;
7980
80- imp. reset_bluetooth_switch
81- . connect_state_set ( move |_, state| {
81+ imp. reset_bluetooth_switch . connect_state_set (
82+ clone ! ( @weak imp => @default -return glib:: Propagation :: Proceed , move |_, state| {
83+ if imp. reset_switch_initial. load( Ordering :: SeqCst ) {
84+ return glib:: Propagation :: Proceed ;
85+ }
8286 if !state {
8387 let imp = bluetooth_box_ref. imp( ) ;
8488 let mut available_devices = imp. available_devices. borrow_mut( ) ;
89+ let mut current_adapter = imp. reset_current_bluetooth_adapter. borrow_mut( ) ;
8590 for entry in available_devices. iter( ) {
8691 imp. reset_bluetooth_available_devices. remove( & * * entry. 1 ) ;
8792 }
@@ -102,10 +107,13 @@ fn setup_callbacks(
102107 listeners_ref
103108 . bluetooth_listener
104109 . store( false , Ordering :: SeqCst ) ;
105- set_adapter_enabled (
106- imp . reset_current_bluetooth_adapter . borrow ( ) . path . clone ( ) ,
110+ let res = set_adapter_enabled(
111+ current_adapter . path. clone( ) ,
107112 false ,
108113 ) ;
114+ if res {
115+ current_adapter. powered = false ;
116+ }
109117 } else {
110118 let restart_ref = bluetooth_box_ref. clone( ) ;
111119 let restart_listener_ref = listeners_ref. clone( ) ;
@@ -115,21 +123,21 @@ fn setup_callbacks(
115123 imp. reset_bluetooth_pairable_switch. set_sensitive( true ) ;
116124 }
117125 gio:: spawn_blocking( move || {
126+ let mut current_adapter = restart_ref. imp( ) . reset_current_bluetooth_adapter. borrow_mut( ) ;
118127 if set_adapter_enabled(
119- restart_ref
120- . imp ( )
121- . reset_current_bluetooth_adapter
122- . borrow ( )
128+ current_adapter
123129 . path
124130 . clone( ) ,
125131 true ,
126132 ) {
133+ current_adapter. powered = true ;
127134 start_bluetooth_listener( restart_listener_ref. clone( ) , restart_ref. clone( ) ) ;
128135 }
129136 } ) ;
130137 }
131138 glib:: Propagation :: Proceed
132- } ) ;
139+ } ) ,
140+ ) ;
133141 bluetooth_box
134142}
135143
@@ -169,12 +177,14 @@ pub fn populate_conntected_bluetooth_devices(bluetooth_box: Arc<BluetoothBox>) {
169177
170178 {
171179 let current_adapter = imp. reset_current_bluetooth_adapter . borrow ( ) ;
172- imp. reset_bluetooth_switch
173- . set_state ( current_adapter. powered ) ;
180+ let powered = current_adapter. powered ;
181+ imp. reset_bluetooth_switch . set_state ( powered) ;
182+ imp. reset_bluetooth_switch . set_active ( powered) ;
174183 imp. reset_bluetooth_discoverable_switch
175184 . set_active ( current_adapter. discoverable ) ;
176185 imp. reset_bluetooth_pairable_switch
177186 . set_active ( current_adapter. pairable ) ;
187+ imp. reset_switch_initial . set ( false ) ;
178188 }
179189
180190 imp. reset_bluetooth_adapter . connect_selected_notify (
@@ -219,6 +229,11 @@ pub fn start_bluetooth_listener(listeners: Arc<Listeners>, bluetooth_box: Arc<Bl
219229 if listeners. bluetooth_listener . load ( Ordering :: SeqCst ) {
220230 return ;
221231 }
232+ let imp = bluetooth_box. imp ( ) ;
233+
234+ if !imp. reset_current_bluetooth_adapter . borrow ( ) . powered {
235+ return ;
236+ }
222237
223238 let device_added_box = bluetooth_box. clone ( ) ;
224239 let device_removed_box = bluetooth_box. clone ( ) ;
@@ -228,9 +243,7 @@ pub fn start_bluetooth_listener(listeners: Arc<Listeners>, bluetooth_box: Arc<Bl
228243 let conn = Connection :: new_session ( ) . unwrap ( ) ;
229244 let proxy = conn. with_proxy ( BASE , DBUS_PATH , Duration :: from_millis ( 1000 ) ) ;
230245 let _: Result < ( ) , Error > = proxy. method_call ( BLUETOOTH , "StartBluetoothListener" , ( ) ) ;
231- loop_box
232- . imp ( )
233- . reset_bluetooth_available_devices
246+ imp. reset_bluetooth_available_devices
234247 . set_description ( Some ( "Scanning..." ) ) ;
235248 let device_added =
236249 BluetoothDeviceAdded :: match_rule ( Some ( & BASE . into ( ) ) , Some ( & Path :: from ( DBUS_PATH ) ) )
0 commit comments