From 921d5e7fe6c3a05865da4135662f4d2c410e3a28 Mon Sep 17 00:00:00 2001 From: Fabio Lenherr Date: Fri, 1 Dec 2023 14:31:14 +0100 Subject: [PATCH] chore: Code cleanup --- src/components/base/cardEntry.rs | 28 ++-- src/components/base/cardEntryImpl.rs | 6 +- src/components/base/popup.rs | 7 +- src/components/base/settingBox.rs | 1 - src/components/base/utils.rs | 9 +- src/components/bluetooth/bluetoothBox.rs | 3 +- src/components/bluetooth/bluetoothEntry.rs | 10 +- src/components/bluetooth/mod.rs | 1 - src/components/input/outputStreamEntry.rs | 24 ++- src/components/input/outputStreamEntryImpl.rs | 6 +- src/components/input/sourceBox.rs | 69 ++++---- src/components/input/sourceBoxImpl.rs | 12 +- src/components/input/sourceEntryImpl.rs | 4 +- src/components/output/inputStreamEntry.rs | 34 ++-- src/components/output/inputStreamEntryImpl.rs | 4 +- src/components/output/sinkBox.rs | 66 ++++---- src/components/output/sinkBoxImpl.rs | 17 +- src/components/output/sinkEntry.rs | 4 +- src/components/output/sinkEntryImpl.rs | 4 +- src/components/utils.rs | 3 - src/components/wifi/savedWifiEntry.rs | 16 +- src/components/wifi/utils.rs | 15 +- src/components/wifi/wifiAddressEntry.rs | 4 +- src/components/wifi/wifiAddressEntryImpl.rs | 4 +- src/components/wifi/wifiBox.rs | 30 ++-- src/components/wifi/wifiOptions.rs | 155 +++++++++++------- src/main.rs | 2 - 27 files changed, 304 insertions(+), 234 deletions(-) diff --git a/src/components/base/cardEntry.rs b/src/components/base/cardEntry.rs index 0f671dd..b1504d9 100644 --- a/src/components/base/cardEntry.rs +++ b/src/components/base/cardEntry.rs @@ -5,8 +5,8 @@ use adw::glib::Object; use adw::prelude::{ComboRowExt, PreferencesRowExt}; use dbus::blocking::Connection; use dbus::Error; -use glib::{Cast, clone}; use glib::subclass::types::ObjectSubclassIsExt; +use glib::{clone, Cast}; use gtk::{gio, StringList, StringObject}; use ReSet_Lib::audio::audio::Card; @@ -29,10 +29,9 @@ impl CardEntry { let imp = entry.imp(); let mut map = imp.resetCardMap.borrow_mut(); entry.set_title(&card.name); - let mut i: u32 = 0; let mut index: u32 = 0; let list = StringList::new(&[]); - for profile in card.profiles.iter() { + for (i, profile) in (0_u32..).zip(card.profiles.iter()) { if profile.name == card.active_profile { index = i; } @@ -41,23 +40,22 @@ impl CardEntry { profile.description.clone(), (card.index, profile.name.clone()), ); - i += 1; } entry.set_model(Some(&list)); entry.set_selected(index); entry.set_use_subtitle(true); entry.connect_selected_notify(clone!(@weak imp => move |dropdown| { - let selected = dropdown.selected_item(); - if selected.is_none() { - return; - } - let selected = selected.unwrap(); - let selected = selected.downcast_ref::().unwrap(); - let selected = selected.string().to_string(); - let map = imp.resetCardMap.borrow(); - let (device_index, profile_name) = map.get(&selected).unwrap(); - set_card_profile_of_device(*device_index, profile_name.clone()); - })); + let selected = dropdown.selected_item(); + if selected.is_none() { + return; + } + let selected = selected.unwrap(); + let selected = selected.downcast_ref::().unwrap(); + let selected = selected.string().to_string(); + let map = imp.resetCardMap.borrow(); + let (device_index, profile_name) = map.get(&selected).unwrap(); + set_card_profile_of_device(*device_index, profile_name.clone()); + })); entry.set_factory(Some(&createDropdownLabelFactory())); } entry diff --git a/src/components/base/cardEntryImpl.rs b/src/components/base/cardEntryImpl.rs index 8d15944..43b336e 100644 --- a/src/components/base/cardEntryImpl.rs +++ b/src/components/base/cardEntryImpl.rs @@ -1,9 +1,9 @@ -use std::cell::RefCell; -use std::collections::HashMap; -use adw::ComboRow; use adw::subclass::action_row::ActionRowImpl; use adw::subclass::preferences_row::PreferencesRowImpl; use adw::subclass::prelude::ComboRowImpl; +use adw::ComboRow; +use std::cell::RefCell; +use std::collections::HashMap; use gtk::subclass::prelude::*; use gtk::{glib, CompositeTemplate}; diff --git a/src/components/base/popup.rs b/src/components/base/popup.rs index 19d5b13..47fee08 100644 --- a/src/components/base/popup.rs +++ b/src/components/base/popup.rs @@ -13,7 +13,12 @@ glib::wrapper! { impl Popup { pub fn new() -> Self { let popup: Popup = Object::builder().build(); - // popup.set_child(child); popup } } + +impl Default for Popup { + fn default() -> Self { + Self::new() + } +} diff --git a/src/components/base/settingBox.rs b/src/components/base/settingBox.rs index 7ef8e63..4757c23 100644 --- a/src/components/base/settingBox.rs +++ b/src/components/base/settingBox.rs @@ -17,4 +17,3 @@ impl SettingBox { entry } } - diff --git a/src/components/base/utils.rs b/src/components/base/utils.rs index 2fdf939..caf56ae 100644 --- a/src/components/base/utils.rs +++ b/src/components/base/utils.rs @@ -394,11 +394,11 @@ pub fn start_audio_listener( let mut conn = start_dbus_audio_listener(conn); - if sink_box.is_some() { - conn = start_output_box_listener(conn, sink_box.unwrap()); + if let Some(sink_box) = sink_box { + conn = start_output_box_listener(conn, sink_box); } - if source_box.is_some() { - conn = start_input_box_listener(conn, source_box.unwrap()); + if let Some(source_box) = source_box { + conn = start_input_box_listener(conn, source_box); } listeners.pulse_listener.store(true, Ordering::SeqCst); @@ -435,4 +435,3 @@ fn stop_dbus_audio_listener(conn: Connection) { ); let _: Result<(), Error> = proxy.method_call("org.Xetibo.ReSetAudio", "StopAudioListener", ()); } - diff --git a/src/components/bluetooth/bluetoothBox.rs b/src/components/bluetooth/bluetoothBox.rs index b96daab..17a483e 100644 --- a/src/components/bluetooth/bluetoothBox.rs +++ b/src/components/bluetooth/bluetoothBox.rs @@ -122,13 +122,12 @@ pub fn start_bluetooth_listener(listeners: Arc, bluetooth_box: Arc Self { let entry: BluetoothEntry = Object::builder().build(); let entryImp = entry.imp(); entryImp.resetBluetoothLabel.get().set_text(&device.alias); - entryImp.resetBluetoothAddress.get().set_text(&device.address); - if device.icon == "" { + entryImp + .resetBluetoothAddress + .get() + .set_text(&device.address); + if device.icon.is_empty() { entryImp .resetBluetoothDeviceType .set_icon_name(Some("dialog-question-symbolic")); diff --git a/src/components/bluetooth/mod.rs b/src/components/bluetooth/mod.rs index 4216888..07172c6 100644 --- a/src/components/bluetooth/mod.rs +++ b/src/components/bluetooth/mod.rs @@ -3,4 +3,3 @@ pub mod bluetoothBox; pub mod bluetoothBoxImpl; pub mod bluetoothEntry; pub mod bluetoothEntryImpl; - diff --git a/src/components/input/outputStreamEntry.rs b/src/components/input/outputStreamEntry.rs index 175204e..c30e145 100644 --- a/src/components/input/outputStreamEntry.rs +++ b/src/components/input/outputStreamEntry.rs @@ -1,6 +1,7 @@ use std::sync::Arc; use std::time::{Duration, SystemTime}; +use crate::components::utils::{createDropdownLabelFactory, setComboRowEllipsis}; use adw::glib; use adw::glib::Object; use adw::prelude::{ButtonExt, ComboRowExt, PreferencesRowExt, RangeExt}; @@ -10,7 +11,6 @@ use glib::subclass::types::ObjectSubclassIsExt; use glib::{clone, Cast, Propagation}; use gtk::{gio, StringObject}; use ReSet_Lib::audio::audio::OutputStream; -use crate::components::utils::{createDropdownLabelFactory, setComboRowEllipsis}; use super::outputStreamEntryImpl; use super::sourceBox::SourceBox; @@ -33,7 +33,8 @@ impl OutputStreamEntry { let imp = obj.imp(); let name = stream.application_name.clone() + ": " + stream.name.as_str(); imp.resetSourceSelection.set_title(name.as_str()); - imp.resetSourceSelection.set_factory(Some(&createDropdownLabelFactory())); + imp.resetSourceSelection + .set_factory(Some(&createDropdownLabelFactory())); setComboRowEllipsis(imp.resetSourceSelection.get()); let volume = stream.volume.first().unwrap_or(&0_u32); let fraction = (*volume as f64 / 655.36).round(); @@ -68,16 +69,8 @@ impl OutputStreamEntry { ); { let list = box_imp.resetModelList.read().unwrap(); - // while list.is_err() { - // list = box_imp.resetModelList.try_borrow(); - // } - // let list = list.unwrap(); imp.resetSourceSelection.set_model(Some(&*list)); let map = box_imp.resetSourceMap.write().unwrap(); - // while map.is_err() { - // map = box_imp.resetSourceMap.try_borrow(); - // } - // let map = map.unwrap(); let mut name = box_imp.resetDefaultSource.try_borrow(); while name.is_err() { name = box_imp.resetDefaultSource.try_borrow(); @@ -85,8 +78,8 @@ impl OutputStreamEntry { let name = name.unwrap(); let name = &name.alias; let index = map.get(name); - if index.is_some() { - imp.resetSourceSelection.set_selected(index.unwrap().1); + if let Some(index) = index { + imp.resetSourceSelection.set_selected(index.1); } } imp.resetSourceSelection.connect_selected_notify( @@ -166,8 +159,11 @@ fn toggle_output_stream_mute(index: u32, muted: bool) -> bool { "/org/Xetibo/ReSetDaemon", Duration::from_millis(1000), ); - let _: Result<(), Error> = - proxy.method_call("org.Xetibo.ReSetAudio", "SetOutputStreamMute", (index, muted)); + let _: Result<(), Error> = proxy.method_call( + "org.Xetibo.ReSetAudio", + "SetOutputStreamMute", + (index, muted), + ); // if res.is_err() { // return false; // } diff --git a/src/components/input/outputStreamEntryImpl.rs b/src/components/input/outputStreamEntryImpl.rs index 0bc4359..a97130c 100644 --- a/src/components/input/outputStreamEntryImpl.rs +++ b/src/components/input/outputStreamEntryImpl.rs @@ -1,12 +1,12 @@ +use adw::subclass::prelude::PreferencesGroupImpl; +use adw::{ComboRow, PreferencesGroup}; use std::cell::RefCell; use std::sync::Arc; use std::time::SystemTime; -use adw::{ComboRow, PreferencesGroup}; -use adw::subclass::prelude::PreferencesGroupImpl; use crate::components::input::outputStreamEntry; use gtk::subclass::prelude::*; -use gtk::{glib, Button, CompositeTemplate, DropDown, Label, ProgressBar, Scale}; +use gtk::{glib, Button, CompositeTemplate, Label, ProgressBar, Scale}; use ReSet_Lib::audio::audio::OutputStream; #[allow(non_snake_case)] diff --git a/src/components/input/sourceBox.rs b/src/components/input/sourceBox.rs index f943a2e..1f55277 100644 --- a/src/components/input/sourceBox.rs +++ b/src/components/input/sourceBox.rs @@ -4,14 +4,16 @@ use std::time::{Duration, SystemTime}; use adw::glib; use adw::glib::Object; -use adw::prelude::{BoxExt, ButtonExt, CheckButtonExt, ComboRowExt, ListBoxRowExt, PreferencesGroupExt, RangeExt}; -use dbus::{Error, Path}; +use adw::prelude::{ + BoxExt, ButtonExt, CheckButtonExt, ComboRowExt, ListBoxRowExt, PreferencesGroupExt, RangeExt, +}; use dbus::blocking::Connection; use dbus::message::SignalArgs; -use glib::{Cast, clone, Propagation, Variant}; +use dbus::{Error, Path}; use glib::subclass::prelude::ObjectSubclassIsExt; +use glib::{clone, Cast, Propagation, Variant}; +use gtk::prelude::ActionableExt; use gtk::{gio, StringObject}; -use gtk::prelude::{ActionableExt}; use ReSet_Lib::audio::audio::{Card, OutputStream, Source}; use crate::components::base::cardEntry::CardEntry; @@ -25,7 +27,7 @@ use crate::components::input::sourceEntry::set_source_volume; use crate::components::utils::{createDropdownLabelFactory, setComboRowEllipsis}; use super::outputStreamEntry::OutputStreamEntry; -use super::sourceEntry::{set_default_source, SourceEntry, toggle_source_mute}; +use super::sourceEntry::{set_default_source, toggle_source_mute, SourceEntry}; glib::wrapper! { pub struct SourceBox(ObjectSubclass) @@ -59,16 +61,28 @@ impl SourceBox { .set_action_target_value(Some(&Variant::from("profileConfiguration"))); selfImp.resetOutputStreamButton.set_activatable(true); - selfImp.resetOutputStreamButton.set_action_name(Some("navigation.pop")); + selfImp + .resetOutputStreamButton + .set_action_name(Some("navigation.pop")); selfImp.resetInputCardsBackButton.set_activatable(true); - selfImp.resetInputCardsBackButton.set_action_name(Some("navigation.pop")); + selfImp + .resetInputCardsBackButton + .set_action_name(Some("navigation.pop")); - selfImp.resetSourceDropdown.set_factory(Some(&createDropdownLabelFactory())); + selfImp + .resetSourceDropdown + .set_factory(Some(&createDropdownLabelFactory())); setComboRowEllipsis(selfImp.resetSourceDropdown.get()); } } +impl Default for SourceBox { + fn default() -> Self { + Self::new() + } +} + pub fn populate_sources(input_box: Arc) { gio::spawn_blocking(move || { let output_box_imp = input_box.imp(); @@ -77,11 +91,9 @@ pub fn populate_sources(input_box: Arc) { let list = output_box_imp.resetModelList.write().unwrap(); let mut map = output_box_imp.resetSourceMap.write().unwrap(); let mut model_index = output_box_imp.resetModelIndex.write().unwrap(); - let mut i: u32 = 0; - for source in sources.iter() { + for (i, source) in (0_u32..).zip(sources.iter()) { list.append(&source.alias); map.insert(source.alias.clone(), (source.index, i, source.name.clone())); - i += 1; *model_index += 1; } } @@ -93,7 +105,6 @@ pub fn populate_sources(input_box: Arc) { populate_cards(input_box.clone()); glib::spawn_future(async move { glib::idle_add_once(move || { - // TODO handle events let output_box_ref_slider = input_box.clone(); let output_box_ref_mute = input_box.clone(); let output_box_ref = input_box.clone(); @@ -130,12 +141,8 @@ pub fn populate_sources(input_box: Arc) { output_box_imp.resetSourceDropdown.set_model(Some(&*list)); let map = output_box_imp.resetSourceMap.read().unwrap(); let name = output_box_imp.resetDefaultSource.borrow(); - let name = &name.alias; - let index = map.get(name); - if index.is_some() { - output_box_imp - .resetSourceDropdown - .set_selected(index.unwrap().1); + if let Some(index) = map.get(&name.alias) { + output_box_imp.resetSourceDropdown.set_selected(index.1); } output_box_imp.resetSourceDropdown.connect_selected_notify( clone!(@weak output_box_imp => move |dropdown| { @@ -206,7 +213,6 @@ pub fn populate_sources(input_box: Arc) { } pub fn populate_outputstreams(input_box: Arc) { - // TODO add listener let input_box_ref = input_box.clone(); gio::spawn_blocking(move || { @@ -237,8 +243,7 @@ pub fn populate_cards(input_box: Arc) { glib::idle_add_once(move || { let imp = output_box_ref.imp(); for card in cards { - imp.resetCards - .add(&CardEntry::new(card)); + imp.resetCards.add(&CardEntry::new(card)); } }); }); @@ -282,7 +287,8 @@ fn get_cards() -> Vec { "/org/Xetibo/ReSetDaemon", Duration::from_millis(1000), ); - let res: Result<(Vec,), Error> = proxy.method_call("org.Xetibo.ReSetAudio", "ListCards", ()); + let res: Result<(Vec,), Error> = + proxy.method_call("org.Xetibo.ReSetAudio", "ListCards", ()); if res.is_err() { return Vec::new(); } @@ -405,12 +411,12 @@ pub fn start_input_box_listener(conn: Connection, source_box: Arc) -> } let mut map = output_box_imp.resetSourceMap.write().unwrap(); let entry_index = map.remove(&alias.unwrap().2); - if entry_index.is_some() { + if let Some(entry_index) = entry_index { output_box_imp .resetModelList .write() .unwrap() - .remove(entry_index.unwrap().1); + .remove(entry_index.1); } let mut index = output_box_imp.resetModelIndex.write().unwrap(); if *index != 0 { @@ -449,10 +455,10 @@ pub fn start_input_box_listener(conn: Connection, source_box: Arc) -> } else { imp.resetSelectedSource.set_active(false); } - imp.resetSourceName.set_title(ir.source.alias.clone().as_str()); + imp.resetSourceName + .set_title(ir.source.alias.clone().as_str()); imp.resetVolumePercentage.set_text(&percentage); imp.resetVolumeSlider.set_value(*volume as f64); - }); }); true @@ -492,9 +498,8 @@ pub fn start_input_box_listener(conn: Connection, source_box: Arc) -> let alias: String; { let source_list = imp.resetSourceList.read().unwrap(); - let alias_opt = source_list.get(&ir.stream.source_index); - if alias_opt.is_some() { - alias = alias_opt.unwrap().2.clone(); + if let Some(alias_opt) = source_list.get(&ir.stream.source_index) { + alias = alias_opt.2.clone(); } else { alias = String::from(""); } @@ -529,9 +534,8 @@ pub fn start_input_box_listener(conn: Connection, source_box: Arc) -> imp.resetVolumePercentage.set_text(&percentage); imp.resetVolumeSlider.set_value(*volume as f64); let map = output_box_imp.resetSourceMap.read().unwrap(); - let index = map.get(&alias); - if index.is_some() { - imp.resetSourceSelection.set_selected(index.unwrap().1); + if let Some(index) = map.get(&alias) { + imp.resetSourceSelection.set_selected(index.1); } }); }); @@ -554,7 +558,6 @@ pub fn start_input_box_listener(conn: Connection, source_box: Arc) -> let mut list = output_box_imp.resetOutputStreamList.write().unwrap(); let entry = list.remove(&ir.index); if entry.is_none() { - println!("tried to remove nonexistant?? wat"); return; } output_box_imp.resetOutputStreams.remove(&*entry.unwrap().0); diff --git a/src/components/input/sourceBoxImpl.rs b/src/components/input/sourceBoxImpl.rs index f5d6552..0aa866c 100644 --- a/src/components/input/sourceBoxImpl.rs +++ b/src/components/input/sourceBoxImpl.rs @@ -1,8 +1,8 @@ +use adw::{ActionRow, ComboRow, PreferencesGroup}; use std::cell::RefCell; use std::collections::HashMap; use std::sync::{Arc, RwLock}; use std::time::SystemTime; -use adw::{ActionRow, ComboRow, PreferencesGroup}; use crate::components::base::listEntry::ListEntry; use crate::components::input::sourceBox; @@ -14,6 +14,10 @@ use ReSet_Lib::audio::audio::Source; use super::outputStreamEntry::OutputStreamEntry; use super::sourceEntry::SourceEntry; +type SourceEntryMap = Arc, Arc, String)>>>; +type OutputStreamEntryMap = Arc, Arc)>>>; +type SourceMap = Arc>>; + #[allow(non_snake_case)] #[derive(Default, CompositeTemplate)] #[template(resource = "/org/Xetibo/ReSet/resetAudioInput.ui")] @@ -44,13 +48,13 @@ pub struct SourceBox { pub resetCards: TemplateChild, pub resetDefaultCheckButton: Arc, pub resetDefaultSource: Arc>, - pub resetSourceList: Arc, Arc, String)>>>, - pub resetOutputStreamList: Arc, Arc)>>>, + pub resetSourceList: SourceEntryMap, + pub resetOutputStreamList: OutputStreamEntryMap, pub resetModelList: Arc>, pub resetModelIndex: Arc>, // first u32 is the index of the source, the second the index in the model list and the third is // the full name - pub resetSourceMap: Arc>>, + pub resetSourceMap: SourceMap, pub volumeTimeStamp: RefCell>, } diff --git a/src/components/input/sourceEntryImpl.rs b/src/components/input/sourceEntryImpl.rs index bee44d8..1e06664 100644 --- a/src/components/input/sourceEntryImpl.rs +++ b/src/components/input/sourceEntryImpl.rs @@ -1,8 +1,8 @@ +use adw::subclass::prelude::PreferencesGroupImpl; +use adw::{ActionRow, PreferencesGroup}; use std::cell::RefCell; use std::sync::Arc; use std::time::SystemTime; -use adw::{ActionRow, PreferencesGroup}; -use adw::subclass::prelude::PreferencesGroupImpl; use gtk::subclass::prelude::*; use gtk::{glib, Button, CheckButton, CompositeTemplate, Label, ProgressBar, Scale}; diff --git a/src/components/output/inputStreamEntry.rs b/src/components/output/inputStreamEntry.rs index ba09b87..30f7791 100644 --- a/src/components/output/inputStreamEntry.rs +++ b/src/components/output/inputStreamEntry.rs @@ -1,6 +1,7 @@ use std::sync::Arc; use std::time::{Duration, SystemTime}; +use crate::components::utils::{createDropdownLabelFactory, setComboRowEllipsis}; use adw::glib; use adw::glib::Object; use adw::prelude::{ButtonExt, ComboRowExt, PreferencesRowExt, RangeExt}; @@ -10,7 +11,6 @@ use glib::subclass::types::ObjectSubclassIsExt; use glib::{clone, Cast, Propagation}; use gtk::{gio, StringObject}; use ReSet_Lib::audio::audio::InputStream; -use crate::components::utils::{createDropdownLabelFactory, setComboRowEllipsis}; use super::inputStreamEntryImpl; use super::sinkBox::SinkBox; @@ -21,6 +21,9 @@ glib::wrapper! { @implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable; } +unsafe impl Send for InputStreamEntry {} +unsafe impl Sync for InputStreamEntry {} + impl InputStreamEntry { pub fn new(sink_box: Arc, stream: InputStream) -> Self { let obj: Self = Object::builder().build(); @@ -38,7 +41,8 @@ impl InputStreamEntry { } let name = stream.application_name.clone() + ": " + stream.name.as_str(); imp.resetSinkSelection.set_title(name.as_str()); - imp.resetSinkSelection.set_factory(Some(&createDropdownLabelFactory())); + imp.resetSinkSelection + .set_factory(Some(&createDropdownLabelFactory())); setComboRowEllipsis(imp.resetSinkSelection.get()); let volume = stream.volume.first().unwrap_or(&0_u32); let fraction = (*volume as f64 / 655.36).round(); @@ -83,11 +87,11 @@ impl InputStreamEntry { let map = box_imp.resetSinkMap.read().unwrap(); let sink_list = box_imp.resetSinkList.read().unwrap(); let name = sink_list.get(&index); - if name.is_some() { - let name = &name.unwrap().2; + if let Some(name) = name { + let name = &name.2; let index = map.get(name); - if index.is_some() { - imp.resetSinkSelection.set_selected(index.unwrap().1); + if let Some(index) = index { + imp.resetSinkSelection.set_selected(index.1); } } else { let mut name = box_imp.resetDefaultSink.try_borrow(); @@ -96,8 +100,8 @@ impl InputStreamEntry { } let name = &name.unwrap().alias; let index = map.get(name); - if index.is_some() { - imp.resetSinkSelection.set_selected(index.unwrap().1); + if let Some(index) = index { + imp.resetSinkSelection.set_selected(index.1); } } } @@ -182,8 +186,11 @@ fn toggle_input_stream_mute(index: u32, muted: bool) -> bool { "/org/Xetibo/ReSetDaemon", Duration::from_millis(1000), ); - let _: Result<(), Error> = - proxy.method_call("org.Xetibo.ReSetAudio", "SetInputStreamMute", (index, muted)); + let _: Result<(), Error> = proxy.method_call( + "org.Xetibo.ReSetAudio", + "SetInputStreamMute", + (index, muted), + ); // if res.is_err() { // return false; // } @@ -200,8 +207,11 @@ fn set_sink_of_input_stream(stream: u32, sink: u32) -> bool { "/org/Xetibo/ReSetDaemon", Duration::from_millis(1000), ); - let _: Result<(), Error> = - proxy.method_call("org.Xetibo.ReSetAudio", "SetSinkOfInputStream", (stream, sink)); + let _: Result<(), Error> = proxy.method_call( + "org.Xetibo.ReSetAudio", + "SetSinkOfInputStream", + (stream, sink), + ); // if res.is_err() { // return false; // } diff --git a/src/components/output/inputStreamEntryImpl.rs b/src/components/output/inputStreamEntryImpl.rs index 9de336e..4acbe6b 100644 --- a/src/components/output/inputStreamEntryImpl.rs +++ b/src/components/output/inputStreamEntryImpl.rs @@ -1,8 +1,8 @@ +use adw::subclass::prelude::PreferencesGroupImpl; +use adw::{ComboRow, PreferencesGroup}; use std::cell::RefCell; use std::sync::Arc; use std::time::SystemTime; -use adw::{ComboRow, PreferencesGroup}; -use adw::subclass::prelude::PreferencesGroupImpl; use gtk::subclass::prelude::*; use gtk::{glib, Button, CompositeTemplate, Label, ProgressBar, Scale}; diff --git a/src/components/output/sinkBox.rs b/src/components/output/sinkBox.rs index a9cc7a1..ee2fd80 100644 --- a/src/components/output/sinkBox.rs +++ b/src/components/output/sinkBox.rs @@ -1,18 +1,18 @@ -use adw::prelude::PreferencesRowExt; use adw::prelude::PreferencesGroupExt; +use adw::prelude::PreferencesRowExt; use std::sync::Arc; use std::time::{Duration, SystemTime}; -use adw::{glib, prelude::ListBoxRowExt}; use adw::glib::Object; use adw::prelude::{BoxExt, ButtonExt, CheckButtonExt, ComboRowExt, RangeExt}; -use dbus::{Error, Path}; +use adw::{glib, prelude::ListBoxRowExt}; use dbus::blocking::Connection; use dbus::message::SignalArgs; -use glib::{Cast, clone, Propagation, Variant}; +use dbus::{Error, Path}; use glib::subclass::prelude::ObjectSubclassIsExt; -use gtk::{gio, StringObject}; +use glib::{clone, Cast, Propagation, Variant}; use gtk::prelude::ActionableExt; +use gtk::{gio, StringObject}; use ReSet_Lib::audio::audio::{Card, InputStream, Sink}; use crate::components::base::cardEntry::CardEntry; @@ -25,7 +25,7 @@ use crate::components::utils::{createDropdownLabelFactory, setComboRowEllipsis}; use super::inputStreamEntry::InputStreamEntry; use super::sinkBoxImpl; -use super::sinkEntry::{set_default_sink, SinkEntry, toggle_sink_mute}; +use super::sinkEntry::{set_default_sink, toggle_sink_mute, SinkEntry}; glib::wrapper! { pub struct SinkBox(ObjectSubclass) @@ -66,12 +66,18 @@ impl SinkBox { selfImp.resetCardsRow.connect_action_name_notify(|_| {}); selfImp.resetInputStreamButton.set_activatable(true); - selfImp.resetInputStreamButton.set_action_name(Some("navigation.pop")); + selfImp + .resetInputStreamButton + .set_action_name(Some("navigation.pop")); selfImp.resetInputCardsBackButton.set_activatable(true); - selfImp.resetInputCardsBackButton.set_action_name(Some("navigation.pop")); + selfImp + .resetInputCardsBackButton + .set_action_name(Some("navigation.pop")); - selfImp.resetSinkDropdown.set_factory(Some(&createDropdownLabelFactory())); + selfImp + .resetSinkDropdown + .set_factory(Some(&createDropdownLabelFactory())); setComboRowEllipsis(selfImp.resetSinkDropdown.get()); } } @@ -92,11 +98,9 @@ pub fn populate_sinks(output_box: Arc) { let list = output_box_imp.resetModelList.write().unwrap(); let mut model_index = output_box_imp.resetModelIndex.write().unwrap(); output_box_imp.resetDefaultSink.replace(get_default_sink()); - let mut i: u32 = 0; - for sink in sinks.iter() { + for (i, sink) in (0_u32..).zip(sinks.iter()) { list.append(&sink.alias); map.insert(sink.alias.clone(), (sink.index, i, sink.name.clone())); - i += 1; *model_index += 1; } } @@ -130,7 +134,7 @@ pub fn populate_sinks(output_box: Arc) { sink, )); let sink_clone = sink_entry.clone(); - let entry = Arc::new(ListEntry::new(&*sink_entry, )); + let entry = Arc::new(ListEntry::new(&*sink_entry)); entry.set_activatable(false); list.insert(index, (entry.clone(), sink_clone, alias)); output_box_imp.resetSinks.append(&*entry); @@ -141,10 +145,8 @@ pub fn populate_sinks(output_box: Arc) { let name = output_box_imp.resetDefaultSink.borrow(); let name = &name.alias; let index = map.get(name); - if index.is_some() { - output_box_imp - .resetSinkDropdown - .set_selected(index.unwrap().1); + if let Some(index) = index { + output_box_imp.resetSinkDropdown.set_selected(index.1); } output_box_imp.resetSinkDropdown.connect_selected_notify( clone!(@weak output_box_imp => move |dropdown| { @@ -225,7 +227,7 @@ pub fn populate_inputstreams(output_box: Arc) { for stream in streams { let index = stream.index; let input_stream = Arc::new(InputStreamEntry::new(output_box.clone(), stream)); - let entry = Arc::new(ListEntry::new(&*input_stream, )); + let entry = Arc::new(ListEntry::new(&*input_stream)); entry.set_activatable(false); list.insert(index, (entry.clone(), input_stream.clone())); output_box_imp.resetInputStreams.append(&*entry); @@ -243,8 +245,7 @@ pub fn populate_cards(output_box: Arc) { glib::idle_add_once(move || { let imp = output_box_ref.imp(); for card in cards { - imp.resetCards - .add(&CardEntry::new(card)); + imp.resetCards.add(&CardEntry::new(card)); } }); }); @@ -273,7 +274,8 @@ fn get_sinks() -> Vec { "/org/Xetibo/ReSetDaemon", Duration::from_millis(1000), ); - let res: Result<(Vec,), Error> = proxy.method_call("org.Xetibo.ReSetAudio", "ListSinks", ()); + let res: Result<(Vec,), Error> = + proxy.method_call("org.Xetibo.ReSetAudio", "ListSinks", ()); if res.is_err() { return Vec::new(); } @@ -287,7 +289,8 @@ fn get_default_sink() -> Sink { "/org/Xetibo/ReSetDaemon", Duration::from_millis(1000), ); - let res: Result<(Sink,), Error> = proxy.method_call("org.Xetibo.ReSetAudio", "GetDefaultSink", ()); + let res: Result<(Sink,), Error> = + proxy.method_call("org.Xetibo.ReSetAudio", "GetDefaultSink", ()); if res.is_err() { return Sink::default(); } @@ -301,7 +304,8 @@ fn get_cards() -> Vec { "/org/Xetibo/ReSetDaemon", Duration::from_millis(1000), ); - let res: Result<(Vec,), Error> = proxy.method_call("org.Xetibo.ReSetAudio", "ListCards", ()); + let res: Result<(Vec,), Error> = + proxy.method_call("org.Xetibo.ReSetAudio", "ListCards", ()); if res.is_err() { return Vec::new(); } @@ -367,7 +371,7 @@ pub fn start_output_box_listener(conn: Connection, sink_box: Arc) -> Co ir.sink, )); let sink_clone = sink_entry.clone(); - let entry = Arc::new(ListEntry::new(&*sink_entry, )); + let entry = Arc::new(ListEntry::new(&*sink_entry)); entry.set_activatable(false); list.insert(sink_index, (entry.clone(), sink_clone, alias.clone())); output_box_imp.resetSinks.append(&*entry); @@ -407,12 +411,12 @@ pub fn start_output_box_listener(conn: Connection, sink_box: Arc) -> Co } let mut map = output_box_imp.resetSinkMap.write().unwrap(); let entry_index = map.remove(&alias.unwrap().2); - if entry_index.is_some() { + if let Some(entry_index) = entry_index { output_box_imp .resetModelList .write() .unwrap() - .remove(entry_index.unwrap().1); + .remove(entry_index.1); } let mut index = output_box_imp.resetModelIndex.write().unwrap(); if *index != 0 { @@ -473,7 +477,7 @@ pub fn start_output_box_listener(conn: Connection, sink_box: Arc) -> Co let mut list = output_box_imp.resetInputStreamList.write().unwrap(); let index = ir.stream.index; let input_stream = Arc::new(InputStreamEntry::new(output_box.clone(), ir.stream)); - let entry = Arc::new(ListEntry::new(&*input_stream, )); + let entry = Arc::new(ListEntry::new(&*input_stream)); entry.set_activatable(false); list.insert(index, (entry.clone(), input_stream.clone())); output_box_imp.resetInputStreams.append(&*entry); @@ -492,8 +496,8 @@ pub fn start_output_box_listener(conn: Connection, sink_box: Arc) -> Co { let sink_list = imp.resetSinkList.read().unwrap(); let alias_opt = sink_list.get(&ir.stream.sink_index); - if alias_opt.is_some() { - alias = alias_opt.unwrap().2.clone(); + if let Some(alias_opt) = alias_opt { + alias = alias_opt.2.clone(); } else { alias = String::from(""); } @@ -529,8 +533,8 @@ pub fn start_output_box_listener(conn: Connection, sink_box: Arc) -> Co imp.resetVolumeSlider.set_value(*volume as f64); let map = output_box_imp.resetSinkMap.read().unwrap(); let index = map.get(&alias); - if index.is_some() { - imp.resetSinkSelection.set_selected(index.unwrap().1); + if let Some(index) = index { + imp.resetSinkSelection.set_selected(index.1); } }); }); diff --git a/src/components/output/sinkBoxImpl.rs b/src/components/output/sinkBoxImpl.rs index 05aae0a..803bb0c 100644 --- a/src/components/output/sinkBoxImpl.rs +++ b/src/components/output/sinkBoxImpl.rs @@ -1,21 +1,23 @@ +use adw::{ActionRow, ComboRow, PreferencesGroup}; use std::cell::RefCell; use std::collections::HashMap; use std::sync::{Arc, RwLock}; use std::time::SystemTime; -use adw::{ActionRow, ComboRow, PreferencesGroup}; use crate::components::base::listEntry::ListEntry; use crate::components::output::inputStreamEntry::InputStreamEntry; use gtk::subclass::prelude::*; -use gtk::{ - glib, Box, Button, CheckButton, CompositeTemplate, Label, StringList, TemplateChild, -}; +use gtk::{glib, Box, Button, CheckButton, CompositeTemplate, Label, StringList, TemplateChild}; use gtk::{prelude::*, ProgressBar, Scale}; use ReSet_Lib::audio::audio::Sink; use super::sinkBox; use super::sinkEntry::SinkEntry; +type SinkEntryMap = Arc, Arc, String)>>>; +type InputStreamEntryMap = Arc, Arc)>>>; +type SinkMap = Arc>>; + #[allow(non_snake_case)] #[derive(Default, CompositeTemplate)] #[template(resource = "/org/Xetibo/ReSet/resetAudioOutput.ui")] @@ -46,14 +48,13 @@ pub struct SinkBox { pub resetCards: TemplateChild, pub resetDefaultCheckButton: Arc, pub resetDefaultSink: Arc>, - pub resetSinkList: Arc, Arc, String)>>>, - pub resetInputStreamList: Arc, Arc)>>>, + pub resetSinkList: SinkEntryMap, + pub resetInputStreamList: InputStreamEntryMap, pub resetModelList: Arc>, pub resetModelIndex: Arc>, // first u32 is the index of the sink, the second the index in the model list and the third is // the full name - pub resetSinkMap: Arc>>, - // pub : Arc>>, + pub resetSinkMap: SinkMap, pub volumeTimeStamp: RefCell>, } diff --git a/src/components/output/sinkEntry.rs b/src/components/output/sinkEntry.rs index 31c0e2d..1a1854e 100644 --- a/src/components/output/sinkEntry.rs +++ b/src/components/output/sinkEntry.rs @@ -19,11 +19,13 @@ glib::wrapper! { @implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable; } +unsafe impl Send for SinkEntry {} +unsafe impl Sync for SinkEntry {} + impl SinkEntry { pub fn new(is_default: bool, check_group: Arc, stream: Sink) -> Self { let obj: Self = Object::builder().build(); // TODO use event callback for progress bar -> this is the "im speaking" indicator - // TODO handle events { let imp = obj.imp(); imp.resetSinkName.set_title(stream.alias.clone().as_str()); diff --git a/src/components/output/sinkEntryImpl.rs b/src/components/output/sinkEntryImpl.rs index 2fc06bd..4bf41c2 100644 --- a/src/components/output/sinkEntryImpl.rs +++ b/src/components/output/sinkEntryImpl.rs @@ -1,8 +1,8 @@ +use adw::subclass::prelude::PreferencesGroupImpl; +use adw::{ActionRow, PreferencesGroup}; use std::cell::RefCell; use std::sync::Arc; use std::time::SystemTime; -use adw::{ActionRow, PreferencesGroup}; -use adw::subclass::prelude::PreferencesGroupImpl; use crate::components::output::sinkEntry; use gtk::subclass::prelude::*; diff --git a/src/components/utils.rs b/src/components/utils.rs index 2162c9f..9776b78 100644 --- a/src/components/utils.rs +++ b/src/components/utils.rs @@ -1,9 +1,6 @@ -use std::time::Duration; - use adw::gdk::pango::EllipsizeMode; use adw::prelude::ListModelExtManual; use adw::ComboRow; -use dbus::blocking::{Connection, Proxy}; use glib::{Cast, Object}; use gtk::prelude::{GObjectPropertyExpressionExt, ListBoxRowExt, ListItemExt, WidgetExt}; use gtk::{Align, SignalListItemFactory, StringObject}; diff --git a/src/components/wifi/savedWifiEntry.rs b/src/components/wifi/savedWifiEntry.rs index 8c2137d..128d665 100644 --- a/src/components/wifi/savedWifiEntry.rs +++ b/src/components/wifi/savedWifiEntry.rs @@ -1,6 +1,7 @@ use std::time::Duration; use crate::components::wifi::savedWifiEntryImpl; +use crate::components::wifi::wifiBoxImpl::WifiBox; use adw::glib; use adw::glib::Object; use adw::prelude::{ButtonExt, WidgetExt}; @@ -10,7 +11,6 @@ use glib::subclass::types::ObjectSubclassIsExt; use glib::{clone, PropertySet}; use gtk::gio; use gtk::prelude::ListBoxRowExt; -use crate::components::wifi::wifiBoxImpl::WifiBox; glib::wrapper! { pub struct SavedWifiEntry(ObjectSubclass) @@ -19,16 +19,18 @@ glib::wrapper! { } impl SavedWifiEntry { - pub fn new(name: &String, path: Path<'static>, wifiBox: &WifiBox) -> Self { + pub fn new(name: &str, path: Path<'static>, wifiBox: &WifiBox) -> Self { let entry: SavedWifiEntry = Object::builder().build(); entry.set_activatable(false); let entryImp = entry.imp(); - entryImp.resetEditSavedWifiButton.connect_clicked(clone!(@ weak entryImp, @ weak wifiBox => move |_| { - // TODO accesspoint has to be saved somewhere i guess - // let _option = getConnectionSettings(entryImp.accessPoint.borrow().associated_connection.clone()); - // wifiBox.resetWifiNavigation.push(&*WifiOptions::new(_option)); - })); + entryImp.resetEditSavedWifiButton.connect_clicked( + clone!(@ weak entryImp, @ weak wifiBox => move |_| { + // TODO accesspoint has to be saved somewhere i guess + // let _option = getConnectionSettings(entryImp.accessPoint.borrow().associated_connection.clone()); + // wifiBox.resetWifiNavigation.push(&*WifiOptions::new(_option)); + }), + ); entryImp.resetSavedWifiLabel.set_text(name); entryImp.resetConnectionPath.set(path); diff --git a/src/components/wifi/utils.rs b/src/components/wifi/utils.rs index a956e70..b6e74b6 100644 --- a/src/components/wifi/utils.rs +++ b/src/components/wifi/utils.rs @@ -1,11 +1,14 @@ -use std::collections::HashMap; -use std::time::Duration; -use dbus::arg::{RefArg}; +use dbus::arg::RefArg; use dbus::blocking::Connection; use dbus::Error; use dbus::Path; +use std::collections::HashMap; +use std::time::Duration; use ReSet_Lib::network::connection::Connection as ResetConnection; +type ResultType = + Result<(HashMap>>>,), Error>; + pub fn getConnectionSettings(path: Path<'static>) -> ResetConnection { let conn = Connection::new_session().unwrap(); let proxy = conn.with_proxy( @@ -13,10 +16,8 @@ pub fn getConnectionSettings(path: Path<'static>) -> ResetConnection { "/org/Xetibo/ReSetDaemon", Duration::from_millis(1000), ); - let res: Result< - (HashMap>>>,), - Error, - > = proxy.method_call("org.xetibo.ReSetWireless", "GetConnectionSettings", (path,)); + let res: ResultType = + proxy.method_call("org.xetibo.ReSetWireless", "GetConnectionSettings", (path,)); if res.is_err() { ResetConnection::default(); } diff --git a/src/components/wifi/wifiAddressEntry.rs b/src/components/wifi/wifiAddressEntry.rs index 62f569d..bed43e2 100644 --- a/src/components/wifi/wifiAddressEntry.rs +++ b/src/components/wifi/wifiAddressEntry.rs @@ -27,7 +27,9 @@ impl WifiAddressEntry { entryImp.resetAddressAddress.set_text(&addr); entryImp.resetAddressNetmask.set_text(&prefix); - entryImp.resetAddressRow.set_title(&format!("{}, {}", addr, prefix)); + entryImp + .resetAddressRow + .set_title(&format!("{}, {}", addr, prefix)); } entry } diff --git a/src/components/wifi/wifiAddressEntryImpl.rs b/src/components/wifi/wifiAddressEntryImpl.rs index fa34157..4f68f31 100644 --- a/src/components/wifi/wifiAddressEntryImpl.rs +++ b/src/components/wifi/wifiAddressEntryImpl.rs @@ -1,7 +1,7 @@ +use crate::components::wifi::wifiAddressEntry; use adw::{EntryRow, ExpanderRow}; -use crate::components::wifi::{wifiAddressEntry}; use gtk::subclass::prelude::*; -use gtk::{glib, CompositeTemplate, Button}; +use gtk::{glib, Button, CompositeTemplate}; #[allow(non_snake_case)] #[derive(Default, CompositeTemplate)] diff --git a/src/components/wifi/wifiBox.rs b/src/components/wifi/wifiBox.rs index ef13542..ecad665 100644 --- a/src/components/wifi/wifiBox.rs +++ b/src/components/wifi/wifiBox.rs @@ -4,39 +4,37 @@ use std::sync::Arc; use std::time::Duration; - use crate::components::base::utils::Listeners; +use crate::components::utils::setComboRowEllipsis; use adw::glib; use adw::glib::Object; use adw::prelude::{ListBoxRowExt, PreferencesGroupExt}; use adw::subclass::prelude::ObjectSubclassIsExt; -use dbus::arg::{RefArg}; use dbus::blocking::Connection; use dbus::message::SignalArgs; use dbus::Error; use dbus::Path; -use glib::{ObjectExt, PropertySet}; +use glib::PropertySet; use gtk::gio; use gtk::glib::Variant; use gtk::prelude::{ActionableExt, WidgetExt}; use ReSet_Lib::network::network::{AccessPoint, WifiStrength}; -use ReSet_Lib::signals::{AccessPointAdded}; +use ReSet_Lib::signals::AccessPointAdded; use ReSet_Lib::signals::{AccessPointChanged, AccessPointRemoved}; -use crate::components::utils::setComboRowEllipsis; - use crate::components::wifi::wifiBoxImpl; use crate::components::wifi::wifiEntry::WifiEntry; use super::savedWifiEntry::SavedWifiEntry; - glib::wrapper! { pub struct WifiBox(ObjectSubclass) @extends gtk::Box, gtk::Widget, @implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable; } +type ResultMap = Result<(Vec<(Path<'static>, Vec)>,), Error>; + unsafe impl Send for WifiBox {} unsafe impl Sync for WifiBox {} @@ -56,11 +54,19 @@ impl WifiBox { .set_action_target_value(Some(&Variant::from("saved"))); selfImp.resetAvailableNetworks.set_activatable(true); - selfImp.resetAvailableNetworks.set_action_name(Some("navigation.pop")); + selfImp + .resetAvailableNetworks + .set_action_name(Some("navigation.pop")); setComboRowEllipsis(selfImp.resetWiFiDevice.get()); } } +impl Default for WifiBox { + fn default() -> Self { + Self::new() + } +} + pub fn scanForWifi(_listeners: Arc, wifiBox: Arc) { let wifibox_ref = wifiBox.clone(); let _wifibox_ref_listener = wifiBox.clone(); @@ -116,7 +122,8 @@ pub fn dbus_start_network_events() { "/org/Xetibo/ReSetDaemon", Duration::from_millis(1000), ); - let _: Result<(), Error> = proxy.method_call("org.Xetibo.ReSetWireless", "StartNetworkListener", ()); + let _: Result<(), Error> = + proxy.method_call("org.Xetibo.ReSetWireless", "StartNetworkListener", ()); } pub fn get_access_points() -> Vec { @@ -142,8 +149,7 @@ pub fn get_stored_connections() -> Vec<(Path<'static>, Vec)> { "/org/Xetibo/ReSetDaemon", Duration::from_millis(1000), ); - let res: Result<(Vec<(Path<'static>, Vec)>,), Error> = - proxy.method_call("org.Xetibo.ReSetWireless", "ListStoredConnections", ()); + let res: ResultMap = proxy.method_call("org.Xetibo.ReSetWireless", "ListStoredConnections", ()); if res.is_err() { println!("we got error..."); return Vec::new(); @@ -162,7 +168,7 @@ pub fn start_event_listener(listeners: Arc, wifi_box: Arc) { let conn = Connection::new_session().unwrap(); let added_ref = wifi_box.clone(); let removed_ref = wifi_box.clone(); - let changed_ref = wifi_box.clone(); // TODO implement changed + let changed_ref = wifi_box.clone(); let access_point_added = AccessPointAdded::match_rule( Some(&"org.Xetibo.ReSetDaemon".into()), Some(&Path::from("/org/Xetibo/ReSetDaemon")), diff --git a/src/components/wifi/wifiOptions.rs b/src/components/wifi/wifiOptions.rs index 1d2a507..493eedb 100644 --- a/src/components/wifi/wifiOptions.rs +++ b/src/components/wifi/wifiOptions.rs @@ -20,6 +20,9 @@ glib::wrapper! { @implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget; } +unsafe impl Send for WifiOptions {} +unsafe impl Sync for WifiOptions {} + impl WifiOptions { pub fn new(connection: Connection) -> Arc { let wifiOption: Arc = Arc::new(Object::builder().build()); @@ -34,8 +37,12 @@ impl WifiOptions { let conn = selfImp.connection.borrow(); // General selfImp.resetWifiName.set_subtitle(&conn.settings.name); - selfImp.resetWifiAutoConnect.set_active(conn.settings.autoconnect); - selfImp.resetWifiMetered.set_active(conn.settings.metered != -1); + selfImp + .resetWifiAutoConnect + .set_active(conn.settings.autoconnect); + selfImp + .resetWifiMetered + .set_active(conn.settings.metered != -1); match &conn.device { TypeSettings::WIFI(wifi) => { selfImp.resetWifiLinkSpeed.set_visible(false); @@ -44,7 +51,7 @@ impl WifiOptions { selfImp.resetWifiDNS.set_visible(false); selfImp.resetWifiGateway.set_visible(false); selfImp.resetWifiLastUsed.set_visible(true); - selfImp.resetWifiMac.set_subtitle(&*wifi.cloned_mac_address); + selfImp.resetWifiMac.set_subtitle(&wifi.cloned_mac_address); } TypeSettings::ETHERNET(ethernet) => { selfImp.resetWifiLinkSpeed.set_visible(true); @@ -53,17 +60,26 @@ impl WifiOptions { selfImp.resetWifiDNS.set_visible(true); selfImp.resetWifiGateway.set_visible(true); selfImp.resetWifiLastUsed.set_visible(false); - selfImp.resetWifiMac.set_subtitle(&*ethernet.cloned_mac_address); - selfImp.resetWifiLinkSpeed.set_subtitle(&*ethernet.speed.to_string()); + selfImp + .resetWifiMac + .set_subtitle(ðernet.cloned_mac_address); + selfImp + .resetWifiLinkSpeed + .set_subtitle(ðernet.speed.to_string()); } TypeSettings::VPN(_vpn) => {} TypeSettings::None => {} }; // IPv4 - selfImp.resetIP4Method.set_selected(conn.ipv4.dns_method.to_i32() as u32); + selfImp + .resetIP4Method + .set_selected(conn.ipv4.dns_method.to_i32() as u32); self.setIP4Visibility(conn.ipv4.dns_method.to_i32() as u32); - let ipv4Dns: Vec = conn.ipv4.dns.iter() + let ipv4Dns: Vec = conn + .ipv4 + .dns + .iter() .map(|addr| { addr.iter() .map(|octet| octet.to_string()) @@ -75,10 +91,14 @@ impl WifiOptions { selfImp.resetIP4Gateway.set_text(&conn.ipv4.gateway); if conn.ipv4.address_data.is_empty() { - selfImp.resetIP4AddressGroup.add(&WifiAddressEntry::new(None)) + selfImp + .resetIP4AddressGroup + .add(&WifiAddressEntry::new(None)) } else { for address in conn.ipv4.address_data.iter() { - selfImp.resetIP4AddressGroup.add(&WifiAddressEntry::new(Some(address))) + selfImp + .resetIP4AddressGroup + .add(&WifiAddressEntry::new(Some(address))) } } @@ -86,14 +106,21 @@ impl WifiOptions { selfImp.resetIP4RoutesGroup.add(&WifiRouteEntry::new(None)) } else { for address in conn.ipv4.route_data.iter() { - selfImp.resetIP4RoutesGroup.add(&WifiRouteEntry::new(Some(address))) + selfImp + .resetIP4RoutesGroup + .add(&WifiRouteEntry::new(Some(address))) } } // IPv6 - selfImp.resetIP6Method.set_selected(conn.ipv6.dns_method.to_i32() as u32); + selfImp + .resetIP6Method + .set_selected(conn.ipv6.dns_method.to_i32() as u32); self.setIP6Visibility(conn.ipv6.dns_method.to_i32() as u32); - let ipv6Dns: Vec = conn.ipv6.dns.iter() + let ipv6Dns: Vec = conn + .ipv6 + .dns + .iter() .map(|addr| { addr.iter() .map(|octet| octet.to_string()) @@ -105,10 +132,14 @@ impl WifiOptions { selfImp.resetIP6Gateway.set_text(&conn.ipv6.gateway); if conn.ipv6.address_data.is_empty() { - selfImp.resetIP6AddressGroup.add(&WifiAddressEntry::new(None)) + selfImp + .resetIP6AddressGroup + .add(&WifiAddressEntry::new(None)) } else { for address in conn.ipv6.address_data.iter() { - selfImp.resetIP6AddressGroup.add(&WifiAddressEntry::new(Some(address))) + selfImp + .resetIP6AddressGroup + .add(&WifiAddressEntry::new(Some(address))) } } @@ -116,7 +147,9 @@ impl WifiOptions { selfImp.resetIP6RoutesGroup.add(&WifiRouteEntry::new(None)) } else { for address in conn.ipv6.route_data.iter() { - selfImp.resetIP6RoutesGroup.add(&WifiRouteEntry::new(Some(address))) + selfImp + .resetIP6RoutesGroup + .add(&WifiRouteEntry::new(Some(address))) } } // Security @@ -126,12 +159,14 @@ impl WifiOptions { pub fn setIP4Visibility(&self, method: u32) { let selfImp = self.imp(); match method { - 0 => { // auto + 0 => { + // auto selfImp.resetIP4AddressGroup.set_visible(false); selfImp.resetIP4RoutesGroup.set_visible(true); selfImp.resetIP4Gateway.set_visible(false); } - 1 => { // manual + 1 => { + // manual selfImp.resetIP4AddressGroup.set_visible(true); selfImp.resetIP4RoutesGroup.set_visible(true); selfImp.resetIP4Gateway.set_visible(true); @@ -147,12 +182,14 @@ impl WifiOptions { pub fn setIP6Visibility(&self, method: u32) { let selfImp = self.imp(); match method { - 0 | 1 => { // auto, dhcp + 0 | 1 => { + // auto, dhcp selfImp.resetIP6AddressGroup.set_visible(false); selfImp.resetIP6RoutesGroup.set_visible(true); selfImp.resetIP6Gateway.set_visible(false); } - 2 => { // manual + 2 => { + // manual selfImp.resetIP6AddressGroup.set_visible(true); selfImp.resetIP6RoutesGroup.set_visible(true); selfImp.resetIP6Gateway.set_visible(true); @@ -170,55 +207,57 @@ fn setupCallbacks(wifiOptions: &Arc) { let imp = wifiOptions.imp(); // General - imp.resetWifiAutoConnect.connect_active_notify(clone!(@weak imp => move |x| { - imp.connection.borrow_mut().settings.autoconnect = x.is_active(); - })); - imp.resetWifiMetered.connect_active_notify(clone!(@weak imp => move |x| { - imp.connection.borrow_mut().settings.metered = if x.is_active() { 1 } else { 2 }; - })); + imp.resetWifiAutoConnect + .connect_active_notify(clone!(@weak imp => move |x| { + imp.connection.borrow_mut().settings.autoconnect = x.is_active(); + })); + imp.resetWifiMetered + .connect_active_notify(clone!(@weak imp => move |x| { + imp.connection.borrow_mut().settings.metered = if x.is_active() { 1 } else { 2 }; + })); // IPv4 let wifiOptionsIP4 = wifiOptions.clone(); - imp.resetIP4Method.connect_selected_notify(clone!(@weak imp => move |dropdown| { - let selected = dropdown.selected(); - wifiOptionsIP4.setIP4Visibility(selected); - })); + imp.resetIP4Method + .connect_selected_notify(clone!(@weak imp => move |dropdown| { + let selected = dropdown.selected(); + wifiOptionsIP4.setIP4Visibility(selected); + })); let dnsRegex = Regex::new(r"^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}$").unwrap(); - imp.resetIP4DNS.connect_changed(clone!(@weak imp => move |entry| { - let dnsInput = entry.text(); - let mut conn = imp.connection.borrow_mut(); - conn.ipv4.dns.clear(); - if dnsInput.as_str().is_empty() { - imp.resetIP4DNS.remove_css_class("error"); - return; - } - for dnsEntry in dnsInput.as_str().split(',').collect::>() { - if dnsRegex.is_match(dnsEntry) { + imp.resetIP4DNS + .connect_changed(clone!(@weak imp => move |entry| { + let dnsInput = entry.text(); + let mut conn = imp.connection.borrow_mut(); + conn.ipv4.dns.clear(); + if dnsInput.as_str().is_empty() { imp.resetIP4DNS.remove_css_class("error"); - let dnsParts = dnsEntry.split('.') - .map(|s| s.parse::().unwrap()) - .collect::>(); - conn.ipv4.dns.push(dnsParts); - } else { - imp.resetIP4DNS.add_css_class("error"); + return; } - } - })); + for dnsEntry in dnsInput.as_str().split(',').collect::>() { + if dnsRegex.is_match(dnsEntry) { + imp.resetIP4DNS.remove_css_class("error"); + let dnsParts = dnsEntry.split('.') + .map(|s| s.parse::().unwrap()) + .collect::>(); + conn.ipv4.dns.push(dnsParts); + } else { + imp.resetIP4DNS.add_css_class("error"); + } + } + })); // IPv6 let wifiOptionsIP6 = wifiOptions.clone(); - imp.resetIP6Method.connect_selected_notify(clone!(@weak imp => move |dropdown| { - let selected = dropdown.selected(); - wifiOptionsIP6.setIP6Visibility(selected); - })); + imp.resetIP6Method + .connect_selected_notify(clone!(@weak imp => move |dropdown| { + let selected = dropdown.selected(); + wifiOptionsIP6.setIP6Visibility(selected); + })); // Security } pub fn getValueFromKey(map: &PropMap, key: &str) -> String { - map.get(key) - .map_or_else(|| "".to_string(), - |value| value.0 - .as_str() - .unwrap_or_default() - .trim() - .to_string()) + map.get(key).map_or_else( + || "".to_string(), + |value| value.0.as_str().unwrap_or_default().trim().to_string(), + ) } diff --git a/src/main.rs b/src/main.rs index 0163cc1..505614d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -18,8 +18,6 @@ const APP_ID: &str = "org.Xetibo.ReSet"; #[tokio::main] async fn main() { - // TODO is this the best way to handle this?? - tokio::task::spawn(daemon_check()); gio::resources_register_include!("src.templates.gresource") .expect("Failed to register resources.");