diff --git a/Cargo.toml b/Cargo.toml index 90245ae..368ccec 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ edition = "2021" description = "A wip universal Linux settings application." [dependencies] -reset_daemon = "0.4.3" +reset_daemon = "0.4.5" re_set-lib = "0.6.5" adw = { version = "0.5.3", package = "libadwaita", features = ["v1_4"] } dbus = "0.9.7" diff --git a/flatpak/cargo-sources.json b/flatpak/cargo-sources.json index 3ee7976..2606cb6 100644 --- a/flatpak/cargo-sources.json +++ b/flatpak/cargo-sources.json @@ -2,14 +2,14 @@ { "type": "archive", "archive-type": "tar-gzip", - "url": "https://static.crates.io/crates/ReSet-Lib/ReSet-Lib-0.6.1.crate", - "sha256": "f0339936189c09ce78f125841314a08cf797e11a762b4eb2084f3434b2b455f5", - "dest": "cargo/vendor/ReSet-Lib-0.6.1" + "url": "https://static.crates.io/crates/ReSet-Lib/ReSet-Lib-0.6.3.crate", + "sha256": "299882cb1f2c9516ffb3ad541b103f495c53c1fc424d39d6b729bfea35640d9d", + "dest": "cargo/vendor/ReSet-Lib-0.6.3" }, { "type": "inline", - "contents": "{\"package\": \"f0339936189c09ce78f125841314a08cf797e11a762b4eb2084f3434b2b455f5\", \"files\": {}}", - "dest": "cargo/vendor/ReSet-Lib-0.6.1", + "contents": "{\"package\": \"299882cb1f2c9516ffb3ad541b103f495c53c1fc424d39d6b729bfea35640d9d\", \"files\": {}}", + "dest": "cargo/vendor/ReSet-Lib-0.6.3", "dest-filename": ".cargo-checksum.json" }, { @@ -821,14 +821,14 @@ { "type": "archive", "archive-type": "tar-gzip", - "url": "https://static.crates.io/crates/mio/mio-0.8.9.crate", - "sha256": "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0", - "dest": "cargo/vendor/mio-0.8.9" + "url": "https://static.crates.io/crates/mio/mio-0.8.10.crate", + "sha256": "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09", + "dest": "cargo/vendor/mio-0.8.10" }, { "type": "inline", - "contents": "{\"package\": \"3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0\", \"files\": {}}", - "dest": "cargo/vendor/mio-0.8.9", + "contents": "{\"package\": \"8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09\", \"files\": {}}", + "dest": "cargo/vendor/mio-0.8.10", "dest-filename": ".cargo-checksum.json" }, { @@ -886,14 +886,14 @@ { "type": "archive", "archive-type": "tar-gzip", - "url": "https://static.crates.io/crates/once_cell/once_cell-1.18.0.crate", - "sha256": "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d", - "dest": "cargo/vendor/once_cell-1.18.0" + "url": "https://static.crates.io/crates/once_cell/once_cell-1.19.0.crate", + "sha256": "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92", + "dest": "cargo/vendor/once_cell-1.19.0" }, { "type": "inline", - "contents": "{\"package\": \"dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d\", \"files\": {}}", - "dest": "cargo/vendor/once_cell-1.18.0", + "contents": "{\"package\": \"3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92\", \"files\": {}}", + "dest": "cargo/vendor/once_cell-1.19.0", "dest-filename": ".cargo-checksum.json" }, { @@ -977,14 +977,14 @@ { "type": "archive", "archive-type": "tar-gzip", - "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" + "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" }, { "type": "inline", - "contents": "{\"package\": \"7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8\", \"files\": {}}", - "dest": "cargo/vendor/proc-macro-crate-2.0.0", + "contents": "{\"package\": \"97dc5fea232fc28d2f597b37c4876b348a40e33f3b02cc975c8d006d78d94b1a\", \"files\": {}}", + "dest": "cargo/vendor/proc-macro-crate-2.0.1", "dest-filename": ".cargo-checksum.json" }, { @@ -1068,14 +1068,14 @@ { "type": "archive", "archive-type": "tar-gzip", - "url": "https://static.crates.io/crates/reset_daemon/reset_daemon-0.3.7.crate", - "sha256": "94cf69e4ef90fde3fa13c27f0d31565ff260dc6191aaabe771d52db12d49b30f", - "dest": "cargo/vendor/reset_daemon-0.3.7" + "url": "https://static.crates.io/crates/reset_daemon/reset_daemon-0.3.9.crate", + "sha256": "7bc399eebff1f7e3ea2c642b83eabf76425eaed6d3c955645691b24aa6b1504c", + "dest": "cargo/vendor/reset_daemon-0.3.9" }, { "type": "inline", - "contents": "{\"package\": \"94cf69e4ef90fde3fa13c27f0d31565ff260dc6191aaabe771d52db12d49b30f\", \"files\": {}}", - "dest": "cargo/vendor/reset_daemon-0.3.7", + "contents": "{\"package\": \"7bc399eebff1f7e3ea2c642b83eabf76425eaed6d3c955645691b24aa6b1504c\", \"files\": {}}", + "dest": "cargo/vendor/reset_daemon-0.3.9", "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.8.crate", - "sha256": "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35", - "dest": "cargo/vendor/toml-0.8.8" + "url": "https://static.crates.io/crates/toml/toml-0.8.2.crate", + "sha256": "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d", + "dest": "cargo/vendor/toml-0.8.2" }, { "type": "inline", - "contents": "{\"package\": \"a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35\", \"files\": {}}", - "dest": "cargo/vendor/toml-0.8.8", + "contents": "{\"package\": \"185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d\", \"files\": {}}", + "dest": "cargo/vendor/toml-0.8.2", "dest-filename": ".cargo-checksum.json" }, { "type": "archive", "archive-type": "tar-gzip", - "url": "https://static.crates.io/crates/toml_datetime/toml_datetime-0.6.5.crate", - "sha256": "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1", - "dest": "cargo/vendor/toml_datetime-0.6.5" + "url": "https://static.crates.io/crates/toml_datetime/toml_datetime-0.6.3.crate", + "sha256": "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b", + "dest": "cargo/vendor/toml_datetime-0.6.3" }, { "type": "inline", - "contents": "{\"package\": \"3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1\", \"files\": {}}", - "dest": "cargo/vendor/toml_datetime-0.6.5", + "contents": "{\"package\": \"7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b\", \"files\": {}}", + "dest": "cargo/vendor/toml_datetime-0.6.3", "dest-filename": ".cargo-checksum.json" }, { @@ -1341,27 +1341,14 @@ { "type": "archive", "archive-type": "tar-gzip", - "url": "https://static.crates.io/crates/toml_edit/toml_edit-0.20.7.crate", - "sha256": "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81", - "dest": "cargo/vendor/toml_edit-0.20.7" + "url": "https://static.crates.io/crates/toml_edit/toml_edit-0.20.2.crate", + "sha256": "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338", + "dest": "cargo/vendor/toml_edit-0.20.2" }, { "type": "inline", - "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", + "contents": "{\"package\": \"396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338\", \"files\": {}}", + "dest": "cargo/vendor/toml_edit-0.20.2", "dest-filename": ".cargo-checksum.json" }, { @@ -1575,14 +1562,14 @@ { "type": "archive", "archive-type": "tar-gzip", - "url": "https://static.crates.io/crates/winnow/winnow-0.5.19.crate", - "sha256": "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b", - "dest": "cargo/vendor/winnow-0.5.19" + "url": "https://static.crates.io/crates/winnow/winnow-0.5.26.crate", + "sha256": "b67b5f0a4e7a27a64c651977932b9dc5667ca7fc31ac44b03ed37a0cf42fdfff", + "dest": "cargo/vendor/winnow-0.5.26" }, { "type": "inline", - "contents": "{\"package\": \"829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b\", \"files\": {}}", - "dest": "cargo/vendor/winnow-0.5.19", + "contents": "{\"package\": \"b67b5f0a4e7a27a64c651977932b9dc5667ca7fc31ac44b03ed37a0cf42fdfff\", \"files\": {}}", + "dest": "cargo/vendor/winnow-0.5.26", "dest-filename": ".cargo-checksum.json" }, { diff --git a/src/components/bluetooth/bluetooth_box.rs b/src/components/bluetooth/bluetooth_box.rs index 6a36b48..f4246c5 100644 --- a/src/components/bluetooth/bluetooth_box.rs +++ b/src/components/bluetooth/bluetooth_box.rs @@ -37,6 +37,10 @@ impl BluetoothBox { } } +// TODO +// handle bonded -> this means saved but not connected +// handle rssi below x -> don't show device + fn setup_callbacks( listeners: Arc, bluetooth_box: Arc, @@ -110,6 +114,7 @@ fn setup_callbacks( } pub fn populate_conntected_bluetooth_devices(bluetooth_box: Arc) { + // TODO handle saved devices -> they also exist gio::spawn_blocking(move || { let ref_box = bluetooth_box.clone(); let devices = get_connected_devices(); @@ -177,10 +182,10 @@ pub fn populate_conntected_bluetooth_devices(bluetooth_box: Arc) { for device in devices { let path = device.path.clone(); let connected = device.connected; - let bluetooth_entry = BluetoothEntry::new(&device); + let bluetooth_entry = BluetoothEntry::new(device); imp.available_devices .borrow_mut() - .insert(path, (bluetooth_entry.clone(), device)); + .insert(path, bluetooth_entry.clone()); if connected { imp.reset_bluetooth_connected_devices.add(&*bluetooth_entry); } else { @@ -195,10 +200,8 @@ pub fn populate_conntected_bluetooth_devices(bluetooth_box: Arc) { pub fn start_bluetooth_listener(listeners: Arc, bluetooth_box: Arc) { gio::spawn_blocking(move || { if listeners.bluetooth_listener.load(Ordering::SeqCst) { - println!("bluetooth listener was active"); return; } - println!("starting bluetooth listener"); let conn = Connection::new_session().unwrap(); let proxy = conn.with_proxy( @@ -230,17 +233,15 @@ pub fn start_bluetooth_listener(listeners: Arc, bluetooth_box: Arc, bluetooth_box: Arc, bluetooth_box: Arc = + proxy.method_call("org.Xetibo.ReSetBluetooth", "StopBluetoothListener", ()); break; } - if listener_active && time.elapsed().unwrap() > Duration::from_millis(25000) { + if listener_active && time.elapsed().unwrap() > Duration::from_millis(10000) { listener_active = false; let instance_ref = loop_box.clone(); glib::spawn_future(async move { glib::idle_add_once(move || { - let imp = instance_ref.imp(); - let mut entries = imp.available_devices.borrow_mut(); - for entry in entries.iter() { - imp.reset_bluetooth_available_devices.remove(&*entry.1 .0); - } - entries.clear(); - imp.reset_bluetooth_refresh_button.set_sensitive(true); + instance_ref + .imp() + .reset_bluetooth_refresh_button + .set_sensitive(true); }); }); let _: Result<(), Error> = - proxy.method_call("org.Xetibo.ReSetBluetooth", "StopBluetoothListener", ()); + proxy.method_call("org.Xetibo.ReSetBluetooth", "StopBluetoothScan", ()); } if !listener_active && listeners.bluetooth_scan_requested.load(Ordering::SeqCst) { listeners diff --git a/src/components/bluetooth/bluetooth_box_impl.rs b/src/components/bluetooth/bluetooth_box_impl.rs index b22d8e2..220a60a 100644 --- a/src/components/bluetooth/bluetooth_box_impl.rs +++ b/src/components/bluetooth/bluetooth_box_impl.rs @@ -3,7 +3,7 @@ use dbus::Path; use gtk::subclass::prelude::*; use gtk::{glib, Button, CompositeTemplate, Switch}; use gtk::{prelude::*, StringList}; -use re_set_lib::bluetooth::bluetooth_structures::{BluetoothAdapter, BluetoothDevice}; +use re_set_lib::bluetooth::bluetooth_structures::BluetoothAdapter; use std::cell::RefCell; use std::collections::HashMap; use std::sync::{Arc, RwLock}; @@ -12,8 +12,7 @@ use crate::components::base::list_entry::ListEntry; use crate::components::bluetooth::bluetooth_box; use crate::components::bluetooth::bluetooth_entry::BluetoothEntry; -type BluetoothMap = - RefCell, (Arc, BluetoothDevice)>>; +type BluetoothMap = RefCell, Arc>>; #[derive(Default, CompositeTemplate)] #[template(resource = "/org/Xetibo/ReSet/resetBluetooth.ui")] diff --git a/src/components/bluetooth/bluetooth_entry.rs b/src/components/bluetooth/bluetooth_entry.rs index 8d04d18..a095be5 100644 --- a/src/components/bluetooth/bluetooth_entry.rs +++ b/src/components/bluetooth/bluetooth_entry.rs @@ -23,10 +23,11 @@ unsafe impl Send for BluetoothEntry {} unsafe impl Sync for BluetoothEntry {} impl BluetoothEntry { - pub fn new(device: &BluetoothDevice) -> Arc { + pub fn new(device: BluetoothDevice) -> Arc { let entry: Arc = Arc::new(Object::builder().build()); let entry_imp = entry.imp(); let entry_ref = entry.clone(); + let entry_ref_remove = entry.clone(); entry.set_title(&device.alias); entry.set_subtitle(&device.address); entry.set_activatable(true); @@ -37,53 +38,44 @@ impl BluetoothEntry { .valign(Align::Center) .build(), ); - entry_imp.connecting_label.replace( - Label::builder() - .label("") - .build(), - ); + entry_imp + .connecting_label + .replace(Label::builder().label("").build()); entry.add_suffix(entry_imp.remove_device_button.borrow().deref()); if device.icon.is_empty() { entry.add_prefix(&Image::from_icon_name("dialog-question-symbolic")); } else { entry.add_prefix(&Image::from_icon_name(&device.icon)); } - if device.connected || device.paired { + if device.connected || device.bonded { entry_imp.remove_device_button.borrow().set_sensitive(true); } else { entry_imp.remove_device_button.borrow().set_sensitive(false); } - let path = Arc::new(device.path.clone()); + + entry_imp.bluetooth_device.replace(device); entry_imp .remove_device_button .borrow() .connect_clicked(move |_| { - remove_device_pairing((*path).clone()); + let imp = entry_ref_remove.imp(); + remove_device_pairing(imp.bluetooth_device.borrow().path.clone()); }); let gesture = GestureClick::new(); - let connected = device.connected; - // let paired = device.paired; // paired is not what we think // TODO implement paired - let path = device.path.clone(); gesture.connect_released(move |_, _, _, _| { - if connected { + let imp = entry_ref.imp(); + let borrow = imp.bluetooth_device.borrow(); + if borrow.connected { let imp = entry_ref.imp(); imp.remove_device_button.borrow().set_sensitive(false); - entry_ref - .imp() - .connecting_label - .borrow() - .set_text("Disconnecting..."); - disconnect_from_device(entry_ref.clone(), path.clone()); + imp.connecting_label.borrow().set_text("Disconnecting..."); + disconnect_from_device(entry_ref.clone(), borrow.path.clone()); } else { entry_ref.set_sensitive(false); - entry_ref - .imp() - .connecting_label - .borrow() - .set_text("Connecting..."); - connect_to_device(entry_ref.clone(), path.clone()); + imp.connecting_label.borrow().set_text("Connecting..."); + connect_to_device(entry_ref.clone(), borrow.path.clone()); } }); entry.add_controller(gesture); diff --git a/src/components/bluetooth/bluetooth_entry_impl.rs b/src/components/bluetooth/bluetooth_entry_impl.rs index 609c528..ba90fe8 100644 --- a/src/components/bluetooth/bluetooth_entry_impl.rs +++ b/src/components/bluetooth/bluetooth_entry_impl.rs @@ -4,6 +4,7 @@ use adw::subclass::preferences_row::PreferencesRowImpl; use adw::ActionRow; use gtk::subclass::prelude::*; use gtk::{glib, Button, CompositeTemplate, Label}; +use re_set_lib::bluetooth::bluetooth_structures::BluetoothDevice; use std::cell::RefCell; #[derive(Default, CompositeTemplate)] @@ -12,6 +13,7 @@ pub struct BluetoothEntry { pub remove_device_button: RefCell