diff --git a/flatpak/cargo-sources.json b/flatpak/cargo-sources.json index 2303bed..1f58edb 100644 --- a/flatpak/cargo-sources.json +++ b/flatpak/cargo-sources.json @@ -808,14 +808,14 @@ { "type": "archive", "archive-type": "tar-gzip", - "url": "https://static.crates.io/crates/mio/mio-0.8.10.crate", - "sha256": "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09", - "dest": "cargo/vendor/mio-0.8.10" + "url": "https://static.crates.io/crates/mio/mio-0.8.9.crate", + "sha256": "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0", + "dest": "cargo/vendor/mio-0.8.9" }, { "type": "inline", - "contents": "{\"package\": \"8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09\", \"files\": {}}", - "dest": "cargo/vendor/mio-0.8.10", + "contents": "{\"package\": \"3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0\", \"files\": {}}", + "dest": "cargo/vendor/mio-0.8.9", "dest-filename": ".cargo-checksum.json" }, { @@ -873,14 +873,14 @@ { "type": "archive", "archive-type": "tar-gzip", - "url": "https://static.crates.io/crates/once_cell/once_cell-1.19.0.crate", - "sha256": "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92", - "dest": "cargo/vendor/once_cell-1.19.0" + "url": "https://static.crates.io/crates/once_cell/once_cell-1.18.0.crate", + "sha256": "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d", + "dest": "cargo/vendor/once_cell-1.18.0" }, { "type": "inline", - "contents": "{\"package\": \"3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92\", \"files\": {}}", - "dest": "cargo/vendor/once_cell-1.19.0", + "contents": "{\"package\": \"dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d\", \"files\": {}}", + "dest": "cargo/vendor/once_cell-1.18.0", "dest-filename": ".cargo-checksum.json" }, { @@ -964,14 +964,14 @@ { "type": "archive", "archive-type": "tar-gzip", - "url": "https://static.crates.io/crates/proc-macro-crate/proc-macro-crate-2.0.1.crate", - "sha256": "97dc5fea232fc28d2f597b37c4876b348a40e33f3b02cc975c8d006d78d94b1a", - "dest": "cargo/vendor/proc-macro-crate-2.0.1" + "url": "https://static.crates.io/crates/proc-macro-crate/proc-macro-crate-2.0.0.crate", + "sha256": "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8", + "dest": "cargo/vendor/proc-macro-crate-2.0.0" }, { "type": "inline", - "contents": "{\"package\": \"97dc5fea232fc28d2f597b37c4876b348a40e33f3b02cc975c8d006d78d94b1a\", \"files\": {}}", - "dest": "cargo/vendor/proc-macro-crate-2.0.1", + "contents": "{\"package\": \"7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8\", \"files\": {}}", + "dest": "cargo/vendor/proc-macro-crate-2.0.0", "dest-filename": ".cargo-checksum.json" }, { @@ -1302,27 +1302,27 @@ { "type": "archive", "archive-type": "tar-gzip", - "url": "https://static.crates.io/crates/toml/toml-0.8.2.crate", - "sha256": "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d", - "dest": "cargo/vendor/toml-0.8.2" + "url": "https://static.crates.io/crates/toml/toml-0.8.8.crate", + "sha256": "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35", + "dest": "cargo/vendor/toml-0.8.8" }, { "type": "inline", - "contents": "{\"package\": \"185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d\", \"files\": {}}", - "dest": "cargo/vendor/toml-0.8.2", + "contents": "{\"package\": \"a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35\", \"files\": {}}", + "dest": "cargo/vendor/toml-0.8.8", "dest-filename": ".cargo-checksum.json" }, { "type": "archive", "archive-type": "tar-gzip", - "url": "https://static.crates.io/crates/toml_datetime/toml_datetime-0.6.3.crate", - "sha256": "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b", - "dest": "cargo/vendor/toml_datetime-0.6.3" + "url": "https://static.crates.io/crates/toml_datetime/toml_datetime-0.6.5.crate", + "sha256": "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1", + "dest": "cargo/vendor/toml_datetime-0.6.5" }, { "type": "inline", - "contents": "{\"package\": \"7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b\", \"files\": {}}", - "dest": "cargo/vendor/toml_datetime-0.6.3", + "contents": "{\"package\": \"3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1\", \"files\": {}}", + "dest": "cargo/vendor/toml_datetime-0.6.5", "dest-filename": ".cargo-checksum.json" }, { @@ -1341,14 +1341,27 @@ { "type": "archive", "archive-type": "tar-gzip", - "url": "https://static.crates.io/crates/toml_edit/toml_edit-0.20.2.crate", - "sha256": "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338", - "dest": "cargo/vendor/toml_edit-0.20.2" + "url": "https://static.crates.io/crates/toml_edit/toml_edit-0.20.7.crate", + "sha256": "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81", + "dest": "cargo/vendor/toml_edit-0.20.7" }, { "type": "inline", - "contents": "{\"package\": \"396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338\", \"files\": {}}", - "dest": "cargo/vendor/toml_edit-0.20.2", + "contents": "{\"package\": \"70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81\", \"files\": {}}", + "dest": "cargo/vendor/toml_edit-0.20.7", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/toml_edit/toml_edit-0.21.0.crate", + "sha256": "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03", + "dest": "cargo/vendor/toml_edit-0.21.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03\", \"files\": {}}", + "dest": "cargo/vendor/toml_edit-0.21.0", "dest-filename": ".cargo-checksum.json" }, { @@ -1562,14 +1575,14 @@ { "type": "archive", "archive-type": "tar-gzip", - "url": "https://static.crates.io/crates/winnow/winnow-0.5.26.crate", - "sha256": "b67b5f0a4e7a27a64c651977932b9dc5667ca7fc31ac44b03ed37a0cf42fdfff", - "dest": "cargo/vendor/winnow-0.5.26" + "url": "https://static.crates.io/crates/winnow/winnow-0.5.19.crate", + "sha256": "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b", + "dest": "cargo/vendor/winnow-0.5.19" }, { "type": "inline", - "contents": "{\"package\": \"b67b5f0a4e7a27a64c651977932b9dc5667ca7fc31ac44b03ed37a0cf42fdfff\", \"files\": {}}", - "dest": "cargo/vendor/winnow-0.5.26", + "contents": "{\"package\": \"829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b\", \"files\": {}}", + "dest": "cargo/vendor/winnow-0.5.19", "dest-filename": ".cargo-checksum.json" }, { diff --git a/src/components/base/utils.rs b/src/components/base/utils.rs index a5c1bdb..8a19bbb 100644 --- a/src/components/base/utils.rs +++ b/src/components/base/utils.rs @@ -23,6 +23,18 @@ use crate::components::{ output::sink_box::{start_output_box_listener, SinkBox}, }; +#[derive(Default, PartialEq, Eq)] +pub enum Position { + Connectivity, + Wifi, + Bluetooth, + Audio, + AudioOutput, + AudioInput, + #[default] + Home, +} + #[derive(Default)] pub struct Listeners { pub wifi_disabled: AtomicBool, @@ -405,11 +417,9 @@ pub fn start_audio_listener( listeners.pulse_listener.store(true, Ordering::SeqCst); - println!("starting audio listener"); loop { let _ = conn.process(Duration::from_millis(1000)); if !listeners.pulse_listener.load(Ordering::SeqCst) { - println!("stopping audio listener"); stop_dbus_audio_listener(conn); break; } diff --git a/src/components/input/source_box.rs b/src/components/input/source_box.rs index 31d1291..0260ae8 100644 --- a/src/components/input/source_box.rs +++ b/src/components/input/source_box.rs @@ -40,7 +40,13 @@ unsafe impl Sync for SourceBox {} impl SourceBox { pub fn new() -> Self { - Object::builder().build() + let obj: Self = Object::builder().build(); + { + let imp = obj.imp(); + let mut model_index = imp.reset_model_index.write().unwrap(); + *model_index = 0; + } + obj } pub fn setup_callbacks(&self) { @@ -85,68 +91,70 @@ impl Default for SourceBox { pub fn populate_sources(input_box: Arc) { gio::spawn_blocking(move || { - let output_box_imp = input_box.imp(); let sources = get_sources(); { - let list = output_box_imp.reset_model_list.write().unwrap(); - let mut map = output_box_imp.reset_source_map.write().unwrap(); - let mut model_index = output_box_imp.reset_model_index.write().unwrap(); + let input_box_imp = input_box.imp(); + let list = input_box_imp.reset_model_list.write().unwrap(); + let mut map = input_box_imp.reset_source_map.write().unwrap(); + let mut model_index = input_box_imp.reset_model_index.write().unwrap(); + input_box_imp + .reset_default_source + .replace(get_default_source()); for (i, source) in (0_u32..).zip(sources.iter()) { list.append(&source.alias); map.insert(source.alias.clone(), (source.index, i, source.name.clone())); *model_index += 1; } } - output_box_imp - .reset_default_source - .replace(get_default_source()); populate_outputstreams(input_box.clone()); populate_cards(input_box.clone()); glib::spawn_future(async move { glib::idle_add_once(move || { - let output_box_ref_slider = input_box.clone(); - let output_box_ref_mute = input_box.clone(); - let output_box_ref = input_box.clone(); + let input_box_ref_slider = input_box.clone(); + let input_box_ref_toggle = input_box.clone(); + let input_box_ref_mute = input_box.clone(); + let input_box_ref = input_box.clone(); { - let output_box_imp = output_box_ref.imp(); - let default_sink = output_box_imp.reset_default_source.clone(); + let input_box_imp = input_box_ref.imp(); + let default_sink = input_box_imp.reset_default_source.clone(); let source = default_sink.borrow(); let volume = source.volume.first().unwrap_or(&0_u32); let fraction = (*volume as f64 / 655.36).round(); let percentage = (fraction).to_string() + "%"; - output_box_imp.reset_volume_percentage.set_text(&percentage); - output_box_imp.reset_volume_slider.set_value(*volume as f64); - let mut list = output_box_imp.reset_source_list.write().unwrap(); - for stream in sources { + input_box_imp.reset_volume_percentage.set_text(&percentage); + input_box_imp.reset_volume_slider.set_value(*volume as f64); + let mut list = input_box_imp.reset_source_list.write().unwrap(); + for source in sources { let index = source.index; let alias = source.alias.clone(); let mut is_default = false; - if output_box_imp.reset_default_source.borrow().name == stream.name { + if input_box_imp.reset_default_source.borrow().name == source.name { is_default = true; } let source_entry = Arc::new(SourceEntry::new( is_default, - output_box_imp.reset_default_check_button.clone(), - stream, + input_box_imp.reset_default_check_button.clone(), + source, + input_box.clone(), )); let source_clone = source_entry.clone(); let entry = Arc::new(ListEntry::new(&*source_entry)); entry.set_activatable(false); list.insert(index, (entry.clone(), source_clone, alias)); - output_box_imp.reset_sources.append(&*entry); + input_box_imp.reset_sources.append(&*entry); } - let list = output_box_imp.reset_model_list.read().unwrap(); - output_box_imp.reset_source_dropdown.set_model(Some(&*list)); - let map = output_box_imp.reset_source_map.read().unwrap(); - let name = output_box_imp.reset_default_source.borrow(); + let list = input_box_imp.reset_model_list.read().unwrap(); + input_box_imp.reset_source_dropdown.set_model(Some(&*list)); + let map = input_box_imp.reset_source_map.read().unwrap(); + let name = input_box_imp.reset_default_source.borrow(); if let Some(index) = map.get(&name.alias) { - output_box_imp.reset_source_dropdown.set_selected(index.1); + input_box_imp.reset_source_dropdown.set_selected(index.1); } - output_box_imp - .reset_source_dropdown - .connect_selected_notify(clone!(@weak output_box_imp => move |dropdown| { + input_box_imp.reset_source_dropdown.connect_selected_notify( + clone!(@weak input_box_imp => move |dropdown| { + let input_box = input_box_ref_toggle.clone(); let selected = dropdown.selected_item(); if selected.is_none() { return; @@ -155,20 +163,27 @@ pub fn populate_sources(input_box: Arc) { let selected = selected.downcast_ref::().unwrap(); let selected = selected.string().to_string(); - let source = output_box_imp.reset_source_map.read().unwrap(); + let source = input_box_imp.reset_source_map.read().unwrap(); let source = source.get(&selected); if source.is_none() { return; } - let sink = Arc::new(source.unwrap().2.clone()); - set_default_source(sink); - })); + let source = Arc::new(source.unwrap().2.clone()); + gio::spawn_blocking(move || { + let result = set_default_source(source); + if result.is_none(){ + return; + } + refresh_default_source(result.unwrap(), input_box.clone(), false); + }); + }), + ); } - output_box_ref + input_box_ref .imp() .reset_volume_slider .connect_change_value(move |_, _, value| { - let imp = output_box_ref_slider.imp(); + let imp = input_box_ref_slider.imp(); let fraction = (value / 655.36).round(); let percentage = (fraction).to_string() + "%"; imp.reset_volume_percentage.set_text(&percentage); @@ -188,27 +203,64 @@ pub fn populate_sources(input_box: Arc) { Propagation::Proceed }); - output_box_ref + input_box_ref .imp() .reset_source_mute .connect_clicked(move |_| { - let imp = output_box_ref_mute.imp(); - let mut stream = imp.reset_default_source.borrow_mut(); - stream.muted = !stream.muted; - if stream.muted { + let imp = input_box_ref_mute.imp(); + let mut source = imp.reset_default_source.borrow_mut(); + source.muted = !source.muted; + if source.muted { imp.reset_source_mute .set_icon_name("microphone-disabled-symbolic"); } else { imp.reset_source_mute .set_icon_name("audio-input-microphone-symbolic"); } - toggle_source_mute(stream.index, stream.muted); + toggle_source_mute(source.index, source.muted); }); }); }); }); } +pub fn refresh_default_source(new_source: Source, input_box: Arc, entry: bool) { + let volume = *new_source.volume.first().unwrap_or(&0_u32); + let fraction = (volume as f64 / 655.36).round(); + let percentage = (fraction).to_string() + "%"; + glib::spawn_future(async move { + glib::idle_add_once(move || { + let imp = input_box.imp(); + if !entry { + let list = imp.reset_source_list.read().unwrap(); + let entry = list.get(&new_source.index); + if entry.is_none() { + return; + } + let entry_imp = entry.unwrap().1.imp(); + entry_imp.reset_selected_source.set_active(true); + } else { + let map = imp.reset_source_map.read().unwrap(); + let entry = map.get(&new_source.alias); + if entry.is_none() { + return; + } + imp.reset_source_dropdown.set_selected(entry.unwrap().1); + } + imp.reset_volume_percentage.set_text(&percentage); + imp.reset_volume_slider.set_value(volume as f64); + if new_source.muted { + imp.reset_source_mute + .set_icon_name("microphone-disabled-symbolic"); + } else { + imp.reset_source_mute + .set_icon_name("audio-input-microphone-symbolic"); + } + imp.reset_default_source.replace(new_source); + }); + }); +} + pub fn populate_outputstreams(input_box: Arc) { let input_box_ref = input_box.clone(); @@ -234,11 +286,11 @@ pub fn populate_outputstreams(input_box: Arc) { pub fn populate_cards(input_box: Arc) { gio::spawn_blocking(move || { - let output_box_ref = input_box.clone(); + let input_box_ref = input_box.clone(); let cards = get_cards(); glib::spawn_future(async move { glib::idle_add_once(move || { - let imp = output_box_ref.imp(); + let imp = input_box_ref.imp(); for card in cards { imp.reset_cards.add(&CardEntry::new(card)); } @@ -365,29 +417,30 @@ pub fn start_input_box_listener(conn: Connection, source_box: Arc) -> let source_box = source_added_box.clone(); glib::spawn_future(async move { glib::idle_add_once(move || { - let output_box = source_box.clone(); - let output_box_imp = output_box.imp(); - let mut list = output_box_imp.reset_source_list.write().unwrap(); + let input_box = source_box.clone(); + let input_box_imp = input_box.imp(); + let mut list = input_box_imp.reset_source_list.write().unwrap(); let source_index = ir.source.index; let alias = ir.source.alias.clone(); let name = ir.source.name.clone(); let mut is_default = false; - if output_box_imp.reset_default_source.borrow().name == ir.source.name { + if input_box_imp.reset_default_source.borrow().name == ir.source.name { is_default = true; } let source_entry = Arc::new(SourceEntry::new( is_default, - output_box_imp.reset_default_check_button.clone(), + input_box_imp.reset_default_check_button.clone(), ir.source, + input_box.clone(), )); let source_clone = source_entry.clone(); let entry = Arc::new(ListEntry::new(&*source_entry)); entry.set_activatable(false); list.insert(source_index, (entry.clone(), source_clone, alias.clone())); - output_box_imp.reset_sources.append(&*entry); - let mut map = output_box_imp.reset_source_map.write().unwrap(); - let mut index = output_box_imp.reset_model_index.write().unwrap(); - output_box_imp + input_box_imp.reset_sources.append(&*entry); + let mut map = input_box_imp.reset_source_map.write().unwrap(); + let mut index = input_box_imp.reset_model_index.write().unwrap(); + input_box_imp .reset_model_list .write() .unwrap() @@ -407,29 +460,26 @@ pub fn start_input_box_listener(conn: Connection, source_box: Arc) -> let source_box = source_removed_box.clone(); glib::spawn_future(async move { glib::idle_add_once(move || { - let output_box = source_box.clone(); - let output_box_imp = output_box.imp(); - let mut list = output_box_imp.reset_source_list.write().unwrap(); - let entry = list.get(&ir.index); + let input_box = source_box.clone(); + let input_box_imp = input_box.imp(); + let mut list = input_box_imp.reset_source_list.write().unwrap(); + let entry = list.remove(&ir.index); if entry.is_none() { return; } - output_box_imp.reset_sources.remove(&*entry.unwrap().0); - list.remove(&ir.index); - let alias = list.remove(&ir.index); - if alias.is_none() { - return; - } - let mut map = output_box_imp.reset_source_map.write().unwrap(); - let entry_index = map.remove(&alias.unwrap().2); + input_box_imp + .reset_sources + .remove(&*entry.clone().unwrap().0); + let mut map = input_box_imp.reset_source_map.write().unwrap(); + let entry_index = map.remove(&entry.unwrap().2); if let Some(entry_index) = entry_index { - output_box_imp + input_box_imp .reset_model_list .write() .unwrap() .remove(entry_index.1); } - let mut index = output_box_imp.reset_model_index.write().unwrap(); + let mut index = input_box_imp.reset_model_index.write().unwrap(); if *index != 0 { *index -= 1; } @@ -447,30 +497,31 @@ pub fn start_input_box_listener(conn: Connection, source_box: Arc) -> let default_source = get_default_source_name(); glib::spawn_future(async move { glib::idle_add_once(move || { - let output_box = source_box.clone(); - let output_box_imp = output_box.imp(); + let input_box = source_box.clone(); + let input_box_imp = input_box.imp(); let is_default = ir.source.name == default_source; let volume = ir.source.volume.first().unwrap_or(&0_u32); let fraction = (*volume as f64 / 655.36).round(); let percentage = (fraction).to_string() + "%"; - let list = output_box_imp.reset_source_list.read().unwrap(); + + let list = input_box_imp.reset_source_list.read().unwrap(); let entry = list.get(&ir.source.index); if entry.is_none() { return; } let imp = entry.unwrap().1.imp(); if is_default { - output_box_imp.reset_volume_percentage.set_text(&percentage); - output_box_imp.reset_volume_slider.set_value(*volume as f64); - output_box_imp + input_box_imp.reset_volume_percentage.set_text(&percentage); + input_box_imp.reset_volume_slider.set_value(*volume as f64); + input_box_imp .reset_default_source .replace(ir.source.clone()); if ir.source.muted { - output_box_imp + input_box_imp .reset_source_mute .set_icon_name("microphone-disabled-symbolic"); } else { - output_box_imp + input_box_imp .reset_source_mute .set_icon_name("audio-input-microphone-symbolic"); } @@ -502,16 +553,15 @@ pub fn start_input_box_listener(conn: Connection, source_box: Arc) -> let source_box = output_stream_added_box.clone(); glib::spawn_future(async move { glib::idle_add_once(move || { - let output_box = source_box.clone(); - let output_box_imp = output_box.imp(); - let mut list = output_box_imp.reset_output_stream_list.write().unwrap(); + let input_box = source_box.clone(); + let input_box_imp = input_box.imp(); + let mut list = input_box_imp.reset_output_stream_list.write().unwrap(); let index = ir.stream.index; - let output_stream = Arc::new(OutputStreamEntry::new(output_box.clone(), ir.stream)); - let output_stream_clone = output_stream.clone(); + let output_stream = Arc::new(OutputStreamEntry::new(input_box.clone(), ir.stream)); let entry = Arc::new(ListEntry::new(&*output_stream)); entry.set_activatable(false); - list.insert(index, (entry.clone(), output_stream_clone)); - output_box_imp.reset_output_streams.append(&*entry); + list.insert(index, (entry.clone(), output_stream.clone())); + input_box_imp.reset_output_streams.append(&*entry); }); }); true @@ -537,11 +587,11 @@ pub fn start_input_box_listener(conn: Connection, source_box: Arc) -> let source_box = output_stream_changed_box.clone(); glib::spawn_future(async move { glib::idle_add_once(move || { - let output_box = source_box.clone(); - let output_box_imp = output_box.imp(); + let input_box = source_box.clone(); + let input_box_imp = input_box.imp(); let entry: Arc; { - let list = output_box_imp.reset_output_stream_list.read().unwrap(); + let list = input_box_imp.reset_output_stream_list.read().unwrap(); let entry_opt = list.get(&ir.stream.index); if entry_opt.is_none() { return; @@ -563,7 +613,7 @@ pub fn start_input_box_listener(conn: Connection, source_box: Arc) -> let percentage = (fraction).to_string() + "%"; imp.reset_volume_percentage.set_text(&percentage); imp.reset_volume_slider.set_value(*volume as f64); - let map = output_box_imp.reset_source_map.read().unwrap(); + let map = input_box_imp.reset_source_map.read().unwrap(); if let Some(index) = map.get(&alias) { imp.reset_source_selection.set_selected(index.1); } @@ -583,14 +633,14 @@ pub fn start_input_box_listener(conn: Connection, source_box: Arc) -> let source_box = output_stream_removed_box.clone(); glib::spawn_future(async move { glib::idle_add_once(move || { - let output_box = source_box.clone(); - let output_box_imp = output_box.imp(); - let mut list = output_box_imp.reset_output_stream_list.write().unwrap(); + let input_box = source_box.clone(); + let input_box_imp = input_box.imp(); + let mut list = input_box_imp.reset_output_stream_list.write().unwrap(); let entry = list.remove(&ir.index); if entry.is_none() { return; } - output_box_imp + input_box_imp .reset_output_streams .remove(&*entry.unwrap().0); }); diff --git a/src/components/input/source_entry.rs b/src/components/input/source_entry.rs index b3cdb89..60a51e2 100644 --- a/src/components/input/source_entry.rs +++ b/src/components/input/source_entry.rs @@ -11,6 +11,7 @@ use glib::{clone, Propagation}; use gtk::{gio, CheckButton}; use re_set_lib::audio::audio_structures::Source; +use super::source_box::{refresh_default_source, SourceBox}; use super::source_entry_impl; glib::wrapper! { @@ -23,26 +24,31 @@ unsafe impl Send for SourceEntry {} unsafe impl Sync for SourceEntry {} impl SourceEntry { - pub fn new(is_default: bool, check_group: Arc, stream: Source) -> Self { + pub fn new( + is_default: bool, + check_group: Arc, + source: Source, + input_box: Arc, + ) -> Self { let obj: Self = Object::builder().build(); // TODO use event callback for progress bar -> this is the "im speaking" indicator { let imp = obj.imp(); imp.reset_source_name - .set_title(stream.alias.clone().as_str()); - let name = Arc::new(stream.name.clone()); - let volume = stream.volume.first().unwrap_or(&0_u32); + .set_title(source.alias.clone().as_str()); + let name = Arc::new(source.name.clone()); + let volume = source.volume.first().unwrap_or(&0_u32); let fraction = (*volume as f64 / 655.36).round(); let percentage = (fraction).to_string() + "%"; imp.reset_volume_percentage.set_text(&percentage); imp.reset_volume_slider.set_value(*volume as f64); - imp.stream.replace(stream); + imp.source.replace(source); imp.reset_volume_slider.connect_change_value( clone!(@weak imp => @default-return Propagation::Stop, move |_, _, value| { let fraction = (value / 655.36).round(); let percentage = (fraction).to_string() + "%"; imp.reset_volume_percentage.set_text(&percentage); - let source = imp.stream.borrow(); + let source = imp.source.borrow(); let index = source.index; let channels = source.channels; { @@ -65,23 +71,30 @@ impl SourceEntry { imp.reset_selected_source.set_active(false); } imp.reset_selected_source.connect_toggled(move |button| { + let input_box = input_box.clone(); if button.is_active() { - set_default_source(name.clone()); + let name = name.clone(); + gio::spawn_blocking(move || { + let result = set_default_source(name); + if result.is_none() { + return; + } + refresh_default_source(result.unwrap(), input_box, true); + }); } }); imp.reset_source_mute .connect_clicked(clone!(@weak imp => move |_| { - let stream = imp.stream.clone(); - let mut stream = stream.borrow_mut(); - stream.muted = !stream.muted; - if stream.muted { + let mut source = imp.source.borrow_mut(); + source.muted = !source.muted; + if source.muted { imp.reset_source_mute .set_icon_name("microphone-disabled-symbolic"); } else { imp.reset_source_mute .set_icon_name("audio-input-microphone-symbolic"); } - toggle_source_mute(stream.index, stream.muted); + toggle_source_mute(source.index, source.muted); })); } obj @@ -127,22 +140,20 @@ pub fn toggle_source_mute(index: u32, muted: bool) -> bool { true } -pub fn set_default_source(name: Arc) -> bool { - gio::spawn_blocking(move || { - let conn = Connection::new_session().unwrap(); - let proxy = conn.with_proxy( - "org.Xetibo.ReSetDaemon", - "/org/Xetibo/ReSetDaemon", - Duration::from_millis(1000), - ); - let _: Result<(), Error> = - proxy.method_call("org.Xetibo.ReSetAudio", "SetDefaultSink", (name.as_str(),)); - // if res.is_err() { - // return; - // } - // handle change - }); - true +pub fn set_default_source(name: Arc) -> Option { + let conn = Connection::new_session().unwrap(); + let proxy = conn.with_proxy( + "org.Xetibo.ReSetDaemon", + "/org/Xetibo/ReSetDaemon", + Duration::from_millis(1000), + ); + let res: Result<(Source,), Error> = proxy.method_call( + "org.Xetibo.ReSetAudio", + "SetDefaultSource", + (name.as_str(),), + ); + if res.is_err() { + return None; + } + Some(res.unwrap().0) } - -// TODO propagate error from dbus diff --git a/src/components/input/source_entry_impl.rs b/src/components/input/source_entry_impl.rs index 123afb0..6d46697 100644 --- a/src/components/input/source_entry_impl.rs +++ b/src/components/input/source_entry_impl.rs @@ -25,7 +25,7 @@ pub struct SourceEntry { pub reset_volume_percentage: TemplateChild