diff --git a/Cargo.toml b/Cargo.toml index f380968..1102a34 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ description = "A wip universal Linux settings application." [dependencies] reset_daemon = "0.3.3" -ReSet-Lib = "0.5.4" +ReSet-Lib = "0.5.5" adw = { version = "0.5.3", package = "libadwaita", features = ["v1_4"] } dbus = "0.9.7" gtk = { version = "0.7.3", package = "gtk4", features = ["v4_12"] } 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 bcc6342..17a483e 100644 --- a/src/components/bluetooth/bluetoothBox.rs +++ b/src/components/bluetooth/bluetoothBox.rs @@ -1,4 +1,3 @@ -use std::collections::HashMap; use std::sync::atomic::Ordering; use std::sync::Arc; use std::thread; @@ -12,15 +11,14 @@ use dbus::message::SignalArgs; use dbus::{Error, Path}; use gtk::gio; use gtk::glib::Variant; -use gtk::prelude::{ActionableExt, ListBoxRowExt}; +use gtk::prelude::{ActionableExt, ListBoxRowExt, WidgetExt}; use ReSet_Lib::bluetooth::bluetooth::BluetoothDevice; -use ReSet_Lib::signals::{BluetoothDeviceAdded, BluetoothDeviceRemoved}; +use ReSet_Lib::signals::{BluetoothDeviceAdded, BluetoothDeviceChanged, BluetoothDeviceRemoved}; use crate::components::base::listEntry::ListEntry; use crate::components::base::utils::Listeners; use crate::components::bluetooth::bluetoothBoxImpl; use crate::components::bluetooth::bluetoothEntry::BluetoothEntry; -// use crate::components::bluetooth::bluetoothEntryImpl::DeviceTypes; glib::wrapper! { pub struct BluetoothBox(ObjectSubclass) @@ -52,6 +50,12 @@ impl BluetoothBox { } } +impl Default for BluetoothBox { + fn default() -> Self { + Self::new() + } +} + pub fn populate_conntected_bluetooth_devices(bluetooth_box: Arc) { gio::spawn_blocking(move || { let ref_box = bluetooth_box.clone(); @@ -63,11 +67,11 @@ 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 = Arc::new(BluetoothEntry::new(device)); + let bluetooth_entry = Arc::new(BluetoothEntry::new(&device)); let entry = Arc::new(ListEntry::new(&*bluetooth_entry)); imp.availableDevices .borrow_mut() - .insert(path, (bluetooth_entry.clone(), entry.clone())); + .insert(path, (bluetooth_entry.clone(), entry.clone(), device)); if connected { imp.resetBluetoothConnectedDevices.append(&*entry); } else { @@ -108,24 +112,31 @@ pub fn start_bluetooth_listener(listeners: Arc, bluetooth_box: Arc, bluetooth_box: Arc, (Arc, Arc, BluetoothDevice)>>; + #[allow(non_snake_case)] #[derive(Default, CompositeTemplate)] #[template(resource = "/org/Xetibo/ReSet/resetBluetooth.ui")] @@ -25,8 +29,8 @@ pub struct BluetoothBox { pub resetVisibility: TemplateChild, #[template_child] pub resetBluetoothMainTab: TemplateChild, - pub availableDevices: RefCell, (Arc, Arc)>>, - pub connectedDevices: RefCell, (Arc, Arc)>>, + pub availableDevices: BluetoothMap, + pub connectedDevices: BluetoothMap, } #[glib::object_subclass] diff --git a/src/components/bluetooth/bluetoothEntry.rs b/src/components/bluetooth/bluetoothEntry.rs index 718e2c1..0b27254 100644 --- a/src/components/bluetooth/bluetoothEntry.rs +++ b/src/components/bluetooth/bluetoothEntry.rs @@ -1,15 +1,12 @@ -use std::rc::Rc; use std::sync::Arc; use std::time::Duration; use crate::components::bluetooth::bluetoothEntryImpl; -// use crate::components::bluetooth::bluetoothEntryImpl::DeviceTypes; use adw::glib; use adw::glib::Object; use adw::subclass::prelude::ObjectSubclassIsExt; use dbus::blocking::Connection; use dbus::{Error, Path}; -use glib::clone; use gtk::prelude::{ButtonExt, WidgetExt}; use gtk::{gio, GestureClick}; use ReSet_Lib::bluetooth::bluetooth::BluetoothDevice; @@ -20,22 +17,27 @@ glib::wrapper! { @implements gtk::Accessible, gtk::Buildable, gtk::Actionable, gtk::ConstraintTarget; } +unsafe impl Send for BluetoothEntry {} +unsafe impl Sync for BluetoothEntry {} + impl BluetoothEntry { - pub fn new(device: BluetoothDevice) -> Self { + pub fn new(device: &BluetoothDevice) -> Self { let entry: BluetoothEntry = Object::builder().build(); let entryImp = entry.imp(); - entryImp.resetBluetoothLabel.get().set_text(&device.name); - entryImp.resetBluetoothAddress.get().set_text(&device.alias); - // entryImp - // .resetBluetoothDeviceType - // .get() - // .set_from_icon_name(match deviceType { - // DeviceTypes::Mouse => Some("input-mouse-symbolic"), - // DeviceTypes::Keyboard => Some("input-keyboard-symbolic"), - // DeviceTypes::Headset => Some("output-headset-symbolic"), - // DeviceTypes::Controller => Some("input-gaming-symbolic"), - // DeviceTypes::None => Some("text-x-generic-symbolic"), // no generic bluetooth device icon found - // }); + entryImp.resetBluetoothLabel.get().set_text(&device.alias); + entryImp + .resetBluetoothAddress + .get() + .set_text(&device.address); + if device.icon.is_empty() { + entryImp + .resetBluetoothDeviceType + .set_icon_name(Some("dialog-question-symbolic")); + } else { + entryImp + .resetBluetoothDeviceType + .set_icon_name(Some(&device.icon)); + } if device.paired { entryImp.resetBluetoothButton.set_sensitive(true); } else { @@ -47,17 +49,17 @@ impl BluetoothEntry { }); let gesture = GestureClick::new(); let connected = device.connected; - entryImp.device.replace(device); - gesture.connect_released(clone!(@weak entryImp => move |_, _, _, _| { - let device = entryImp.device.borrow_mut(); + let paired = device.paired; + let path = device.path.clone(); + gesture.connect_released(move |_, _, _, _| { if connected { - disconnect_from_device(device.path.clone()); - } else if device.paired { - connect_to_device(device.path.clone()); + disconnect_from_device(path.clone()); + } else if paired { + connect_to_device(path.clone()); } else { - pair_with_device(device.path.clone()); + pair_with_device(path.clone()); } - })); + }); entry.add_controller(gesture); entry } diff --git a/src/components/bluetooth/bluetoothEntryImpl.rs b/src/components/bluetooth/bluetoothEntryImpl.rs index 5846ade..98c7bce 100644 --- a/src/components/bluetooth/bluetoothEntryImpl.rs +++ b/src/components/bluetooth/bluetoothEntryImpl.rs @@ -2,17 +2,7 @@ use crate::components::bluetooth::bluetoothEntry; use gtk::subclass::prelude::*; use gtk::{glib, Button, CompositeTemplate, Image, Label}; use std::cell::RefCell; -use ReSet_Lib::bluetooth::bluetooth::BluetoothDevice; -#[derive(Default, Copy, Clone)] -pub enum DeviceTypes { - Mouse, - Keyboard, - Headset, - Controller, - #[default] - None, -} #[allow(non_snake_case)] #[derive(Default, CompositeTemplate)] #[template(resource = "/org/Xetibo/ReSet/resetBluetoothEntry.ui")] @@ -26,7 +16,6 @@ pub struct BluetoothEntry { #[template_child] pub resetBluetoothButton: TemplateChild