diff --git a/src/components/wifi/wifiBox.rs b/src/components/wifi/wifiBox.rs index ecad665..b81ea48 100644 --- a/src/components/wifi/wifiBox.rs +++ b/src/components/wifi/wifiBox.rs @@ -14,7 +14,7 @@ use dbus::blocking::Connection; use dbus::message::SignalArgs; use dbus::Error; use dbus::Path; -use glib::PropertySet; +use glib::{clone, PropertySet}; use gtk::gio; use gtk::glib::Variant; use gtk::prelude::{ActionableExt, WidgetExt}; @@ -39,35 +39,50 @@ unsafe impl Send for WifiBox {} unsafe impl Sync for WifiBox {} impl WifiBox { - pub fn new() -> Self { - Object::builder().build() + pub fn new(listeners: Arc) -> Arc { + let obj: Arc = Arc::new(Object::builder().build()); + setupCallbacks(listeners, obj) } - pub fn setupCallbacks(&self) { - let selfImp = self.imp(); - selfImp.resetSavedNetworks.set_activatable(true); - selfImp - .resetSavedNetworks - .set_action_name(Some("navigation.push")); - selfImp - .resetSavedNetworks - .set_action_target_value(Some(&Variant::from("saved"))); - - selfImp.resetAvailableNetworks.set_activatable(true); - selfImp - .resetAvailableNetworks - .set_action_name(Some("navigation.pop")); - setComboRowEllipsis(selfImp.resetWiFiDevice.get()); - } + pub fn setupCallbacks(&self) {} } -impl Default for WifiBox { - fn default() -> Self { - Self::new() - } +fn setupCallbacks(listeners: Arc, wifiBox: Arc) -> Arc { + let imp = wifiBox.imp(); + let wifibox_ref = wifiBox.clone(); + imp.resetSavedNetworks.set_activatable(true); + imp.resetSavedNetworks + .set_action_name(Some("navigation.push")); + imp.resetSavedNetworks + .set_action_target_value(Some(&Variant::from("saved"))); + + imp.resetAvailableNetworks.set_activatable(true); + imp.resetAvailableNetworks + .set_action_name(Some("navigation.pop")); + setComboRowEllipsis(imp.resetWiFiDevice.get()); + imp.resetWifiSwitch.connect_state_set( + clone!(@weak imp => @default-return glib::Propagation::Proceed, move |_, value| { + set_wifi_enabled(value); + if !value { + let mut map = imp.wifiEntries.lock().unwrap(); + for entry in map.iter() { + imp.resetWifiList.remove(&*(*entry.1)); + } + map.clear(); + imp.wifiEntriesPath.lock().unwrap().clear(); + listeners.network_listener.store(false, Ordering::SeqCst); + } else { + start_event_listener(listeners.clone(), wifibox_ref.clone()); + show_stored_connections(wifibox_ref.clone()); + scanForWifi(wifibox_ref.clone()); + } + glib::Propagation::Proceed + }), + ); + wifiBox } -pub fn scanForWifi(_listeners: Arc, wifiBox: Arc) { +pub fn scanForWifi(wifiBox: Arc) { let wifibox_ref = wifiBox.clone(); let _wifibox_ref_listener = wifiBox.clone(); let wifiEntries = wifiBox.imp().wifiEntries.clone(); @@ -158,6 +173,17 @@ pub fn get_stored_connections() -> Vec<(Path<'static>, Vec)> { connections } +pub fn set_wifi_enabled(enabled: bool) { + let conn = Connection::new_session().unwrap(); + let proxy = conn.with_proxy( + "org.Xetibo.ReSetDaemon", + "/org/Xetibo/ReSetDaemon", + Duration::from_millis(1000), + ); + let _: Result<(bool,), Error> = + proxy.method_call("org.Xetibo.ReSetWireless", "SetWifiEnabled", (enabled,)); +} + pub fn start_event_listener(listeners: Arc, wifi_box: Arc) { gio::spawn_blocking(move || { if listeners.network_listener.load(Ordering::SeqCst) { diff --git a/src/components/window/handleSidebarClick.rs b/src/components/window/handleSidebarClick.rs index 7ad3183..645b6c2 100644 --- a/src/components/window/handleSidebarClick.rs +++ b/src/components/window/handleSidebarClick.rs @@ -16,10 +16,10 @@ use gtk::{FlowBox, Frame, Label}; pub const HANDLE_CONNECTIVITY_CLICK: fn(Arc, FlowBox) = |listeners: Arc, resetMain: FlowBox| { listeners.stop_audio_listener(); - let wifiBox = Arc::new(WifiBox::new()); + let wifiBox = WifiBox::new(listeners.clone()); start_event_listener(listeners.clone(), wifiBox.clone()); show_stored_connections(wifiBox.clone()); - scanForWifi(listeners.clone(), wifiBox.clone()); + scanForWifi(wifiBox.clone()); let wifiFrame = wrapInFrame(SettingBox::new(&*wifiBox)); let bluetooth_box = Arc::new(BluetoothBox::new()); populate_conntected_bluetooth_devices(bluetooth_box.clone()); @@ -35,10 +35,10 @@ pub const HANDLE_WIFI_CLICK: fn(Arc, FlowBox) = |listeners: Arc, resetMain: FlowBox| { listeners.stop_audio_listener(); listeners.stop_bluetooth_listener(); - let wifiBox = Arc::new(WifiBox::new()); + let wifiBox = WifiBox::new(listeners.clone()); start_event_listener(listeners.clone(), wifiBox.clone()); show_stored_connections(wifiBox.clone()); - scanForWifi(listeners.clone(), wifiBox.clone()); + scanForWifi(wifiBox.clone()); let wifiFrame = wrapInFrame(SettingBox::new(&*wifiBox)); resetMain.remove_all(); resetMain.insert(&wifiFrame, -1);