mirror of
https://github.com/Xetibo/ReSet.git
synced 2025-04-17 18:18:34 +02:00
Merge pull request #60 from Xetibo/dashie
feat: Audio Device configuration and initial bluetooth handling
This commit is contained in:
commit
d2c982145d
|
@ -5,8 +5,8 @@ edition = "2021"
|
||||||
description = "A wip universal Linux settings application."
|
description = "A wip universal Linux settings application."
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
reset_daemon = "0.1.7"
|
reset_daemon = "0.1.9"
|
||||||
ReSet-Lib = "0.2.8"
|
ReSet-Lib = "0.3.5"
|
||||||
adw = { version = "0.5.3", package = "libadwaita", features = ["v1_4"] }
|
adw = { version = "0.5.3", package = "libadwaita", features = ["v1_4"] }
|
||||||
dbus = "0.9.7"
|
dbus = "0.9.7"
|
||||||
gtk = { version = "0.7.3", package = "gtk4", features = ["v4_12"] }
|
gtk = { version = "0.7.3", package = "gtk4", features = ["v4_12"] }
|
||||||
|
|
|
@ -2,14 +2,14 @@
|
||||||
{
|
{
|
||||||
"type": "archive",
|
"type": "archive",
|
||||||
"archive-type": "tar-gzip",
|
"archive-type": "tar-gzip",
|
||||||
"url": "https://static.crates.io/crates/ReSet-Lib/ReSet-Lib-0.2.8.crate",
|
"url": "https://static.crates.io/crates/ReSet-Lib/ReSet-Lib-0.3.5.crate",
|
||||||
"sha256": "6761097b3d41653f8ad3b265625c840b6c415282ba20a0491fe6a7a7e817873a",
|
"sha256": "a0f2428f460a6604b353461d8244b3ce8841adcd964a2165cd2f9b975462b19d",
|
||||||
"dest": "cargo/vendor/ReSet-Lib-0.2.8"
|
"dest": "cargo/vendor/ReSet-Lib-0.3.5"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "inline",
|
"type": "inline",
|
||||||
"contents": "{\"package\": \"6761097b3d41653f8ad3b265625c840b6c415282ba20a0491fe6a7a7e817873a\", \"files\": {}}",
|
"contents": "{\"package\": \"a0f2428f460a6604b353461d8244b3ce8841adcd964a2165cd2f9b975462b19d\", \"files\": {}}",
|
||||||
"dest": "cargo/vendor/ReSet-Lib-0.2.8",
|
"dest": "cargo/vendor/ReSet-Lib-0.3.5",
|
||||||
"dest-filename": ".cargo-checksum.json"
|
"dest-filename": ".cargo-checksum.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -1042,14 +1042,14 @@
|
||||||
{
|
{
|
||||||
"type": "archive",
|
"type": "archive",
|
||||||
"archive-type": "tar-gzip",
|
"archive-type": "tar-gzip",
|
||||||
"url": "https://static.crates.io/crates/reset_daemon/reset_daemon-0.1.7.crate",
|
"url": "https://static.crates.io/crates/reset_daemon/reset_daemon-0.1.9.crate",
|
||||||
"sha256": "f7b48ba0698bdb4ead119140a557346907b40ae17cac324687a032b4d6ea9851",
|
"sha256": "ff35f2cbd703c80a77a53458e7a3c32ccba9c73b7b8ce65924cdbe291d960f58",
|
||||||
"dest": "cargo/vendor/reset_daemon-0.1.7"
|
"dest": "cargo/vendor/reset_daemon-0.1.9"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "inline",
|
"type": "inline",
|
||||||
"contents": "{\"package\": \"f7b48ba0698bdb4ead119140a557346907b40ae17cac324687a032b4d6ea9851\", \"files\": {}}",
|
"contents": "{\"package\": \"ff35f2cbd703c80a77a53458e7a3c32ccba9c73b7b8ce65924cdbe291d960f58\", \"files\": {}}",
|
||||||
"dest": "cargo/vendor/reset_daemon-0.1.7",
|
"dest": "cargo/vendor/reset_daemon-0.1.9",
|
||||||
"dest-filename": ".cargo-checksum.json"
|
"dest-filename": ".cargo-checksum.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
74
src/components/base/cardEntry.rs
Normal file
74
src/components/base/cardEntry.rs
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
|
use adw::glib;
|
||||||
|
use adw::glib::Object;
|
||||||
|
use dbus::blocking::Connection;
|
||||||
|
use dbus::Error;
|
||||||
|
use glib::subclass::types::ObjectSubclassIsExt;
|
||||||
|
use glib::{clone, Cast};
|
||||||
|
use gtk::{gio, StringObject};
|
||||||
|
use ReSet_Lib::audio::audio::Card;
|
||||||
|
|
||||||
|
use super::cardEntryImpl;
|
||||||
|
|
||||||
|
glib::wrapper! {
|
||||||
|
pub struct CardEntry(ObjectSubclass<cardEntryImpl::CardEntry>)
|
||||||
|
@extends gtk::Box, gtk::Widget,
|
||||||
|
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl CardEntry {
|
||||||
|
pub fn new(card: Card) -> Self {
|
||||||
|
let entry: Self = Object::builder().build();
|
||||||
|
{
|
||||||
|
let imp = entry.imp();
|
||||||
|
let mut map = imp.resetCardMap.borrow_mut();
|
||||||
|
imp.resetCardName.set_text(&card.name);
|
||||||
|
let mut i: u32 = 0;
|
||||||
|
let mut index: u32 = 0;
|
||||||
|
for profile in card.profiles.iter() {
|
||||||
|
if profile.name == card.active_profile {
|
||||||
|
index = i;
|
||||||
|
}
|
||||||
|
imp.resetCardList.append(&profile.description);
|
||||||
|
map.insert(
|
||||||
|
profile.description.clone(),
|
||||||
|
(card.index, profile.name.clone()),
|
||||||
|
);
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
|
imp.resetCardDropdown.set_selected(index);
|
||||||
|
imp.resetCardDropdown
|
||||||
|
.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::<StringObject>().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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_card_profile_of_device(device_index: u32, profile_name: String) -> bool {
|
||||||
|
gio::spawn_blocking(move || {
|
||||||
|
let conn = Connection::new_session().unwrap();
|
||||||
|
let proxy = conn.with_proxy(
|
||||||
|
"org.xetibo.ReSet",
|
||||||
|
"/org/xetibo/ReSet",
|
||||||
|
Duration::from_millis(1000),
|
||||||
|
);
|
||||||
|
let _: Result<(), Error> = proxy.method_call(
|
||||||
|
"org.xetibo.ReSet",
|
||||||
|
"SetCardProfileOfDevice",
|
||||||
|
(device_index, profile_name),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
true
|
||||||
|
}
|
51
src/components/base/cardEntryImpl.rs
Normal file
51
src/components/base/cardEntryImpl.rs
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
use std::cell::RefCell;
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use gtk::subclass::prelude::*;
|
||||||
|
use gtk::{glib, CompositeTemplate, DropDown, Label, StringList, TemplateChild};
|
||||||
|
|
||||||
|
use super::cardEntry;
|
||||||
|
|
||||||
|
#[allow(non_snake_case)]
|
||||||
|
#[derive(Default, CompositeTemplate)]
|
||||||
|
#[template(resource = "/org/Xetibo/ReSet/resetCardEntry.ui")]
|
||||||
|
pub struct CardEntry {
|
||||||
|
#[template_child]
|
||||||
|
pub resetCardName: TemplateChild<Label>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetCardDropdown: TemplateChild<DropDown>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetCardList: TemplateChild<StringList>,
|
||||||
|
// first string is the alias name, the first return string is the index of the adapter and the
|
||||||
|
// second the name of the profile
|
||||||
|
pub resetCardMap: RefCell<HashMap<String, (u32, String)>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[glib::object_subclass]
|
||||||
|
impl ObjectSubclass for CardEntry {
|
||||||
|
const NAME: &'static str = "resetCardEntry";
|
||||||
|
type Type = cardEntry::CardEntry;
|
||||||
|
type ParentType = gtk::Box;
|
||||||
|
|
||||||
|
fn class_init(klass: &mut Self::Class) {
|
||||||
|
klass.bind_template();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn instance_init(obj: &glib::subclass::InitializingObject<Self>) {
|
||||||
|
obj.init_template();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl BoxImpl for CardEntry {}
|
||||||
|
|
||||||
|
impl ObjectImpl for CardEntry {
|
||||||
|
fn constructed(&self) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ListBoxRowImpl for CardEntry {}
|
||||||
|
|
||||||
|
impl WidgetImpl for CardEntry {}
|
||||||
|
|
||||||
|
impl WindowImpl for CardEntry {}
|
||||||
|
|
||||||
|
impl ApplicationWindowImpl for CardEntry {}
|
|
@ -1,7 +1,9 @@
|
||||||
pub mod settingBox;
|
pub mod cardEntry;
|
||||||
pub mod settingBoxImpl;
|
pub mod cardEntryImpl;
|
||||||
pub mod listEntry;
|
pub mod listEntry;
|
||||||
pub mod listEntryImpl;
|
pub mod listEntryImpl;
|
||||||
pub mod popup;
|
pub mod popup;
|
||||||
pub mod popupImpl;
|
pub mod popupImpl;
|
||||||
|
pub mod settingBox;
|
||||||
|
pub mod settingBoxImpl;
|
||||||
pub mod utils;
|
pub mod utils;
|
||||||
|
|
|
@ -16,4 +16,5 @@ impl SettingBox {
|
||||||
entry.append(child);
|
entry.append(child);
|
||||||
entry
|
entry
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
use std::{
|
use std::{
|
||||||
sync::{atomic::{AtomicBool, Ordering}, Arc},
|
sync::{
|
||||||
|
atomic::{AtomicBool, Ordering},
|
||||||
|
Arc,
|
||||||
|
},
|
||||||
thread,
|
thread,
|
||||||
time::Duration,
|
time::Duration,
|
||||||
};
|
};
|
||||||
|
@ -15,7 +18,10 @@ use ReSet_Lib::{
|
||||||
signals::GetVal,
|
signals::GetVal,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::components::{input::sourceBox::{SourceBox, start_input_box_listener}, output::sinkBox::{SinkBox, start_output_box_listener}};
|
use crate::components::{
|
||||||
|
input::sourceBox::{start_input_box_listener, SourceBox},
|
||||||
|
output::sinkBox::{start_output_box_listener, SinkBox},
|
||||||
|
};
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
pub struct Listeners {
|
pub struct Listeners {
|
||||||
|
@ -41,6 +47,14 @@ impl Listeners {
|
||||||
proxy.method_call("org.xetibo.ReSet", "StopNetworkListener", ());
|
proxy.method_call("org.xetibo.ReSet", "StopNetworkListener", ());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn stop_audio_listener(&self) {
|
||||||
|
self.pulse_listener.store(false, Ordering::SeqCst);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn stop_bluetooth_listener(&self) {
|
||||||
|
self.bluetooth_listener.store(false, Ordering::SeqCst);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -367,20 +381,29 @@ impl GetVal<(u32,)> for OutputStreamRemoved {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn start_event_listener(listeners: Arc<Listeners>, sink_box: Option<Arc<SinkBox>>,source_box: Option<Arc<SourceBox>>) {
|
pub fn start_audio_listener(
|
||||||
|
listeners: Arc<Listeners>,
|
||||||
|
sink_box: Option<Arc<SinkBox>>,
|
||||||
|
source_box: Option<Arc<SourceBox>>,
|
||||||
|
) {
|
||||||
gio::spawn_blocking(move || {
|
gio::spawn_blocking(move || {
|
||||||
let mut conn = Connection::new_session().unwrap();
|
let mut conn = Connection::new_session().unwrap();
|
||||||
|
if listeners.pulse_listener.load(Ordering::SeqCst) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if sink_box.is_some() {
|
if sink_box.is_some() {
|
||||||
conn = start_output_box_listener(conn, listeners.clone(), sink_box.unwrap());
|
conn = start_output_box_listener(conn, sink_box.unwrap());
|
||||||
}
|
}
|
||||||
if source_box.is_some() {
|
if source_box.is_some() {
|
||||||
conn = start_input_box_listener(conn, listeners.clone(), source_box.unwrap());
|
conn = start_input_box_listener(conn, source_box.unwrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
listeners.pulse_listener.store(true, Ordering::SeqCst);
|
||||||
|
println!("starting audio listener");
|
||||||
loop {
|
loop {
|
||||||
let _ = conn.process(Duration::from_millis(1000));
|
let _ = conn.process(Duration::from_millis(1000));
|
||||||
if !listeners.network_listener.load(Ordering::SeqCst) {
|
if !listeners.pulse_listener.load(Ordering::SeqCst) {
|
||||||
println!("stopping audio listener");
|
println!("stopping audio listener");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,24 @@
|
||||||
|
use std::sync::atomic::Ordering;
|
||||||
|
use std::sync::Arc;
|
||||||
|
use std::thread;
|
||||||
|
use std::time::{Duration, SystemTime};
|
||||||
|
|
||||||
use adw::glib;
|
use adw::glib;
|
||||||
use adw::glib::Object;
|
use adw::glib::Object;
|
||||||
use adw::subclass::prelude::ObjectSubclassIsExt;
|
use adw::subclass::prelude::ObjectSubclassIsExt;
|
||||||
|
use dbus::blocking::Connection;
|
||||||
|
use dbus::message::SignalArgs;
|
||||||
|
use dbus::{Error, Path};
|
||||||
|
use gtk::gio;
|
||||||
use gtk::glib::Variant;
|
use gtk::glib::Variant;
|
||||||
use gtk::prelude::ActionableExt;
|
use gtk::prelude::ActionableExt;
|
||||||
|
use ReSet_Lib::signals::{BluetoothDeviceAdded, BluetoothDeviceRemoved};
|
||||||
|
|
||||||
|
use crate::components::base::listEntry::ListEntry;
|
||||||
|
use crate::components::base::utils::Listeners;
|
||||||
use crate::components::bluetooth::bluetoothBoxImpl;
|
use crate::components::bluetooth::bluetoothBoxImpl;
|
||||||
use crate::components::bluetooth::bluetoothEntry::BluetoothEntry;
|
use crate::components::bluetooth::bluetoothEntry::BluetoothEntry;
|
||||||
use crate::components::bluetooth::bluetoothEntryImpl::DeviceTypes;
|
// use crate::components::bluetooth::bluetoothEntryImpl::DeviceTypes;
|
||||||
use crate::components::base::listEntry::ListEntry;
|
|
||||||
|
|
||||||
glib::wrapper! {
|
glib::wrapper! {
|
||||||
pub struct BluetoothBox(ObjectSubclass<bluetoothBoxImpl::BluetoothBox>)
|
pub struct BluetoothBox(ObjectSubclass<bluetoothBoxImpl::BluetoothBox>)
|
||||||
|
@ -15,6 +26,9 @@ glib::wrapper! {
|
||||||
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
|
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsafe impl Send for BluetoothBox {}
|
||||||
|
unsafe impl Sync for BluetoothBox {}
|
||||||
|
|
||||||
impl BluetoothBox {
|
impl BluetoothBox {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
Object::builder().build()
|
Object::builder().build()
|
||||||
|
@ -22,33 +36,152 @@ impl BluetoothBox {
|
||||||
|
|
||||||
pub fn setupCallbacks(&self) {
|
pub fn setupCallbacks(&self) {
|
||||||
let selfImp = self.imp();
|
let selfImp = self.imp();
|
||||||
selfImp.resetVisibility.set_action_name(Some("navigation.push"));
|
selfImp
|
||||||
selfImp.resetVisibility.set_action_target_value(Some(&Variant::from("visibility")));
|
.resetVisibility
|
||||||
|
.set_action_name(Some("navigation.push"));
|
||||||
|
selfImp
|
||||||
|
.resetVisibility
|
||||||
|
.set_action_target_value(Some(&Variant::from("visibility")));
|
||||||
|
|
||||||
selfImp.resetBluetoothMainTab.set_action_name(Some("navigation.pop"));
|
selfImp
|
||||||
|
.resetBluetoothMainTab
|
||||||
|
.set_action_name(Some("navigation.pop"));
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn scanForDevices(&self) {
|
pub fn scanForDevices(&self) {
|
||||||
let selfImp = self.imp();
|
// let selfImp = self.imp();
|
||||||
let mut wifiEntries = selfImp.availableDevices.borrow_mut();
|
// let mut wifiEntries = selfImp.availableDevices.borrow_mut();
|
||||||
wifiEntries.push(ListEntry::new(&BluetoothEntry::new(DeviceTypes::Mouse, "ina mouse")));
|
// wifiEntries.push(ListEntry::new(&BluetoothEntry::new(
|
||||||
wifiEntries.push(ListEntry::new(&BluetoothEntry::new(DeviceTypes::Keyboard, "inaboard")));
|
// DeviceTypes::Mouse,
|
||||||
wifiEntries.push(ListEntry::new(&BluetoothEntry::new(DeviceTypes::Controller, "ina controller")));
|
// "ina mouse",
|
||||||
wifiEntries.push(ListEntry::new(&BluetoothEntry::new(DeviceTypes::Controller, "ina best waifu")));
|
// )));
|
||||||
|
// wifiEntries.push(ListEntry::new(&BluetoothEntry::new(
|
||||||
for wifiEntry in wifiEntries.iter() {
|
// DeviceTypes::Keyboard,
|
||||||
selfImp.resetBluetoothAvailableDevices.append(wifiEntry);
|
// "inaboard",
|
||||||
}
|
// )));
|
||||||
|
// wifiEntries.push(ListEntry::new(&BluetoothEntry::new(
|
||||||
|
// DeviceTypes::Controller,
|
||||||
|
// "ina controller",
|
||||||
|
// )));
|
||||||
|
// wifiEntries.push(
|
||||||
|
// ListEntry::new(&BluetoothEntry::new(
|
||||||
|
// DeviceTypes::Controller,
|
||||||
|
// "ina best waifu",
|
||||||
|
// ))
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
// for wifiEntry in wifiEntries.iter() {
|
||||||
|
// selfImp.resetBluetoothAvailableDevices.append(wifiEntry);
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn addConnectedDevices(&self) {
|
pub fn addConnectedDevices(&self) {
|
||||||
let selfImp = self.imp();
|
// let selfImp = self.imp();
|
||||||
let mut wifiEntries = selfImp.connectedDevices.borrow_mut();
|
// let mut wifiEntries = selfImp.connectedDevices.borrow_mut();
|
||||||
wifiEntries.push(ListEntry::new(&BluetoothEntry::new(DeviceTypes::Mouse, "why are we still here?")));
|
// wifiEntries.push(ListEntry::new(&BluetoothEntry::new(
|
||||||
wifiEntries.push(ListEntry::new(&BluetoothEntry::new(DeviceTypes::Keyboard, "just to suffer?")));
|
// DeviceTypes::Mouse,
|
||||||
|
// "why are we still here?",
|
||||||
for wifiEntry in wifiEntries.iter() {
|
// )));
|
||||||
selfImp.resetBluetoothConnectedDevices.append(wifiEntry);
|
// wifiEntries.push(ListEntry::new(&BluetoothEntry::new(
|
||||||
}
|
// DeviceTypes::Keyboard,
|
||||||
|
// "just to suffer?",
|
||||||
|
// )));
|
||||||
|
//
|
||||||
|
// for wifiEntry in wifiEntries.iter() {
|
||||||
|
// selfImp.resetBluetoothConnectedDevices.append(wifiEntry);
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn start_bluetooth_listener(listeners: Arc<Listeners>, bluetooth_box: Arc<BluetoothBox>) {
|
||||||
|
gio::spawn_blocking(move || {
|
||||||
|
if listeners.bluetooth_listener.load(Ordering::SeqCst) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let conn = Connection::new_session().unwrap();
|
||||||
|
let proxy = conn.with_proxy(
|
||||||
|
"org.xetibo.ReSet",
|
||||||
|
"/org/xetibo/ReSet",
|
||||||
|
Duration::from_millis(1000),
|
||||||
|
);
|
||||||
|
let _: Result<(), Error> =
|
||||||
|
proxy.method_call("org.xetibo.ReSet", "StartBluetoothSearch", (10000,));
|
||||||
|
let device_added = BluetoothDeviceAdded::match_rule(
|
||||||
|
Some(&"org.xetibo.ReSet".into()),
|
||||||
|
Some(&Path::from("/org/xetibo/ReSet")),
|
||||||
|
)
|
||||||
|
.static_clone();
|
||||||
|
let device_removed = BluetoothDeviceRemoved::match_rule(
|
||||||
|
Some(&"org.xetibo.ReSet".into()),
|
||||||
|
Some(&Path::from("/org/xetibo/ReSet")),
|
||||||
|
)
|
||||||
|
.static_clone();
|
||||||
|
let device_added_box = bluetooth_box.clone();
|
||||||
|
let device_removed_box = bluetooth_box.clone();
|
||||||
|
let loop_box = bluetooth_box.clone();
|
||||||
|
|
||||||
|
let res = conn.add_match(device_added, move |ir: BluetoothDeviceAdded, _, _| {
|
||||||
|
let bluetooth_box = device_added_box.clone();
|
||||||
|
println!("added");
|
||||||
|
glib::spawn_future(async move {
|
||||||
|
glib::idle_add_once(move || {
|
||||||
|
let imp = bluetooth_box.imp();
|
||||||
|
let path = ir.bluetooth_device.path.clone();
|
||||||
|
let bluetooth_entry = Arc::new(BluetoothEntry::new(ir.bluetooth_device));
|
||||||
|
let entry = Arc::new(ListEntry::new(&*bluetooth_entry));
|
||||||
|
imp.availableDevices
|
||||||
|
.borrow_mut()
|
||||||
|
.insert(path, (bluetooth_entry.clone(), entry.clone()));
|
||||||
|
imp.resetBluetoothAvailableDevices.append(&*entry);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
true
|
||||||
|
});
|
||||||
|
if res.is_err() {
|
||||||
|
println!("fail on bluetooth device add");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let res = conn.add_match(device_removed, move |ir: BluetoothDeviceRemoved, _, _| {
|
||||||
|
let bluetooth_box = device_removed_box.clone();
|
||||||
|
println!("removed");
|
||||||
|
glib::spawn_future(async move {
|
||||||
|
glib::idle_add_once(move || {
|
||||||
|
let imp = bluetooth_box.imp();
|
||||||
|
let map = imp.availableDevices.borrow_mut();
|
||||||
|
let list_entry = map.get(&ir.bluetooth_device);
|
||||||
|
if list_entry.is_some() {
|
||||||
|
imp.resetBluetoothAvailableDevices
|
||||||
|
.remove(&*list_entry.unwrap().0);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
true
|
||||||
|
});
|
||||||
|
if res.is_err() {
|
||||||
|
println!("fail on bluetooth device remove");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
listeners.bluetooth_listener.store(true, Ordering::SeqCst);
|
||||||
|
let time = SystemTime::now();
|
||||||
|
|
||||||
|
loop {
|
||||||
|
let _ = conn.process(Duration::from_millis(1000));
|
||||||
|
if !listeners.bluetooth_listener.load(Ordering::SeqCst)
|
||||||
|
// || time.elapsed().unwrap() > Duration::from_millis(5000)
|
||||||
|
{
|
||||||
|
glib::spawn_future(async move {
|
||||||
|
glib::idle_add_once(move || {
|
||||||
|
let imp = loop_box.imp();
|
||||||
|
imp.resetBluetoothConnectedDevices.remove_all();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
println!("stopping bluetooth listener");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
thread::sleep(Duration::from_millis(100));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
|
@ -1,11 +1,14 @@
|
||||||
use std::cell::RefCell;
|
use dbus::Path;
|
||||||
use gtk::{CompositeTemplate, glib, ListBox, Switch};
|
|
||||||
use gtk::prelude::*;
|
use gtk::prelude::*;
|
||||||
use gtk::subclass::prelude::*;
|
use gtk::subclass::prelude::*;
|
||||||
|
use gtk::{glib, CompositeTemplate, ListBox, Switch};
|
||||||
|
use std::cell::RefCell;
|
||||||
|
use std::collections::HashMap;
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
use crate::components::base::listEntry::ListEntry;
|
||||||
use crate::components::bluetooth::bluetoothBox;
|
use crate::components::bluetooth::bluetoothBox;
|
||||||
use crate::components::bluetooth::bluetoothEntry::BluetoothEntry;
|
use crate::components::bluetooth::bluetoothEntry::BluetoothEntry;
|
||||||
use crate::components::base::listEntry::ListEntry;
|
|
||||||
|
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
#[derive(Default, CompositeTemplate)]
|
#[derive(Default, CompositeTemplate)]
|
||||||
|
@ -21,8 +24,8 @@ pub struct BluetoothBox {
|
||||||
pub resetVisibility: TemplateChild<ListEntry>,
|
pub resetVisibility: TemplateChild<ListEntry>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetBluetoothMainTab: TemplateChild<ListEntry>,
|
pub resetBluetoothMainTab: TemplateChild<ListEntry>,
|
||||||
pub availableDevices: RefCell<Vec<ListEntry>>,
|
pub availableDevices: RefCell<HashMap<Path<'static>, (Arc<BluetoothEntry>, Arc<ListEntry>)>>,
|
||||||
pub connectedDevices: RefCell<Vec<ListEntry>>,
|
pub connectedDevices: RefCell<HashMap<Path<'static>, (Arc<BluetoothEntry>, Arc<ListEntry>)>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[glib::object_subclass]
|
#[glib::object_subclass]
|
||||||
|
|
|
@ -1,8 +1,16 @@
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
|
use crate::components::bluetooth::bluetoothEntryImpl;
|
||||||
|
// use crate::components::bluetooth::bluetoothEntryImpl::DeviceTypes;
|
||||||
use adw::glib;
|
use adw::glib;
|
||||||
use adw::glib::Object;
|
use adw::glib::Object;
|
||||||
use adw::subclass::prelude::ObjectSubclassIsExt;
|
use adw::subclass::prelude::ObjectSubclassIsExt;
|
||||||
use crate::components::bluetooth::bluetoothEntryImpl;
|
use dbus::blocking::Connection;
|
||||||
use crate::components::bluetooth::bluetoothEntryImpl::DeviceTypes;
|
use dbus::{Error, Path};
|
||||||
|
use glib::clone;
|
||||||
|
use gtk::prelude::WidgetExt;
|
||||||
|
use gtk::{gio, GestureClick};
|
||||||
|
use ReSet_Lib::bluetooth::bluetooth::BluetoothDevice;
|
||||||
|
|
||||||
glib::wrapper! {
|
glib::wrapper! {
|
||||||
pub struct BluetoothEntry(ObjectSubclass<bluetoothEntryImpl::BluetoothEntry>)
|
pub struct BluetoothEntry(ObjectSubclass<bluetoothEntryImpl::BluetoothEntry>)
|
||||||
|
@ -11,21 +19,78 @@ glib::wrapper! {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl BluetoothEntry {
|
impl BluetoothEntry {
|
||||||
pub fn new(deviceType: DeviceTypes, name: &str) -> Self {
|
pub fn new(device: BluetoothDevice) -> Self {
|
||||||
let entry: BluetoothEntry = Object::builder().build();
|
let entry: BluetoothEntry = Object::builder().build();
|
||||||
let entryImp = entry.imp();
|
let entryImp = entry.imp();
|
||||||
entryImp.resetBluetoothLabel.get().set_text(name);
|
entryImp.resetBluetoothLabel.get().set_text(&device.name);
|
||||||
entryImp.resetBluetoothDeviceType.get().set_from_icon_name(match deviceType {
|
entryImp
|
||||||
DeviceTypes::Mouse => Some("input-mouse-symbolic"),
|
.resetBluetoothAddress
|
||||||
DeviceTypes::Keyboard => Some("input-keyboard-symbolic"),
|
.get()
|
||||||
DeviceTypes::Headset => Some("output-headset-symbolic"),
|
.set_text(&device.address);
|
||||||
DeviceTypes::Controller => Some("input-gaming-symbolic"),
|
// entryImp
|
||||||
DeviceTypes::None => Some("text-x-generic-symbolic") // no generic bluetooth device icon found
|
// .resetBluetoothDeviceType
|
||||||
});
|
// .get()
|
||||||
{
|
// .set_from_icon_name(match deviceType {
|
||||||
let mut wifiName = entryImp.deviceName.borrow_mut();
|
// DeviceTypes::Mouse => Some("input-mouse-symbolic"),
|
||||||
*wifiName = String::from(name);
|
// 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
|
||||||
|
// });
|
||||||
|
let gesture = GestureClick::new();
|
||||||
|
let connected = false;
|
||||||
|
// TODO implement this connected
|
||||||
|
entryImp.device.replace(device);
|
||||||
|
gesture.connect_released(clone!(@weak entryImp => move |_, _, _, _| {
|
||||||
|
let device = entryImp.device.borrow_mut();
|
||||||
|
if connected {
|
||||||
|
disconnect_from_device(device.path.clone());
|
||||||
|
} else if device.paired {
|
||||||
|
connect_to_device(device.path.clone());
|
||||||
|
} else {
|
||||||
|
pair_with_device(device.path.clone());
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
entry.add_controller(gesture);
|
||||||
entry
|
entry
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn connect_to_device(path: Path<'static>) {
|
||||||
|
gio::spawn_blocking(move || {
|
||||||
|
let conn = Connection::new_session().unwrap();
|
||||||
|
let proxy = conn.with_proxy(
|
||||||
|
"org.xetibo.ReSet",
|
||||||
|
"/org/xetibo/ReSet",
|
||||||
|
Duration::from_millis(1000),
|
||||||
|
);
|
||||||
|
let _: Result<(bool,), Error> =
|
||||||
|
proxy.method_call("org.xetibo.ReSet", "ConnectToBluetoothDevice", (path,));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
fn pair_with_device(path: Path<'static>) {
|
||||||
|
gio::spawn_blocking(move || {
|
||||||
|
let conn = Connection::new_session().unwrap();
|
||||||
|
let proxy = conn.with_proxy(
|
||||||
|
"org.xetibo.ReSet",
|
||||||
|
"/org/xetibo/ReSet",
|
||||||
|
Duration::from_millis(1000),
|
||||||
|
);
|
||||||
|
let _: Result<(bool,), Error> =
|
||||||
|
proxy.method_call("org.xetibo.ReSet", "PairWithBluetoothDevice", (path,));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
fn disconnect_from_device(path: Path<'static>) {
|
||||||
|
gio::spawn_blocking(move || {
|
||||||
|
let conn = Connection::new_session().unwrap();
|
||||||
|
let proxy = conn.with_proxy(
|
||||||
|
"org.xetibo.ReSet",
|
||||||
|
"/org/xetibo/ReSet",
|
||||||
|
Duration::from_millis(1000),
|
||||||
|
);
|
||||||
|
let _: Result<(bool,), Error> =
|
||||||
|
proxy.method_call("org.xetibo.ReSet", "DisconnectFromBluetoothDevice", (path,));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
use std::cell::RefCell;
|
|
||||||
use gtk::{Button, CompositeTemplate, glib, Image, Label};
|
|
||||||
use gtk::subclass::prelude::*;
|
|
||||||
use crate::components::bluetooth::bluetoothEntry;
|
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)]
|
#[derive(Default, Copy, Clone)]
|
||||||
pub enum DeviceTypes {
|
pub enum DeviceTypes {
|
||||||
|
@ -21,8 +22,11 @@ pub struct BluetoothEntry {
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetBluetoothLabel: TemplateChild<Label>,
|
pub resetBluetoothLabel: TemplateChild<Label>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
|
pub resetBluetoothAddress: TemplateChild<Label>,
|
||||||
|
#[template_child]
|
||||||
pub resetBluetoothButton: TemplateChild<Button>,
|
pub resetBluetoothButton: TemplateChild<Button>,
|
||||||
pub deviceName: RefCell<String>,
|
pub deviceName: RefCell<String>,
|
||||||
|
pub device: RefCell<BluetoothDevice>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[glib::object_subclass]
|
#[glib::object_subclass]
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#![allow(non_snake_case)]
|
#![allow(non_snake_case)]
|
||||||
pub mod bluetoothBox;
|
pub mod bluetoothBox;
|
||||||
pub mod bluetoothEntry;
|
|
||||||
pub mod bluetoothBoxImpl;
|
pub mod bluetoothBoxImpl;
|
||||||
pub mod bluetoothEntryImpl;
|
pub mod bluetoothEntry;
|
||||||
|
pub mod bluetoothEntryImpl;
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#![allow(non_snake_case)]
|
#![allow(non_snake_case)]
|
||||||
pub mod sourceBox;
|
|
||||||
pub mod sourceBoxImpl;
|
|
||||||
pub mod outputStreamEntry;
|
pub mod outputStreamEntry;
|
||||||
pub mod outputStreamEntryImpl;
|
pub mod outputStreamEntryImpl;
|
||||||
|
pub mod sourceBox;
|
||||||
|
pub mod sourceBoxImpl;
|
||||||
pub mod sourceEntry;
|
pub mod sourceEntry;
|
||||||
pub mod sourceEntryImpl;
|
pub mod sourceEntryImpl;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::time::Duration;
|
use std::time::{Duration, SystemTime};
|
||||||
|
|
||||||
use adw::glib;
|
use adw::glib;
|
||||||
use adw::glib::Object;
|
use adw::glib::Object;
|
||||||
|
@ -20,6 +20,9 @@ glib::wrapper! {
|
||||||
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
|
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsafe impl Send for OutputStreamEntry {}
|
||||||
|
unsafe impl Sync for OutputStreamEntry {}
|
||||||
|
|
||||||
impl OutputStreamEntry {
|
impl OutputStreamEntry {
|
||||||
pub fn new(source_box: Arc<SourceBox>, stream: OutputStream) -> Self {
|
pub fn new(source_box: Arc<SourceBox>, stream: OutputStream) -> Self {
|
||||||
let obj: Self = Object::builder().build();
|
let obj: Self = Object::builder().build();
|
||||||
|
@ -47,6 +50,15 @@ impl OutputStreamEntry {
|
||||||
let stream = stream.unwrap();
|
let stream = stream.unwrap();
|
||||||
let index = stream.index;
|
let index = stream.index;
|
||||||
let channels = stream.channels;
|
let channels = stream.channels;
|
||||||
|
{
|
||||||
|
let mut time = imp.volumeTimeStamp.borrow_mut();
|
||||||
|
if time.is_some()
|
||||||
|
&& time.unwrap().elapsed().unwrap() < Duration::from_millis(50)
|
||||||
|
{
|
||||||
|
return Propagation::Proceed;
|
||||||
|
}
|
||||||
|
*time = Some(SystemTime::now());
|
||||||
|
}
|
||||||
set_outputstream_volume(value, index, channels);
|
set_outputstream_volume(value, index, channels);
|
||||||
Propagation::Proceed
|
Propagation::Proceed
|
||||||
}),
|
}),
|
||||||
|
@ -124,39 +136,39 @@ impl OutputStreamEntry {
|
||||||
|
|
||||||
fn set_outputstream_volume(value: f64, index: u32, channels: u16) -> bool {
|
fn set_outputstream_volume(value: f64, index: u32, channels: u16) -> bool {
|
||||||
gio::spawn_blocking(move || {
|
gio::spawn_blocking(move || {
|
||||||
let conn = Connection::new_session().unwrap();
|
let conn = Connection::new_session().unwrap();
|
||||||
let proxy = conn.with_proxy(
|
let proxy = conn.with_proxy(
|
||||||
"org.xetibo.ReSet",
|
"org.xetibo.ReSet",
|
||||||
"/org/xetibo/ReSet",
|
"/org/xetibo/ReSet",
|
||||||
Duration::from_millis(1000),
|
Duration::from_millis(1000),
|
||||||
);
|
);
|
||||||
let _: Result<(), Error> = proxy.method_call(
|
let _: Result<(), Error> = proxy.method_call(
|
||||||
"org.xetibo.ReSet",
|
"org.xetibo.ReSet",
|
||||||
"SetOutputStreamVolume",
|
"SetOutputStreamVolume",
|
||||||
(index, channels, value as u32),
|
(index, channels, value as u32),
|
||||||
);
|
);
|
||||||
// if res.is_err() {
|
// if res.is_err() {
|
||||||
// return false;
|
// return false;
|
||||||
// }
|
// }
|
||||||
// res.unwrap().0
|
// res.unwrap().0
|
||||||
});
|
});
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
fn toggle_output_stream_mute(index: u32, muted: bool) -> bool {
|
fn toggle_output_stream_mute(index: u32, muted: bool) -> bool {
|
||||||
gio::spawn_blocking(move || {
|
gio::spawn_blocking(move || {
|
||||||
let conn = Connection::new_session().unwrap();
|
let conn = Connection::new_session().unwrap();
|
||||||
let proxy = conn.with_proxy(
|
let proxy = conn.with_proxy(
|
||||||
"org.xetibo.ReSet",
|
"org.xetibo.ReSet",
|
||||||
"/org/xetibo/ReSet",
|
"/org/xetibo/ReSet",
|
||||||
Duration::from_millis(1000),
|
Duration::from_millis(1000),
|
||||||
);
|
);
|
||||||
let _: Result<(), Error> =
|
let _: Result<(), Error> =
|
||||||
proxy.method_call("org.xetibo.ReSet", "SetOutputStreamMute", (index, muted));
|
proxy.method_call("org.xetibo.ReSet", "SetOutputStreamMute", (index, muted));
|
||||||
// if res.is_err() {
|
// if res.is_err() {
|
||||||
// return false;
|
// return false;
|
||||||
// }
|
// }
|
||||||
// res.unwrap().0
|
// res.unwrap().0
|
||||||
});
|
});
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use std::time::SystemTime;
|
||||||
|
|
||||||
use crate::components::input::outputStreamEntry;
|
use crate::components::input::outputStreamEntry;
|
||||||
use gtk::subclass::prelude::*;
|
use gtk::subclass::prelude::*;
|
||||||
|
@ -24,6 +25,7 @@ pub struct OutputStreamEntry {
|
||||||
pub resetVolumeMeter: TemplateChild<ProgressBar>,
|
pub resetVolumeMeter: TemplateChild<ProgressBar>,
|
||||||
pub stream: Arc<RefCell<OutputStream>>,
|
pub stream: Arc<RefCell<OutputStream>>,
|
||||||
pub associatedSource: Arc<RefCell<(u32, String)>>,
|
pub associatedSource: Arc<RefCell<(u32, String)>>,
|
||||||
|
pub volumeTimeStamp: RefCell<Option<SystemTime>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[glib::object_subclass]
|
#[glib::object_subclass]
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
use std::sync::atomic::Ordering;
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::time::Duration;
|
use std::time::{Duration, SystemTime};
|
||||||
|
|
||||||
|
use crate::components::base::cardEntry::CardEntry;
|
||||||
use crate::components::base::listEntry::ListEntry;
|
use crate::components::base::listEntry::ListEntry;
|
||||||
use crate::components::base::utils::{
|
use crate::components::base::utils::{
|
||||||
Listeners, OutputStreamAdded, OutputStreamChanged, OutputStreamRemoved, SourceAdded,
|
OutputStreamAdded, OutputStreamChanged, OutputStreamRemoved, SourceAdded, SourceChanged,
|
||||||
SourceChanged, SourceRemoved,
|
SourceRemoved,
|
||||||
};
|
};
|
||||||
use crate::components::input::sourceBoxImpl;
|
use crate::components::input::sourceBoxImpl;
|
||||||
use crate::components::input::sourceEntry::set_source_volume;
|
use crate::components::input::sourceEntry::set_source_volume;
|
||||||
|
@ -19,7 +19,7 @@ use glib::subclass::prelude::ObjectSubclassIsExt;
|
||||||
use glib::{clone, Cast, Propagation, Variant};
|
use glib::{clone, Cast, Propagation, Variant};
|
||||||
use gtk::prelude::ActionableExt;
|
use gtk::prelude::ActionableExt;
|
||||||
use gtk::{gio, StringObject};
|
use gtk::{gio, StringObject};
|
||||||
use ReSet_Lib::audio::audio::{OutputStream, Source};
|
use ReSet_Lib::audio::audio::{Card, OutputStream, Source};
|
||||||
|
|
||||||
use super::outputStreamEntry::OutputStreamEntry;
|
use super::outputStreamEntry::OutputStreamEntry;
|
||||||
use super::sourceEntry::{set_default_source, toggle_source_mute, SourceEntry};
|
use super::sourceEntry::{set_default_source, toggle_source_mute, SourceEntry};
|
||||||
|
@ -46,10 +46,18 @@ impl SourceBox {
|
||||||
selfImp
|
selfImp
|
||||||
.resetSourceRow
|
.resetSourceRow
|
||||||
.set_action_target_value(Some(&Variant::from("sources")));
|
.set_action_target_value(Some(&Variant::from("sources")));
|
||||||
|
selfImp
|
||||||
|
.resetCardsRow
|
||||||
|
.set_action_name(Some("navigation.push"));
|
||||||
|
selfImp
|
||||||
|
.resetCardsRow
|
||||||
|
.set_action_target_value(Some(&Variant::from("profileConfiguration")));
|
||||||
selfImp
|
selfImp
|
||||||
.resetOutputStreamButton
|
.resetOutputStreamButton
|
||||||
.set_action_name(Some("navigation.pop"));
|
.set_action_name(Some("navigation.pop"));
|
||||||
|
selfImp
|
||||||
|
.resetInputCardsBackButton
|
||||||
|
.set_action_name(Some("navigation.pop"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,6 +82,7 @@ pub fn populate_sources(input_box: Arc<SourceBox>) {
|
||||||
.replace(get_default_source());
|
.replace(get_default_source());
|
||||||
|
|
||||||
populate_outputstreams(input_box.clone());
|
populate_outputstreams(input_box.clone());
|
||||||
|
populate_cards(input_box.clone());
|
||||||
glib::spawn_future(async move {
|
glib::spawn_future(async move {
|
||||||
glib::idle_add_once(move || {
|
glib::idle_add_once(move || {
|
||||||
// TODO handle events
|
// TODO handle events
|
||||||
|
@ -151,6 +160,15 @@ pub fn populate_sources(input_box: Arc<SourceBox>) {
|
||||||
let source = imp.resetDefaultSource.borrow();
|
let source = imp.resetDefaultSource.borrow();
|
||||||
let index = source.index;
|
let index = source.index;
|
||||||
let channels = source.channels;
|
let channels = source.channels;
|
||||||
|
{
|
||||||
|
let mut time = imp.volumeTimeStamp.borrow_mut();
|
||||||
|
if time.is_some()
|
||||||
|
&& time.unwrap().elapsed().unwrap() < Duration::from_millis(50)
|
||||||
|
{
|
||||||
|
return Propagation::Proceed;
|
||||||
|
}
|
||||||
|
*time = Some(SystemTime::now());
|
||||||
|
}
|
||||||
set_source_volume(value, index, channels);
|
set_source_volume(value, index, channels);
|
||||||
Propagation::Proceed
|
Propagation::Proceed
|
||||||
});
|
});
|
||||||
|
@ -192,9 +210,10 @@ pub fn populate_outputstreams(input_box: Arc<SourceBox>) {
|
||||||
for stream in streams {
|
for stream in streams {
|
||||||
let index = stream.index;
|
let index = stream.index;
|
||||||
let input_stream = Arc::new(OutputStreamEntry::new(input_box.clone(), stream));
|
let input_stream = Arc::new(OutputStreamEntry::new(input_box.clone(), stream));
|
||||||
|
let input_stream_clone = input_stream.clone();
|
||||||
let entry = Arc::new(ListEntry::new(&*input_stream));
|
let entry = Arc::new(ListEntry::new(&*input_stream));
|
||||||
entry.set_activatable(false);
|
entry.set_activatable(false);
|
||||||
list.insert(index, (entry.clone(), input_stream.clone()));
|
list.insert(index, (entry.clone(), input_stream_clone));
|
||||||
input_box_imp.resetOutputStreams.append(&*entry);
|
input_box_imp.resetOutputStreams.append(&*entry);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -202,6 +221,22 @@ pub fn populate_outputstreams(input_box: Arc<SourceBox>) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn populate_cards(input_box: Arc<SourceBox>) {
|
||||||
|
gio::spawn_blocking(move || {
|
||||||
|
let output_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();
|
||||||
|
for card in cards {
|
||||||
|
imp.resetCards
|
||||||
|
.append(&ListEntry::new(&CardEntry::new(card)));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
fn get_output_streams() -> Vec<OutputStream> {
|
fn get_output_streams() -> Vec<OutputStream> {
|
||||||
let conn = Connection::new_session().unwrap();
|
let conn = Connection::new_session().unwrap();
|
||||||
let proxy = conn.with_proxy(
|
let proxy = conn.with_proxy(
|
||||||
|
@ -232,6 +267,20 @@ fn get_sources() -> Vec<Source> {
|
||||||
res.unwrap().0
|
res.unwrap().0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_cards() -> Vec<Card> {
|
||||||
|
let conn = Connection::new_session().unwrap();
|
||||||
|
let proxy = conn.with_proxy(
|
||||||
|
"org.xetibo.ReSet",
|
||||||
|
"/org/xetibo/ReSet",
|
||||||
|
Duration::from_millis(1000),
|
||||||
|
);
|
||||||
|
let res: Result<(Vec<Card>,), Error> = proxy.method_call("org.xetibo.ReSet", "ListCards", ());
|
||||||
|
if res.is_err() {
|
||||||
|
return Vec::new();
|
||||||
|
}
|
||||||
|
res.unwrap().0
|
||||||
|
}
|
||||||
|
|
||||||
fn get_default_source() -> Source {
|
fn get_default_source() -> Source {
|
||||||
let conn = Connection::new_session().unwrap();
|
let conn = Connection::new_session().unwrap();
|
||||||
let proxy = conn.with_proxy(
|
let proxy = conn.with_proxy(
|
||||||
|
@ -247,16 +296,7 @@ fn get_default_source() -> Source {
|
||||||
res.unwrap().0
|
res.unwrap().0
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn start_input_box_listener(
|
pub fn start_input_box_listener(conn: Connection, source_box: Arc<SourceBox>) -> Connection {
|
||||||
conn: Connection,
|
|
||||||
listeners: Arc<Listeners>,
|
|
||||||
source_box: Arc<SourceBox>,
|
|
||||||
) -> Connection {
|
|
||||||
if listeners.network_listener.load(Ordering::SeqCst) {
|
|
||||||
return conn;
|
|
||||||
}
|
|
||||||
listeners.network_listener.store(true, Ordering::SeqCst);
|
|
||||||
|
|
||||||
let source_added = SourceAdded::match_rule(
|
let source_added = SourceAdded::match_rule(
|
||||||
Some(&"org.xetibo.ReSet".into()),
|
Some(&"org.xetibo.ReSet".into()),
|
||||||
Some(&Path::from("/org/xetibo/ReSet")),
|
Some(&Path::from("/org/xetibo/ReSet")),
|
||||||
|
@ -321,6 +361,11 @@ pub fn start_input_box_listener(
|
||||||
output_box_imp.resetSources.append(&*entry);
|
output_box_imp.resetSources.append(&*entry);
|
||||||
let mut map = output_box_imp.resetSourceMap.write().unwrap();
|
let mut map = output_box_imp.resetSourceMap.write().unwrap();
|
||||||
let mut index = output_box_imp.resetModelIndex.write().unwrap();
|
let mut index = output_box_imp.resetModelIndex.write().unwrap();
|
||||||
|
output_box_imp
|
||||||
|
.resetModelList
|
||||||
|
.write()
|
||||||
|
.unwrap()
|
||||||
|
.append(&alias);
|
||||||
map.insert(alias, (source_index, *index, name));
|
map.insert(alias, (source_index, *index, name));
|
||||||
*index += 1;
|
*index += 1;
|
||||||
});
|
});
|
||||||
|
@ -334,6 +379,7 @@ pub fn start_input_box_listener(
|
||||||
|
|
||||||
let res = conn.add_match(source_removed, move |ir: SourceRemoved, _, _| {
|
let res = conn.add_match(source_removed, move |ir: SourceRemoved, _, _| {
|
||||||
let source_box = source_removed_box.clone();
|
let source_box = source_removed_box.clone();
|
||||||
|
println!("removed {}", ir.index);
|
||||||
glib::spawn_future(async move {
|
glib::spawn_future(async move {
|
||||||
glib::idle_add_once(move || {
|
glib::idle_add_once(move || {
|
||||||
let output_box = source_box.clone();
|
let output_box = source_box.clone();
|
||||||
|
@ -350,9 +396,18 @@ pub fn start_input_box_listener(
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let mut map = output_box_imp.resetSourceMap.write().unwrap();
|
let mut map = output_box_imp.resetSourceMap.write().unwrap();
|
||||||
map.remove(&alias.unwrap().2);
|
let entry_index = map.remove(&alias.unwrap().2);
|
||||||
|
if entry_index.is_some() {
|
||||||
|
output_box_imp
|
||||||
|
.resetModelList
|
||||||
|
.write()
|
||||||
|
.unwrap()
|
||||||
|
.remove(entry_index.unwrap().1);
|
||||||
|
}
|
||||||
let mut index = output_box_imp.resetModelIndex.write().unwrap();
|
let mut index = output_box_imp.resetModelIndex.write().unwrap();
|
||||||
*index -= 1;
|
if *index != 0 {
|
||||||
|
*index -= 1;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
true
|
true
|
||||||
|
@ -406,9 +461,10 @@ pub fn start_input_box_listener(
|
||||||
let mut list = output_box_imp.resetOutputStreamList.write().unwrap();
|
let mut list = output_box_imp.resetOutputStreamList.write().unwrap();
|
||||||
let index = ir.stream.index;
|
let index = ir.stream.index;
|
||||||
let output_stream = Arc::new(OutputStreamEntry::new(output_box.clone(), ir.stream));
|
let output_stream = Arc::new(OutputStreamEntry::new(output_box.clone(), ir.stream));
|
||||||
|
let output_stream_clone = output_stream.clone();
|
||||||
let entry = Arc::new(ListEntry::new(&*output_stream));
|
let entry = Arc::new(ListEntry::new(&*output_stream));
|
||||||
entry.set_activatable(false);
|
entry.set_activatable(false);
|
||||||
list.insert(index, (entry.clone(), output_stream.clone()));
|
list.insert(index, (entry.clone(), output_stream_clone));
|
||||||
output_box_imp.resetOutputStreams.append(&*entry);
|
output_box_imp.resetOutputStreams.append(&*entry);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -486,12 +542,12 @@ pub fn start_input_box_listener(
|
||||||
let output_box = source_box.clone();
|
let output_box = source_box.clone();
|
||||||
let output_box_imp = output_box.imp();
|
let output_box_imp = output_box.imp();
|
||||||
let mut list = output_box_imp.resetOutputStreamList.write().unwrap();
|
let mut list = output_box_imp.resetOutputStreamList.write().unwrap();
|
||||||
let entry = list.get(&ir.index);
|
let entry = list.remove(&ir.index);
|
||||||
if entry.is_none() {
|
if entry.is_none() {
|
||||||
|
println!("tried to remove nonexistant?? wat");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
output_box_imp.resetOutputStreams.remove(&*entry.unwrap().0);
|
output_box_imp.resetOutputStreams.remove(&*entry.unwrap().0);
|
||||||
list.remove(&ir.index);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
true
|
true
|
||||||
|
@ -502,6 +558,5 @@ pub fn start_input_box_listener(
|
||||||
return conn;
|
return conn;
|
||||||
}
|
}
|
||||||
|
|
||||||
listeners.network_listener.store(true, Ordering::SeqCst);
|
|
||||||
conn
|
conn
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::sync::{Arc, RwLock};
|
use std::sync::{Arc, RwLock};
|
||||||
|
use std::time::SystemTime;
|
||||||
|
|
||||||
use crate::components::base::listEntry::ListEntry;
|
use crate::components::base::listEntry::ListEntry;
|
||||||
use crate::components::input::sourceBox;
|
use crate::components::input::sourceBox;
|
||||||
|
@ -19,6 +20,8 @@ pub struct SourceBox {
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetSourceRow: TemplateChild<ListEntry>,
|
pub resetSourceRow: TemplateChild<ListEntry>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
|
pub resetCardsRow: TemplateChild<ListEntry>,
|
||||||
|
#[template_child]
|
||||||
pub resetSourceDropdown: TemplateChild<DropDown>,
|
pub resetSourceDropdown: TemplateChild<DropDown>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetSourceMute: TemplateChild<Button>,
|
pub resetSourceMute: TemplateChild<Button>,
|
||||||
|
@ -34,6 +37,10 @@ pub struct SourceBox {
|
||||||
pub resetOutputStreamButton: TemplateChild<ListEntry>,
|
pub resetOutputStreamButton: TemplateChild<ListEntry>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetOutputStreams: TemplateChild<gtk::Box>,
|
pub resetOutputStreams: TemplateChild<gtk::Box>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetInputCardsBackButton: TemplateChild<ListEntry>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetCards: TemplateChild<gtk::Box>,
|
||||||
pub resetDefaultCheckButton: Arc<CheckButton>,
|
pub resetDefaultCheckButton: Arc<CheckButton>,
|
||||||
pub resetDefaultSource: Arc<RefCell<Source>>,
|
pub resetDefaultSource: Arc<RefCell<Source>>,
|
||||||
pub resetSourceList: Arc<RwLock<HashMap<u32, (Arc<ListEntry>, Arc<SourceEntry>, String)>>>,
|
pub resetSourceList: Arc<RwLock<HashMap<u32, (Arc<ListEntry>, Arc<SourceEntry>, String)>>>,
|
||||||
|
@ -43,6 +50,7 @@ pub struct SourceBox {
|
||||||
// first u32 is the index of the source, the second the index in the model list and the third is
|
// first u32 is the index of the source, the second the index in the model list and the third is
|
||||||
// the full name
|
// the full name
|
||||||
pub resetSourceMap: Arc<RwLock<HashMap<String, (u32, u32, String)>>>,
|
pub resetSourceMap: Arc<RwLock<HashMap<String, (u32, u32, String)>>>,
|
||||||
|
pub volumeTimeStamp: RefCell<Option<SystemTime>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[glib::object_subclass]
|
#[glib::object_subclass]
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::time::Duration;
|
use std::time::{Duration, SystemTime};
|
||||||
|
|
||||||
use adw::glib;
|
use adw::glib;
|
||||||
use adw::glib::Object;
|
use adw::glib::Object;
|
||||||
|
@ -19,6 +19,9 @@ glib::wrapper! {
|
||||||
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
|
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsafe impl Send for SourceEntry {}
|
||||||
|
unsafe impl Sync for SourceEntry {}
|
||||||
|
|
||||||
impl SourceEntry {
|
impl SourceEntry {
|
||||||
pub fn new(is_default: bool, check_group: Arc<CheckButton>, stream: Source) -> Self {
|
pub fn new(is_default: bool, check_group: Arc<CheckButton>, stream: Source) -> Self {
|
||||||
let obj: Self = Object::builder().build();
|
let obj: Self = Object::builder().build();
|
||||||
|
@ -41,6 +44,15 @@ impl SourceEntry {
|
||||||
let source = imp.stream.borrow();
|
let source = imp.stream.borrow();
|
||||||
let index = source.index;
|
let index = source.index;
|
||||||
let channels = source.channels;
|
let channels = source.channels;
|
||||||
|
{
|
||||||
|
let mut time = imp.volumeTimeStamp.borrow_mut();
|
||||||
|
if time.is_some()
|
||||||
|
&& time.unwrap().elapsed().unwrap() < Duration::from_millis(50)
|
||||||
|
{
|
||||||
|
return Propagation::Proceed;
|
||||||
|
}
|
||||||
|
*time = Some(SystemTime::now());
|
||||||
|
}
|
||||||
set_source_volume(value, index, channels);
|
set_source_volume(value, index, channels);
|
||||||
Propagation::Proceed
|
Propagation::Proceed
|
||||||
}),
|
}),
|
||||||
|
@ -80,21 +92,21 @@ impl SourceEntry {
|
||||||
|
|
||||||
pub fn set_source_volume(value: f64, index: u32, channels: u16) -> bool {
|
pub fn set_source_volume(value: f64, index: u32, channels: u16) -> bool {
|
||||||
gio::spawn_blocking(move || {
|
gio::spawn_blocking(move || {
|
||||||
let conn = Connection::new_session().unwrap();
|
let conn = Connection::new_session().unwrap();
|
||||||
let proxy = conn.with_proxy(
|
let proxy = conn.with_proxy(
|
||||||
"org.xetibo.ReSet",
|
"org.xetibo.ReSet",
|
||||||
"/org/xetibo/ReSet",
|
"/org/xetibo/ReSet",
|
||||||
Duration::from_millis(1000),
|
Duration::from_millis(1000),
|
||||||
);
|
);
|
||||||
let _: Result<(), Error> = proxy.method_call(
|
let _: Result<(), Error> = proxy.method_call(
|
||||||
"org.xetibo.ReSet",
|
"org.xetibo.ReSet",
|
||||||
"SetSourceVolume",
|
"SetSourceVolume",
|
||||||
(index, channels, value as u32),
|
(index, channels, value as u32),
|
||||||
);
|
);
|
||||||
// if res.is_err() {
|
// if res.is_err() {
|
||||||
// return false;
|
// return false;
|
||||||
// }
|
// }
|
||||||
// res.unwrap().0
|
// res.unwrap().0
|
||||||
});
|
});
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use std::time::SystemTime;
|
||||||
|
|
||||||
use gtk::subclass::prelude::*;
|
use gtk::subclass::prelude::*;
|
||||||
use gtk::{glib, Button, CompositeTemplate, Label, ProgressBar, Scale, CheckButton};
|
use gtk::{glib, Button, CheckButton, CompositeTemplate, Label, ProgressBar, Scale};
|
||||||
use ReSet_Lib::audio::audio::Source;
|
use ReSet_Lib::audio::audio::Source;
|
||||||
|
|
||||||
use super::sourceEntry;
|
use super::sourceEntry;
|
||||||
|
@ -24,6 +25,7 @@ pub struct SourceEntry {
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetVolumeMeter: TemplateChild<ProgressBar>,
|
pub resetVolumeMeter: TemplateChild<ProgressBar>,
|
||||||
pub stream: Arc<RefCell<Source>>,
|
pub stream: Arc<RefCell<Source>>,
|
||||||
|
pub volumeTimeStamp: RefCell<Option<SystemTime>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[glib::object_subclass]
|
#[glib::object_subclass]
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
pub mod window;
|
|
||||||
pub mod wifi;
|
|
||||||
pub mod bluetooth;
|
|
||||||
pub mod output;
|
|
||||||
mod base;
|
mod base;
|
||||||
mod input;
|
pub mod bluetooth;
|
||||||
|
mod input;
|
||||||
|
pub mod output;
|
||||||
|
pub mod wifi;
|
||||||
|
pub mod window;
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::time::Duration;
|
use std::time::{Duration, SystemTime};
|
||||||
|
|
||||||
use adw::glib;
|
use adw::glib;
|
||||||
use adw::glib::Object;
|
use adw::glib::Object;
|
||||||
|
@ -59,6 +59,13 @@ impl InputStreamEntry {
|
||||||
let stream = stream.unwrap();
|
let stream = stream.unwrap();
|
||||||
let index = stream.index;
|
let index = stream.index;
|
||||||
let channels = stream.channels;
|
let channels = stream.channels;
|
||||||
|
{
|
||||||
|
let mut time = imp.volumeTimeStamp.borrow_mut();
|
||||||
|
if time.is_some() && time.unwrap().elapsed().unwrap() < Duration::from_millis(50) {
|
||||||
|
return Propagation::Proceed;
|
||||||
|
}
|
||||||
|
*time = Some(SystemTime::now());
|
||||||
|
}
|
||||||
set_inputstream_volume(value, index, channels);
|
set_inputstream_volume(value, index, channels);
|
||||||
Propagation::Proceed
|
Propagation::Proceed
|
||||||
}),
|
}),
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use std::time::SystemTime;
|
||||||
|
|
||||||
use gtk::subclass::prelude::*;
|
use gtk::subclass::prelude::*;
|
||||||
use gtk::{glib, Button, CompositeTemplate, DropDown, Label, ProgressBar, Scale};
|
use gtk::{glib, Button, CompositeTemplate, DropDown, Label, ProgressBar, Scale};
|
||||||
|
@ -25,6 +26,7 @@ pub struct InputStreamEntry {
|
||||||
pub resetVolumeMeter: TemplateChild<ProgressBar>,
|
pub resetVolumeMeter: TemplateChild<ProgressBar>,
|
||||||
pub stream: Arc<RefCell<InputStream>>,
|
pub stream: Arc<RefCell<InputStream>>,
|
||||||
pub associatedSink: Arc<RefCell<(u32, String)>>,
|
pub associatedSink: Arc<RefCell<(u32, String)>>,
|
||||||
|
pub volumeTimeStamp: RefCell<Option<SystemTime>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[glib::object_subclass]
|
#[glib::object_subclass]
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#![allow(non_snake_case)]
|
#![allow(non_snake_case)]
|
||||||
pub mod sinkBox;
|
|
||||||
pub mod sinkBoxImpl;
|
|
||||||
pub mod inputStreamEntry;
|
pub mod inputStreamEntry;
|
||||||
pub mod inputStreamEntryImpl;
|
pub mod inputStreamEntryImpl;
|
||||||
|
pub mod sinkBox;
|
||||||
|
pub mod sinkBoxImpl;
|
||||||
pub mod sinkEntry;
|
pub mod sinkEntry;
|
||||||
pub mod sinkEntryImpl;
|
pub mod sinkEntryImpl;
|
||||||
|
|
|
@ -1,11 +1,10 @@
|
||||||
use std::sync::atomic::Ordering;
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::time::Duration;
|
use std::time::{Duration, SystemTime};
|
||||||
|
|
||||||
|
use crate::components::base::cardEntry::CardEntry;
|
||||||
use crate::components::base::listEntry::ListEntry;
|
use crate::components::base::listEntry::ListEntry;
|
||||||
use crate::components::base::utils::{
|
use crate::components::base::utils::{
|
||||||
InputStreamAdded, InputStreamChanged, InputStreamRemoved, Listeners, SinkAdded, SinkChanged,
|
InputStreamAdded, InputStreamChanged, InputStreamRemoved, SinkAdded, SinkChanged, SinkRemoved,
|
||||||
SinkRemoved,
|
|
||||||
};
|
};
|
||||||
use crate::components::output::sinkEntry::set_sink_volume;
|
use crate::components::output::sinkEntry::set_sink_volume;
|
||||||
use adw::glib::Object;
|
use adw::glib::Object;
|
||||||
|
@ -18,7 +17,7 @@ use glib::subclass::prelude::ObjectSubclassIsExt;
|
||||||
use glib::{clone, Cast, Propagation, Variant};
|
use glib::{clone, Cast, Propagation, Variant};
|
||||||
use gtk::prelude::ActionableExt;
|
use gtk::prelude::ActionableExt;
|
||||||
use gtk::{gio, StringObject};
|
use gtk::{gio, StringObject};
|
||||||
use ReSet_Lib::audio::audio::{InputStream, Sink};
|
use ReSet_Lib::audio::audio::{Card, InputStream, Sink};
|
||||||
|
|
||||||
use super::inputStreamEntry::InputStreamEntry;
|
use super::inputStreamEntry::InputStreamEntry;
|
||||||
use super::sinkBoxImpl;
|
use super::sinkBoxImpl;
|
||||||
|
@ -35,7 +34,13 @@ unsafe impl Sync for SinkBox {}
|
||||||
|
|
||||||
impl SinkBox {
|
impl SinkBox {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
Object::builder().build()
|
let obj: Self = Object::builder().build();
|
||||||
|
{
|
||||||
|
let imp = obj.imp();
|
||||||
|
let mut model_index = imp.resetModelIndex.write().unwrap();
|
||||||
|
*model_index = 0;
|
||||||
|
}
|
||||||
|
obj
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn setupCallbacks(&self) {
|
pub fn setupCallbacks(&self) {
|
||||||
|
@ -46,10 +51,26 @@ impl SinkBox {
|
||||||
selfImp
|
selfImp
|
||||||
.resetSinksRow
|
.resetSinksRow
|
||||||
.set_action_target_value(Some(&Variant::from("outputDevices")));
|
.set_action_target_value(Some(&Variant::from("outputDevices")));
|
||||||
|
selfImp
|
||||||
|
.resetCardsRow
|
||||||
|
.set_action_name(Some("navigation.push"));
|
||||||
|
selfImp
|
||||||
|
.resetCardsRow
|
||||||
|
.set_action_target_value(Some(&Variant::from("profileConfiguration")));
|
||||||
|
selfImp.resetCardsRow.connect_action_name_notify(|_| {});
|
||||||
|
|
||||||
selfImp
|
selfImp
|
||||||
.resetInputStreamButton
|
.resetInputStreamButton
|
||||||
.set_action_name(Some("navigation.pop"));
|
.set_action_name(Some("navigation.pop"));
|
||||||
|
selfImp
|
||||||
|
.resetInputCardsBackButton
|
||||||
|
.set_action_name(Some("navigation.pop"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for SinkBox {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,6 +93,7 @@ pub fn populate_sinks(output_box: Arc<SinkBox>) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
populate_inputstreams(output_box.clone());
|
populate_inputstreams(output_box.clone());
|
||||||
|
populate_cards(output_box.clone());
|
||||||
glib::spawn_future(async move {
|
glib::spawn_future(async move {
|
||||||
glib::idle_add_once(move || {
|
glib::idle_add_once(move || {
|
||||||
let output_box_ref_slider = output_box.clone();
|
let output_box_ref_slider = output_box.clone();
|
||||||
|
@ -81,7 +103,7 @@ pub fn populate_sinks(output_box: Arc<SinkBox>) {
|
||||||
let default_sink = output_box_imp.resetDefaultSink.clone();
|
let default_sink = output_box_imp.resetDefaultSink.clone();
|
||||||
let sink = default_sink.borrow();
|
let sink = default_sink.borrow();
|
||||||
|
|
||||||
let volume = sink.volume.first().unwrap_or_else(|| &(0 as u32));
|
let volume = sink.volume.first().unwrap_or(&0);
|
||||||
let fraction = (*volume as f64 / 655.36).round();
|
let fraction = (*volume as f64 / 655.36).round();
|
||||||
let percentage = (fraction).to_string() + "%";
|
let percentage = (fraction).to_string() + "%";
|
||||||
output_box_imp.resetVolumePercentage.set_text(&percentage);
|
output_box_imp.resetVolumePercentage.set_text(&percentage);
|
||||||
|
@ -147,6 +169,15 @@ pub fn populate_sinks(output_box: Arc<SinkBox>) {
|
||||||
let sink = imp.resetDefaultSink.borrow();
|
let sink = imp.resetDefaultSink.borrow();
|
||||||
let index = sink.index;
|
let index = sink.index;
|
||||||
let channels = sink.channels;
|
let channels = sink.channels;
|
||||||
|
{
|
||||||
|
let mut time = imp.volumeTimeStamp.borrow_mut();
|
||||||
|
if time.is_some()
|
||||||
|
&& time.unwrap().elapsed().unwrap() < Duration::from_millis(50)
|
||||||
|
{
|
||||||
|
return Propagation::Proceed;
|
||||||
|
}
|
||||||
|
*time = Some(SystemTime::now());
|
||||||
|
}
|
||||||
set_sink_volume(value, index, channels);
|
set_sink_volume(value, index, channels);
|
||||||
Propagation::Proceed
|
Propagation::Proceed
|
||||||
});
|
});
|
||||||
|
@ -196,6 +227,22 @@ pub fn populate_inputstreams(output_box: Arc<SinkBox>) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn populate_cards(output_box: Arc<SinkBox>) {
|
||||||
|
gio::spawn_blocking(move || {
|
||||||
|
let output_box_ref = output_box.clone();
|
||||||
|
let cards = get_cards();
|
||||||
|
glib::spawn_future(async move {
|
||||||
|
glib::idle_add_once(move || {
|
||||||
|
let imp = output_box_ref.imp();
|
||||||
|
for card in cards {
|
||||||
|
imp.resetCards
|
||||||
|
.append(&ListEntry::new(&CardEntry::new(card)));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
fn get_input_streams() -> Vec<InputStream> {
|
fn get_input_streams() -> Vec<InputStream> {
|
||||||
let conn = Connection::new_session().unwrap();
|
let conn = Connection::new_session().unwrap();
|
||||||
let proxy = conn.with_proxy(
|
let proxy = conn.with_proxy(
|
||||||
|
@ -239,12 +286,21 @@ fn get_default_sink() -> Sink {
|
||||||
res.unwrap().0
|
res.unwrap().0
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn start_output_box_listener(conn: Connection, listeners: Arc<Listeners>, sink_box: Arc<SinkBox>) -> Connection {
|
fn get_cards() -> Vec<Card> {
|
||||||
if listeners.network_listener.load(Ordering::SeqCst) {
|
let conn = Connection::new_session().unwrap();
|
||||||
return conn;
|
let proxy = conn.with_proxy(
|
||||||
|
"org.xetibo.ReSet",
|
||||||
|
"/org/xetibo/ReSet",
|
||||||
|
Duration::from_millis(1000),
|
||||||
|
);
|
||||||
|
let res: Result<(Vec<Card>,), Error> = proxy.method_call("org.xetibo.ReSet", "ListCards", ());
|
||||||
|
if res.is_err() {
|
||||||
|
return Vec::new();
|
||||||
}
|
}
|
||||||
listeners.network_listener.store(true, Ordering::SeqCst);
|
res.unwrap().0
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn start_output_box_listener(conn: Connection, sink_box: Arc<SinkBox>) -> Connection {
|
||||||
let sink_added = SinkAdded::match_rule(
|
let sink_added = SinkAdded::match_rule(
|
||||||
Some(&"org.xetibo.ReSet".into()),
|
Some(&"org.xetibo.ReSet".into()),
|
||||||
Some(&Path::from("/org/xetibo/ReSet")),
|
Some(&Path::from("/org/xetibo/ReSet")),
|
||||||
|
@ -309,6 +365,11 @@ pub fn start_output_box_listener(conn: Connection, listeners: Arc<Listeners>, si
|
||||||
output_box_imp.resetSinks.append(&*entry);
|
output_box_imp.resetSinks.append(&*entry);
|
||||||
let mut map = output_box_imp.resetSinkMap.write().unwrap();
|
let mut map = output_box_imp.resetSinkMap.write().unwrap();
|
||||||
let mut index = output_box_imp.resetModelIndex.write().unwrap();
|
let mut index = output_box_imp.resetModelIndex.write().unwrap();
|
||||||
|
output_box_imp
|
||||||
|
.resetModelList
|
||||||
|
.write()
|
||||||
|
.unwrap()
|
||||||
|
.append(&alias);
|
||||||
map.insert(alias, (sink_index, *index, name));
|
map.insert(alias, (sink_index, *index, name));
|
||||||
*index += 1;
|
*index += 1;
|
||||||
});
|
});
|
||||||
|
@ -337,9 +398,18 @@ pub fn start_output_box_listener(conn: Connection, listeners: Arc<Listeners>, si
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let mut map = output_box_imp.resetSinkMap.write().unwrap();
|
let mut map = output_box_imp.resetSinkMap.write().unwrap();
|
||||||
map.remove(&alias.unwrap().2);
|
let entry_index = map.remove(&alias.unwrap().2);
|
||||||
|
if entry_index.is_some() {
|
||||||
|
output_box_imp
|
||||||
|
.resetModelList
|
||||||
|
.write()
|
||||||
|
.unwrap()
|
||||||
|
.remove(entry_index.unwrap().1);
|
||||||
|
}
|
||||||
let mut index = output_box_imp.resetModelIndex.write().unwrap();
|
let mut index = output_box_imp.resetModelIndex.write().unwrap();
|
||||||
*index -= 1;
|
if *index != 0 {
|
||||||
|
*index -= 1;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
true
|
true
|
||||||
|
@ -482,6 +552,5 @@ pub fn start_output_box_listener(conn: Connection, listeners: Arc<Listeners>, si
|
||||||
return conn;
|
return conn;
|
||||||
}
|
}
|
||||||
|
|
||||||
listeners.network_listener.store(true, Ordering::SeqCst);
|
|
||||||
conn
|
conn
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::sync::{Arc, RwLock};
|
use std::sync::{Arc, RwLock};
|
||||||
|
use std::time::SystemTime;
|
||||||
|
|
||||||
use crate::components::base::listEntry::ListEntry;
|
use crate::components::base::listEntry::ListEntry;
|
||||||
use crate::components::output::inputStreamEntry::InputStreamEntry;
|
use crate::components::output::inputStreamEntry::InputStreamEntry;
|
||||||
|
@ -21,6 +22,8 @@ pub struct SinkBox {
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetSinksRow: TemplateChild<ListEntry>,
|
pub resetSinksRow: TemplateChild<ListEntry>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
|
pub resetCardsRow: TemplateChild<ListEntry>,
|
||||||
|
#[template_child]
|
||||||
pub resetSinkDropdown: TemplateChild<DropDown>,
|
pub resetSinkDropdown: TemplateChild<DropDown>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetSinkMute: TemplateChild<Button>,
|
pub resetSinkMute: TemplateChild<Button>,
|
||||||
|
@ -36,6 +39,10 @@ pub struct SinkBox {
|
||||||
pub resetInputStreamButton: TemplateChild<ListEntry>,
|
pub resetInputStreamButton: TemplateChild<ListEntry>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetInputStreams: TemplateChild<Box>,
|
pub resetInputStreams: TemplateChild<Box>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetInputCardsBackButton: TemplateChild<ListEntry>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetCards: TemplateChild<Box>,
|
||||||
pub resetDefaultCheckButton: Arc<CheckButton>,
|
pub resetDefaultCheckButton: Arc<CheckButton>,
|
||||||
pub resetDefaultSink: Arc<RefCell<Sink>>,
|
pub resetDefaultSink: Arc<RefCell<Sink>>,
|
||||||
pub resetSinkList: Arc<RwLock<HashMap<u32, (Arc<ListEntry>, Arc<SinkEntry>, String)>>>,
|
pub resetSinkList: Arc<RwLock<HashMap<u32, (Arc<ListEntry>, Arc<SinkEntry>, String)>>>,
|
||||||
|
@ -46,6 +53,7 @@ pub struct SinkBox {
|
||||||
// the full name
|
// the full name
|
||||||
pub resetSinkMap: Arc<RwLock<HashMap<String, (u32, u32, String)>>>,
|
pub resetSinkMap: Arc<RwLock<HashMap<String, (u32, u32, String)>>>,
|
||||||
// pub : Arc<Mutex<Vec<ListEntry>>>,
|
// pub : Arc<Mutex<Vec<ListEntry>>>,
|
||||||
|
pub volumeTimeStamp: RefCell<Option<SystemTime>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[glib::object_subclass]
|
#[glib::object_subclass]
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::time::Duration;
|
use std::time::{Duration, SystemTime};
|
||||||
|
|
||||||
use adw::glib;
|
use adw::glib;
|
||||||
use adw::glib::Object;
|
use adw::glib::Object;
|
||||||
|
@ -42,6 +42,13 @@ impl SinkEntry {
|
||||||
let sink = imp.stream.borrow();
|
let sink = imp.stream.borrow();
|
||||||
let index = sink.index;
|
let index = sink.index;
|
||||||
let channels = sink.channels;
|
let channels = sink.channels;
|
||||||
|
{
|
||||||
|
let mut time = imp.volumeTimeStamp.borrow_mut();
|
||||||
|
if time.is_some() && time.unwrap().elapsed().unwrap() < Duration::from_millis(50) {
|
||||||
|
return Propagation::Proceed;
|
||||||
|
}
|
||||||
|
*time = Some(SystemTime::now());
|
||||||
|
}
|
||||||
set_sink_volume(value, index, channels);
|
set_sink_volume(value, index, channels);
|
||||||
Propagation::Proceed
|
Propagation::Proceed
|
||||||
}),
|
}),
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use std::time::SystemTime;
|
||||||
|
|
||||||
use crate::components::output::sinkEntry;
|
use crate::components::output::sinkEntry;
|
||||||
use gtk::subclass::prelude::*;
|
use gtk::subclass::prelude::*;
|
||||||
use gtk::{glib, Button, CompositeTemplate, Label, ProgressBar, Scale, CheckButton};
|
use gtk::{glib, Button, CheckButton, CompositeTemplate, Label, ProgressBar, Scale};
|
||||||
use ReSet_Lib::audio::audio::Sink;
|
use ReSet_Lib::audio::audio::Sink;
|
||||||
|
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
|
@ -23,6 +24,7 @@ pub struct SinkEntry {
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetVolumeMeter: TemplateChild<ProgressBar>,
|
pub resetVolumeMeter: TemplateChild<ProgressBar>,
|
||||||
pub stream: Arc<RefCell<Sink>>,
|
pub stream: Arc<RefCell<Sink>>,
|
||||||
|
pub volumeTimeStamp: RefCell<Option<SystemTime>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[glib::object_subclass]
|
#[glib::object_subclass]
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#![allow(non_snake_case)]
|
#![allow(non_snake_case)]
|
||||||
pub mod savedWifiEntry;
|
pub mod savedWifiEntry;
|
||||||
|
pub mod savedWifiEntryImpl;
|
||||||
pub mod wifiBox;
|
pub mod wifiBox;
|
||||||
pub mod wifiBoxImpl;
|
pub mod wifiBoxImpl;
|
||||||
pub mod wifiEntry;
|
pub mod wifiEntry;
|
||||||
pub mod wifiEntryImpl;
|
pub mod wifiEntryImpl;
|
||||||
pub mod savedWifiEntryImpl;
|
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
use std::collections::HashMap;
|
use crate::components::wifi::wifiBox;
|
||||||
use std::sync::{Arc, Mutex};
|
|
||||||
use gtk::{CompositeTemplate, glib, ListBox, Switch};
|
|
||||||
use gtk::prelude::*;
|
use gtk::prelude::*;
|
||||||
use gtk::subclass::prelude::*;
|
use gtk::subclass::prelude::*;
|
||||||
use crate::components::wifi::wifiBox;
|
use gtk::{glib, CompositeTemplate, ListBox, Switch};
|
||||||
|
use std::collections::HashMap;
|
||||||
|
use std::sync::{Arc, Mutex};
|
||||||
|
|
||||||
use crate::components::wifi::wifiEntry::WifiEntry;
|
|
||||||
use crate::components::base::listEntry::ListEntry;
|
use crate::components::base::listEntry::ListEntry;
|
||||||
|
use crate::components::wifi::wifiEntry::WifiEntry;
|
||||||
|
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
#[derive(Default, CompositeTemplate)]
|
#[derive(Default, CompositeTemplate)]
|
||||||
|
@ -24,7 +24,7 @@ pub struct WifiBox {
|
||||||
pub resetStoredWifiList: TemplateChild<ListBox>,
|
pub resetStoredWifiList: TemplateChild<ListBox>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetAvailableNetworks: TemplateChild<ListEntry>,
|
pub resetAvailableNetworks: TemplateChild<ListEntry>,
|
||||||
pub wifiEntries: Arc<Mutex<HashMap<Vec<u8>,Arc<ListEntry>>>>,
|
pub wifiEntries: Arc<Mutex<HashMap<Vec<u8>, Arc<ListEntry>>>>,
|
||||||
pub savedWifiEntries: Arc<Mutex<Vec<ListEntry>>>,
|
pub savedWifiEntries: Arc<Mutex<Vec<ListEntry>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use std::sync::Arc;
|
|
||||||
use std::sync::atomic::AtomicBool;
|
use std::sync::atomic::AtomicBool;
|
||||||
|
use std::sync::Arc;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
use adw::glib;
|
use adw::glib;
|
||||||
|
@ -8,9 +8,9 @@ use adw::prelude::{ButtonExt, EditableExt, PopoverExt};
|
||||||
use adw::subclass::prelude::ObjectSubclassIsExt;
|
use adw::subclass::prelude::ObjectSubclassIsExt;
|
||||||
use dbus::blocking::Connection;
|
use dbus::blocking::Connection;
|
||||||
use dbus::Error;
|
use dbus::Error;
|
||||||
use glib::{Cast, clone};
|
use glib::{clone, Cast};
|
||||||
use gtk::{AlertDialog, GestureClick};
|
|
||||||
use gtk::prelude::WidgetExt;
|
use gtk::prelude::WidgetExt;
|
||||||
|
use gtk::{AlertDialog, GestureClick};
|
||||||
use ReSet_Lib::network::network::{AccessPoint, WifiStrength};
|
use ReSet_Lib::network::network::{AccessPoint, WifiStrength};
|
||||||
|
|
||||||
use crate::components::wifi::wifiBox::getConnectionSettings;
|
use crate::components::wifi::wifiBox::getConnectionSettings;
|
||||||
|
@ -144,56 +144,58 @@ pub fn click_stored_network(entry: Arc<WifiEntry>) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn click_new_network(entry: Arc<WifiEntry>) {
|
pub fn click_new_network(entry: Arc<WifiEntry>) {
|
||||||
let connect_new_network =
|
let connect_new_network = |result: Arc<AtomicBool>,
|
||||||
|result: Arc<AtomicBool>, entry: Arc<WifiEntry>, access_point: AccessPoint, password: String| {
|
entry: Arc<WifiEntry>,
|
||||||
let entry_ref = entry.clone();
|
access_point: AccessPoint,
|
||||||
let popup = entry.imp().resetWifiPopup.imp();
|
password: String| {
|
||||||
popup.resetPopupLabel.set_text("Connecting...");
|
let entry_ref = entry.clone();
|
||||||
popup.resetPopupLabel.set_visible(true);
|
let popup = entry.imp().resetWifiPopup.imp();
|
||||||
popup.resetPopupEntry.set_sensitive(false);
|
popup.resetPopupLabel.set_text("Connecting...");
|
||||||
popup.resetPopupButton.set_sensitive(false);
|
popup.resetPopupLabel.set_visible(true);
|
||||||
|
popup.resetPopupEntry.set_sensitive(false);
|
||||||
|
popup.resetPopupButton.set_sensitive(false);
|
||||||
|
|
||||||
glib::spawn_future_local(async move {
|
glib::spawn_future_local(async move {
|
||||||
let conn = Connection::new_session().unwrap();
|
let conn = Connection::new_session().unwrap();
|
||||||
let proxy = conn.with_proxy(
|
let proxy = conn.with_proxy(
|
||||||
"org.xetibo.ReSet",
|
"org.xetibo.ReSet",
|
||||||
"/org/xetibo/ReSet",
|
"/org/xetibo/ReSet",
|
||||||
Duration::from_millis(10000),
|
Duration::from_millis(10000),
|
||||||
);
|
);
|
||||||
let res: Result<(bool,), Error> = proxy.method_call(
|
let res: Result<(bool,), Error> = proxy.method_call(
|
||||||
"org.xetibo.ReSet",
|
"org.xetibo.ReSet",
|
||||||
"ConnectToNewAccessPoint",
|
"ConnectToNewAccessPoint",
|
||||||
(access_point, password),
|
(access_point, password),
|
||||||
);
|
);
|
||||||
glib::MainContext::default().spawn_local(async move {
|
glib::MainContext::default().spawn_local(async move {
|
||||||
glib::idle_add_once(move || {
|
glib::idle_add_once(move || {
|
||||||
if res.is_err() {
|
if res.is_err() {
|
||||||
entry_ref
|
entry_ref
|
||||||
.imp()
|
.imp()
|
||||||
.resetWifiPopup
|
.resetWifiPopup
|
||||||
.imp()
|
.imp()
|
||||||
.resetPopupLabel
|
.resetPopupLabel
|
||||||
.set_text("Could not connect to dbus.");
|
.set_text("Could not connect to dbus.");
|
||||||
result.store(false, std::sync::atomic::Ordering::SeqCst);
|
result.store(false, std::sync::atomic::Ordering::SeqCst);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if res.unwrap() == (false,) {
|
if res.unwrap() == (false,) {
|
||||||
entry_ref
|
entry_ref
|
||||||
.imp()
|
.imp()
|
||||||
.resetWifiPopup
|
.resetWifiPopup
|
||||||
.imp()
|
.imp()
|
||||||
.resetPopupLabel
|
.resetPopupLabel
|
||||||
.set_text("Could not connect to access point.");
|
.set_text("Could not connect to access point.");
|
||||||
result.store(false, std::sync::atomic::Ordering::SeqCst);
|
result.store(false, std::sync::atomic::Ordering::SeqCst);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
entry_ref.imp().resetWifiPopup.popdown();
|
entry_ref.imp().resetWifiPopup.popdown();
|
||||||
result.store(true, std::sync::atomic::Ordering::SeqCst);
|
result.store(true, std::sync::atomic::Ordering::SeqCst);
|
||||||
});
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
// TODO crate spinner animation and block UI
|
});
|
||||||
};
|
// TODO crate spinner animation and block UI
|
||||||
|
};
|
||||||
|
|
||||||
let result = Arc::new(AtomicBool::new(false));
|
let result = Arc::new(AtomicBool::new(false));
|
||||||
let result_ref = result.clone();
|
let result_ref = result.clone();
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
use gtk::prelude::FrameExt;
|
use gtk::prelude::FrameExt;
|
||||||
use std::sync::atomic::Ordering;
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use crate::components::base::settingBox::SettingBox;
|
use crate::components::base::settingBox::SettingBox;
|
||||||
use crate::components::base::utils::{start_event_listener, Listeners};
|
use crate::components::base::utils::{start_audio_listener, Listeners};
|
||||||
use crate::components::bluetooth::bluetoothBox::BluetoothBox;
|
use crate::components::bluetooth::bluetoothBox::{start_bluetooth_listener, BluetoothBox};
|
||||||
use crate::components::input::sourceBox::{populate_sources, SourceBox};
|
use crate::components::input::sourceBox::{populate_sources, SourceBox};
|
||||||
use crate::components::output::sinkBox::{populate_sinks, SinkBox};
|
use crate::components::output::sinkBox::{populate_sinks, SinkBox};
|
||||||
use crate::components::wifi::wifiBox::{scanForWifi, show_stored_connections, WifiBox};
|
use crate::components::wifi::wifiBox::{scanForWifi, show_stored_connections, WifiBox};
|
||||||
|
@ -13,12 +12,14 @@ use gtk::{FlowBox, Frame, Label};
|
||||||
|
|
||||||
pub const HANDLE_CONNECTIVITY_CLICK: fn(Arc<Listeners>, FlowBox) =
|
pub const HANDLE_CONNECTIVITY_CLICK: fn(Arc<Listeners>, FlowBox) =
|
||||||
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|
||||||
listeners.pulse_listener.store(false, Ordering::SeqCst);
|
listeners.stop_audio_listener();
|
||||||
let wifiBox = Arc::new(WifiBox::new());
|
let wifiBox = Arc::new(WifiBox::new());
|
||||||
show_stored_connections(wifiBox.clone());
|
show_stored_connections(wifiBox.clone());
|
||||||
scanForWifi(listeners.clone(), wifiBox.clone());
|
scanForWifi(listeners.clone(), wifiBox.clone());
|
||||||
let wifiFrame = wrapInFrame(SettingBox::new(&*wifiBox));
|
let wifiFrame = wrapInFrame(SettingBox::new(&*wifiBox));
|
||||||
let bluetoothFrame = wrapInFrame(SettingBox::new(&BluetoothBox::new()));
|
let bluetooth_box = Arc::new(BluetoothBox::new());
|
||||||
|
start_bluetooth_listener(listeners.clone(), bluetooth_box.clone());
|
||||||
|
let bluetoothFrame = wrapInFrame(SettingBox::new(&*bluetooth_box));
|
||||||
resetMain.remove_all();
|
resetMain.remove_all();
|
||||||
resetMain.insert(&wifiFrame, -1);
|
resetMain.insert(&wifiFrame, -1);
|
||||||
resetMain.insert(&bluetoothFrame, -1);
|
resetMain.insert(&bluetoothFrame, -1);
|
||||||
|
@ -27,8 +28,8 @@ pub const HANDLE_CONNECTIVITY_CLICK: fn(Arc<Listeners>, FlowBox) =
|
||||||
|
|
||||||
pub const HANDLE_WIFI_CLICK: fn(Arc<Listeners>, FlowBox) =
|
pub const HANDLE_WIFI_CLICK: fn(Arc<Listeners>, FlowBox) =
|
||||||
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|
||||||
listeners.bluetooth_listener.store(false, Ordering::SeqCst);
|
listeners.stop_audio_listener();
|
||||||
listeners.pulse_listener.store(false, Ordering::SeqCst);
|
listeners.stop_bluetooth_listener();
|
||||||
let wifiBox = Arc::new(WifiBox::new());
|
let wifiBox = Arc::new(WifiBox::new());
|
||||||
scanForWifi(listeners.clone(), wifiBox.clone());
|
scanForWifi(listeners.clone(), wifiBox.clone());
|
||||||
let wifiFrame = wrapInFrame(SettingBox::new(&*wifiBox));
|
let wifiFrame = wrapInFrame(SettingBox::new(&*wifiBox));
|
||||||
|
@ -40,8 +41,10 @@ pub const HANDLE_WIFI_CLICK: fn(Arc<Listeners>, FlowBox) =
|
||||||
pub const HANDLE_BLUETOOTH_CLICK: fn(Arc<Listeners>, FlowBox) =
|
pub const HANDLE_BLUETOOTH_CLICK: fn(Arc<Listeners>, FlowBox) =
|
||||||
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|
||||||
listeners.stop_network_listener();
|
listeners.stop_network_listener();
|
||||||
listeners.pulse_listener.store(false, Ordering::SeqCst);
|
listeners.stop_audio_listener();
|
||||||
let bluetoothFrame = wrapInFrame(SettingBox::new(&BluetoothBox::new()));
|
let bluetooth_box = Arc::new(BluetoothBox::new());
|
||||||
|
start_bluetooth_listener(listeners.clone(), bluetooth_box.clone());
|
||||||
|
let bluetoothFrame = wrapInFrame(SettingBox::new(&*bluetooth_box));
|
||||||
resetMain.remove_all();
|
resetMain.remove_all();
|
||||||
resetMain.insert(&bluetoothFrame, -1);
|
resetMain.insert(&bluetoothFrame, -1);
|
||||||
resetMain.set_max_children_per_line(1);
|
resetMain.set_max_children_per_line(1);
|
||||||
|
@ -50,8 +53,8 @@ pub const HANDLE_BLUETOOTH_CLICK: fn(Arc<Listeners>, FlowBox) =
|
||||||
pub const HANDLE_VPN_CLICK: fn(Arc<Listeners>, FlowBox) =
|
pub const HANDLE_VPN_CLICK: fn(Arc<Listeners>, FlowBox) =
|
||||||
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|
||||||
listeners.stop_network_listener();
|
listeners.stop_network_listener();
|
||||||
listeners.bluetooth_listener.store(false, Ordering::SeqCst);
|
listeners.stop_bluetooth_listener();
|
||||||
listeners.pulse_listener.store(false, Ordering::SeqCst);
|
listeners.stop_audio_listener();
|
||||||
let label = Label::new(Some("not implemented yet"));
|
let label = Label::new(Some("not implemented yet"));
|
||||||
resetMain.remove_all();
|
resetMain.remove_all();
|
||||||
resetMain.insert(&label, -1);
|
resetMain.insert(&label, -1);
|
||||||
|
@ -61,14 +64,13 @@ pub const HANDLE_VPN_CLICK: fn(Arc<Listeners>, FlowBox) =
|
||||||
pub const HANDLE_AUDIO_CLICK: fn(Arc<Listeners>, FlowBox) =
|
pub const HANDLE_AUDIO_CLICK: fn(Arc<Listeners>, FlowBox) =
|
||||||
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|
||||||
listeners.stop_network_listener();
|
listeners.stop_network_listener();
|
||||||
listeners.bluetooth_listener.store(false, Ordering::SeqCst);
|
listeners.stop_bluetooth_listener();
|
||||||
listeners.pulse_listener.store(true, Ordering::SeqCst);
|
|
||||||
let audioOutput = Arc::new(SinkBox::new());
|
let audioOutput = Arc::new(SinkBox::new());
|
||||||
populate_sinks(audioOutput.clone());
|
populate_sinks(audioOutput.clone());
|
||||||
let audioFrame = wrapInFrame(SettingBox::new(&*audioOutput));
|
let audioFrame = wrapInFrame(SettingBox::new(&*audioOutput));
|
||||||
let audioInput = Arc::new(SourceBox::new());
|
let audioInput = Arc::new(SourceBox::new());
|
||||||
populate_sources(audioInput.clone());
|
populate_sources(audioInput.clone());
|
||||||
start_event_listener(
|
start_audio_listener(
|
||||||
listeners.clone(),
|
listeners.clone(),
|
||||||
Some(audioOutput.clone()),
|
Some(audioOutput.clone()),
|
||||||
Some(audioInput.clone()),
|
Some(audioInput.clone()),
|
||||||
|
@ -83,11 +85,10 @@ pub const HANDLE_AUDIO_CLICK: fn(Arc<Listeners>, FlowBox) =
|
||||||
pub const HANDLE_VOLUME_CLICK: fn(Arc<Listeners>, FlowBox) =
|
pub const HANDLE_VOLUME_CLICK: fn(Arc<Listeners>, FlowBox) =
|
||||||
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|
||||||
listeners.stop_network_listener();
|
listeners.stop_network_listener();
|
||||||
listeners.bluetooth_listener.store(false, Ordering::SeqCst);
|
listeners.stop_bluetooth_listener();
|
||||||
listeners.pulse_listener.store(false, Ordering::SeqCst);
|
|
||||||
let audioOutput = Arc::new(SinkBox::new());
|
let audioOutput = Arc::new(SinkBox::new());
|
||||||
populate_sinks(audioOutput.clone());
|
populate_sinks(audioOutput.clone());
|
||||||
start_event_listener(listeners.clone(), Some(audioOutput.clone()), None);
|
start_audio_listener(listeners.clone(), Some(audioOutput.clone()), None);
|
||||||
let audioFrame = wrapInFrame(SettingBox::new(&*audioOutput));
|
let audioFrame = wrapInFrame(SettingBox::new(&*audioOutput));
|
||||||
resetMain.remove_all();
|
resetMain.remove_all();
|
||||||
resetMain.insert(&audioFrame, -1);
|
resetMain.insert(&audioFrame, -1);
|
||||||
|
@ -97,11 +98,10 @@ pub const HANDLE_VOLUME_CLICK: fn(Arc<Listeners>, FlowBox) =
|
||||||
pub const HANDLE_MICROPHONE_CLICK: fn(Arc<Listeners>, FlowBox) =
|
pub const HANDLE_MICROPHONE_CLICK: fn(Arc<Listeners>, FlowBox) =
|
||||||
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|
||||||
listeners.stop_network_listener();
|
listeners.stop_network_listener();
|
||||||
listeners.bluetooth_listener.store(false, Ordering::SeqCst);
|
listeners.stop_bluetooth_listener();
|
||||||
listeners.pulse_listener.store(false, Ordering::SeqCst);
|
|
||||||
let audioInput = Arc::new(SourceBox::new());
|
let audioInput = Arc::new(SourceBox::new());
|
||||||
populate_sources(audioInput.clone());
|
populate_sources(audioInput.clone());
|
||||||
start_event_listener(listeners.clone(), None, Some(audioInput.clone()));
|
start_audio_listener(listeners.clone(), None, Some(audioInput.clone()));
|
||||||
let sourceFrame = wrapInFrame(SettingBox::new(&*audioInput));
|
let sourceFrame = wrapInFrame(SettingBox::new(&*audioInput));
|
||||||
resetMain.remove_all();
|
resetMain.remove_all();
|
||||||
resetMain.insert(&sourceFrame, -1);
|
resetMain.insert(&sourceFrame, -1);
|
||||||
|
@ -111,8 +111,8 @@ pub const HANDLE_MICROPHONE_CLICK: fn(Arc<Listeners>, FlowBox) =
|
||||||
pub const HANDLE_PERIPHERALS_CLICK: fn(Arc<Listeners>, FlowBox) =
|
pub const HANDLE_PERIPHERALS_CLICK: fn(Arc<Listeners>, FlowBox) =
|
||||||
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|
||||||
listeners.stop_network_listener();
|
listeners.stop_network_listener();
|
||||||
listeners.bluetooth_listener.store(false, Ordering::SeqCst);
|
listeners.stop_audio_listener();
|
||||||
listeners.pulse_listener.store(false, Ordering::SeqCst);
|
listeners.stop_bluetooth_listener();
|
||||||
let label = Label::new(Some("not implemented yet"));
|
let label = Label::new(Some("not implemented yet"));
|
||||||
resetMain.remove_all();
|
resetMain.remove_all();
|
||||||
resetMain.insert(&label, -1);
|
resetMain.insert(&label, -1);
|
||||||
|
@ -122,8 +122,8 @@ pub const HANDLE_PERIPHERALS_CLICK: fn(Arc<Listeners>, FlowBox) =
|
||||||
pub const HANDLE_MONITOR_CLICK: fn(Arc<Listeners>, FlowBox) =
|
pub const HANDLE_MONITOR_CLICK: fn(Arc<Listeners>, FlowBox) =
|
||||||
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|
||||||
listeners.stop_network_listener();
|
listeners.stop_network_listener();
|
||||||
listeners.bluetooth_listener.store(false, Ordering::SeqCst);
|
listeners.stop_audio_listener();
|
||||||
listeners.pulse_listener.store(false, Ordering::SeqCst);
|
listeners.stop_bluetooth_listener();
|
||||||
let label = Label::new(Some("not implemented yet"));
|
let label = Label::new(Some("not implemented yet"));
|
||||||
resetMain.remove_all();
|
resetMain.remove_all();
|
||||||
resetMain.insert(&label, -1);
|
resetMain.insert(&label, -1);
|
||||||
|
@ -133,8 +133,8 @@ pub const HANDLE_MONITOR_CLICK: fn(Arc<Listeners>, FlowBox) =
|
||||||
pub const HANDLE_MOUSE_CLICK: fn(Arc<Listeners>, FlowBox) =
|
pub const HANDLE_MOUSE_CLICK: fn(Arc<Listeners>, FlowBox) =
|
||||||
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|
||||||
listeners.stop_network_listener();
|
listeners.stop_network_listener();
|
||||||
listeners.bluetooth_listener.store(false, Ordering::SeqCst);
|
listeners.stop_audio_listener();
|
||||||
listeners.pulse_listener.store(false, Ordering::SeqCst);
|
listeners.stop_bluetooth_listener();
|
||||||
let label = Label::new(Some("not implemented yet"));
|
let label = Label::new(Some("not implemented yet"));
|
||||||
resetMain.remove_all();
|
resetMain.remove_all();
|
||||||
resetMain.insert(&label, -1);
|
resetMain.insert(&label, -1);
|
||||||
|
@ -144,8 +144,8 @@ pub const HANDLE_MOUSE_CLICK: fn(Arc<Listeners>, FlowBox) =
|
||||||
pub const HANDLE_KEYBOARD_CLICK: fn(Arc<Listeners>, FlowBox) =
|
pub const HANDLE_KEYBOARD_CLICK: fn(Arc<Listeners>, FlowBox) =
|
||||||
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|
||||||
listeners.stop_network_listener();
|
listeners.stop_network_listener();
|
||||||
listeners.bluetooth_listener.store(false, Ordering::SeqCst);
|
listeners.stop_audio_listener();
|
||||||
listeners.pulse_listener.store(false, Ordering::SeqCst);
|
listeners.stop_bluetooth_listener();
|
||||||
let label = Label::new(Some("not implemented yet"));
|
let label = Label::new(Some("not implemented yet"));
|
||||||
resetMain.remove_all();
|
resetMain.remove_all();
|
||||||
resetMain.insert(&label, -1);
|
resetMain.insert(&label, -1);
|
||||||
|
@ -155,9 +155,8 @@ pub const HANDLE_KEYBOARD_CLICK: fn(Arc<Listeners>, FlowBox) =
|
||||||
pub const HANDLE_HOME: fn(Arc<Listeners>, FlowBox) =
|
pub const HANDLE_HOME: fn(Arc<Listeners>, FlowBox) =
|
||||||
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|
|listeners: Arc<Listeners>, resetMain: FlowBox| {
|
||||||
listeners.stop_network_listener();
|
listeners.stop_network_listener();
|
||||||
listeners.network_listener.store(false, Ordering::SeqCst);
|
listeners.stop_audio_listener();
|
||||||
listeners.bluetooth_listener.store(false, Ordering::SeqCst);
|
listeners.stop_bluetooth_listener();
|
||||||
listeners.pulse_listener.store(false, Ordering::SeqCst);
|
|
||||||
resetMain.remove_all();
|
resetMain.remove_all();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#![allow(non_snake_case)]
|
#![allow(non_snake_case)]
|
||||||
pub mod window;
|
pub mod handleSidebarClick;
|
||||||
pub mod windowImpl;
|
|
||||||
pub mod sidebarEntry;
|
pub mod sidebarEntry;
|
||||||
pub mod sidebarEntryImpl;
|
pub mod sidebarEntryImpl;
|
||||||
pub mod handleSidebarClick;
|
pub mod window;
|
||||||
|
pub mod windowImpl;
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use adw::subclass::prelude::ObjectSubclassIsExt;
|
|
||||||
use glib::Object;
|
|
||||||
use gtk::{FlowBox, glib};
|
|
||||||
use gtk::prelude::*;
|
|
||||||
use crate::components::base::utils::Listeners;
|
use crate::components::base::utils::Listeners;
|
||||||
use crate::components::window::sidebarEntryImpl;
|
use crate::components::window::sidebarEntryImpl;
|
||||||
use crate::components::window::sidebarEntryImpl::{Categories, SidebarAction};
|
use crate::components::window::sidebarEntryImpl::{Categories, SidebarAction};
|
||||||
|
use adw::subclass::prelude::ObjectSubclassIsExt;
|
||||||
|
use glib::Object;
|
||||||
|
use gtk::prelude::*;
|
||||||
|
use gtk::{glib, FlowBox};
|
||||||
|
|
||||||
glib::wrapper! {
|
glib::wrapper! {
|
||||||
pub struct SidebarEntry(ObjectSubclass<sidebarEntryImpl::SidebarEntry>)
|
pub struct SidebarEntry(ObjectSubclass<sidebarEntryImpl::SidebarEntry>)
|
||||||
|
|
|
@ -2,8 +2,8 @@ use std::cell::{Cell, RefCell};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use glib::subclass::InitializingObject;
|
use glib::subclass::InitializingObject;
|
||||||
use gtk::{CompositeTemplate, FlowBox, glib, Image, Label, ListBoxRow};
|
|
||||||
use gtk::subclass::prelude::*;
|
use gtk::subclass::prelude::*;
|
||||||
|
use gtk::{glib, CompositeTemplate, FlowBox, Image, Label, ListBoxRow};
|
||||||
|
|
||||||
use crate::components::base::utils::Listeners;
|
use crate::components::base::utils::Listeners;
|
||||||
use crate::components::window::handleSidebarClick::HANDLE_HOME;
|
use crate::components::window::handleSidebarClick::HANDLE_HOME;
|
||||||
|
@ -29,18 +29,18 @@ pub struct SidebarEntry {
|
||||||
pub category: Cell<Categories>,
|
pub category: Cell<Categories>,
|
||||||
pub isSubcategory: Cell<bool>,
|
pub isSubcategory: Cell<bool>,
|
||||||
pub onClickEvent: RefCell<SidebarAction>,
|
pub onClickEvent: RefCell<SidebarAction>,
|
||||||
pub name : RefCell<String>,
|
pub name: RefCell<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
pub struct SidebarAction {
|
pub struct SidebarAction {
|
||||||
pub onClickEvent: fn(Arc<Listeners>,FlowBox),
|
pub onClickEvent: fn(Arc<Listeners>, FlowBox),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for SidebarAction {
|
impl Default for SidebarAction {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self {
|
Self {
|
||||||
onClickEvent: HANDLE_HOME
|
onClickEvent: HANDLE_HOME,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,6 +60,29 @@
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="resetListBoxRow" id="resetCardsRow">
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="height-request">40</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="label">Profile Settings</property>
|
||||||
|
<property name="margin-start">5</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkImage">
|
||||||
|
<property name="halign">end</property>
|
||||||
|
<property name="hexpand">True</property>
|
||||||
|
<property name="icon-name">go-previous-symbolic-rtl</property>
|
||||||
|
<property name="margin-end">5</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
|
@ -92,6 +115,9 @@
|
||||||
<property name="hexpand">True</property>
|
<property name="hexpand">True</property>
|
||||||
<property name="valign">center</property>
|
<property name="valign">center</property>
|
||||||
<property name="value-pos">bottom</property>
|
<property name="value-pos">bottom</property>
|
||||||
|
<marks>
|
||||||
|
<mark position="bottom" value="65536.0">100%</mark>
|
||||||
|
</marks>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
|
@ -187,6 +213,67 @@
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="AdwNavigationPage">
|
||||||
|
<property name="tag">profileConfiguration</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkListBox">
|
||||||
|
<property name="css-classes">boxed-list</property>
|
||||||
|
<property name="margin-bottom">10</property>
|
||||||
|
<property name="margin-end">5</property>
|
||||||
|
<property name="margin-start">5</property>
|
||||||
|
<property name="margin-top">5</property>
|
||||||
|
<property name="show-separators">True</property>
|
||||||
|
<property name="valign">start</property>
|
||||||
|
<child>
|
||||||
|
<object class="resetListBoxRow" id="resetInputCardsBackButton">
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="height-request">40</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="label">Input Streams</property>
|
||||||
|
<property name="margin-start">5</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkImage">
|
||||||
|
<property name="halign">end</property>
|
||||||
|
<property name="hexpand">True</property>
|
||||||
|
<property name="icon-name">go-previous-symbolic</property>
|
||||||
|
<property name="margin-end">5</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel"/>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox" id="resetCards">
|
||||||
|
<property name="margin-end">5</property>
|
||||||
|
<property name="margin-start">5</property>
|
||||||
|
<property name="margin-top">10</property>
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="label">Devices</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -60,6 +60,29 @@
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="resetListBoxRow" id="resetCardsRow">
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="height-request">40</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="label">Profile Settings</property>
|
||||||
|
<property name="margin-start">5</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkImage">
|
||||||
|
<property name="halign">end</property>
|
||||||
|
<property name="hexpand">True</property>
|
||||||
|
<property name="icon-name">go-previous-symbolic-rtl</property>
|
||||||
|
<property name="margin-end">5</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
|
@ -92,6 +115,9 @@
|
||||||
<property name="hexpand">True</property>
|
<property name="hexpand">True</property>
|
||||||
<property name="valign">center</property>
|
<property name="valign">center</property>
|
||||||
<property name="value-pos">bottom</property>
|
<property name="value-pos">bottom</property>
|
||||||
|
<marks>
|
||||||
|
<mark position="bottom" value="65536.0">100%</mark>
|
||||||
|
</marks>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
|
@ -190,6 +216,67 @@
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="AdwNavigationPage">
|
||||||
|
<property name="tag">profileConfiguration</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkListBox">
|
||||||
|
<property name="css-classes">boxed-list</property>
|
||||||
|
<property name="margin-bottom">10</property>
|
||||||
|
<property name="margin-end">5</property>
|
||||||
|
<property name="margin-start">5</property>
|
||||||
|
<property name="margin-top">5</property>
|
||||||
|
<property name="show-separators">True</property>
|
||||||
|
<property name="valign">start</property>
|
||||||
|
<child>
|
||||||
|
<object class="resetListBoxRow" id="resetInputCardsBackButton">
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="height-request">40</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="label">Output Streams</property>
|
||||||
|
<property name="margin-start">5</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkImage">
|
||||||
|
<property name="halign">end</property>
|
||||||
|
<property name="hexpand">True</property>
|
||||||
|
<property name="icon-name">go-previous-symbolic</property>
|
||||||
|
<property name="margin-end">5</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel"/>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox" id="resetCards">
|
||||||
|
<property name="margin-end">5</property>
|
||||||
|
<property name="margin-start">5</property>
|
||||||
|
<property name="margin-top">10</property>
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="label">Devices</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -11,14 +11,34 @@
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkLabel" id="resetBluetoothLabel">
|
<object class="GtkBox">
|
||||||
<property name="ellipsize">end</property>
|
<property name="orientation">vertical</property>
|
||||||
<property name="hexpand">True</property>
|
<child>
|
||||||
<property name="label">LoremIpsum Wireless Mouse</property>
|
<object class="GtkLabel" id="resetBluetoothLabel">
|
||||||
<property name="margin-end">10</property>
|
<property name="ellipsize">end</property>
|
||||||
<property name="single-line-mode">True</property>
|
<property name="hexpand">True</property>
|
||||||
<property name="width-request">200</property>
|
<property name="hexpand-set">True</property>
|
||||||
<property name="xalign">0.0</property>
|
<property name="label">LoremIpsum Wireless Mouse</property>
|
||||||
|
<property name="margin-end">10</property>
|
||||||
|
<property name="single-line-mode">True</property>
|
||||||
|
<property name="vexpand">True</property>
|
||||||
|
<property name="vexpand-set">True</property>
|
||||||
|
<property name="width-request">200</property>
|
||||||
|
<property name="xalign">0.0</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="resetBluetoothAddress">
|
||||||
|
<property name="ellipsize">end</property>
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="label">LoremIpsum Wireless Mouse</property>
|
||||||
|
<property name="margin-end">10</property>
|
||||||
|
<property name="single-line-mode">True</property>
|
||||||
|
<property name="valign">end</property>
|
||||||
|
<property name="width-request">200</property>
|
||||||
|
<property name="xalign">0.0</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
|
|
34
src/resources/resetCardEntry.ui
Normal file
34
src/resources/resetCardEntry.ui
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
|
<!-- Created with Cambalache 0.17.0 -->
|
||||||
|
<interface>
|
||||||
|
<requires lib="gtk" version="4.12"/>
|
||||||
|
<template class="resetCardEntry" parent="GtkBox">
|
||||||
|
<property name="margin-bottom">5</property>
|
||||||
|
<property name="margin-end">5</property>
|
||||||
|
<property name="margin-start">5</property>
|
||||||
|
<property name="margin-top">5</property>
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="margin-bottom">5</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="resetCardName">
|
||||||
|
<property name="label">text</property>
|
||||||
|
<property name="margin-start">5</property>
|
||||||
|
<property name="wrap">True</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkDropDown" id="resetCardDropdown">
|
||||||
|
<property name="halign">end</property>
|
||||||
|
<property name="hexpand">True</property>
|
||||||
|
<property name="hexpand-set">True</property>
|
||||||
|
<property name="model">
|
||||||
|
<object class="GtkStringList" id="resetCardList"/>
|
||||||
|
</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</template>
|
||||||
|
</interface>
|
20
src/resources/resetCards.ui
Normal file
20
src/resources/resetCards.ui
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
|
<!-- Created with Cambalache 0.17.0 -->
|
||||||
|
<interface>
|
||||||
|
<requires lib="gtk" version="4.0"/>
|
||||||
|
<template class="resetCards" parent="GtkBox">
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
|
<property name="valign">start</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkListBox" id="resetCardList">
|
||||||
|
<property name="css-classes">boxed-list</property>
|
||||||
|
<property name="margin-bottom">10</property>
|
||||||
|
<property name="margin-end">5</property>
|
||||||
|
<property name="margin-start">5</property>
|
||||||
|
<property name="margin-top">5</property>
|
||||||
|
<property name="show-separators">True</property>
|
||||||
|
<property name="valign">start</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</template>
|
||||||
|
</interface>
|
|
@ -50,6 +50,9 @@
|
||||||
<property name="hexpand">True</property>
|
<property name="hexpand">True</property>
|
||||||
<property name="valign">center</property>
|
<property name="valign">center</property>
|
||||||
<property name="value-pos">bottom</property>
|
<property name="value-pos">bottom</property>
|
||||||
|
<marks>
|
||||||
|
<mark position="bottom" value="65536.0">100%</mark>
|
||||||
|
</marks>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
|
|
|
@ -50,6 +50,9 @@
|
||||||
<property name="hexpand">True</property>
|
<property name="hexpand">True</property>
|
||||||
<property name="valign">center</property>
|
<property name="valign">center</property>
|
||||||
<property name="value-pos">bottom</property>
|
<property name="value-pos">bottom</property>
|
||||||
|
<marks>
|
||||||
|
<mark position="bottom" value="65536.0">100%</mark>
|
||||||
|
</marks>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
|
|
|
@ -50,6 +50,9 @@
|
||||||
<property name="hexpand">True</property>
|
<property name="hexpand">True</property>
|
||||||
<property name="valign">center</property>
|
<property name="valign">center</property>
|
||||||
<property name="value-pos">bottom</property>
|
<property name="value-pos">bottom</property>
|
||||||
|
<marks>
|
||||||
|
<mark position="bottom" value="65536.0">100%</mark>
|
||||||
|
</marks>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
|
|
|
@ -50,6 +50,9 @@
|
||||||
<property name="hexpand">True</property>
|
<property name="hexpand">True</property>
|
||||||
<property name="valign">center</property>
|
<property name="valign">center</property>
|
||||||
<property name="value-pos">bottom</property>
|
<property name="value-pos">bottom</property>
|
||||||
|
<marks>
|
||||||
|
<mark position="bottom" value="65536.0">100%</mark>
|
||||||
|
</marks>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
|
|
|
@ -17,7 +17,8 @@
|
||||||
(16,6,None,"resetPopup.ui",None,None,None,None,None,None,None),
|
(16,6,None,"resetPopup.ui",None,None,None,None,None,None,None),
|
||||||
(17,1,None,"resetSavedWifiEntry.ui",None,None,None,None,None,None,None),
|
(17,1,None,"resetSavedWifiEntry.ui",None,None,None,None,None,None,None),
|
||||||
(18,1,None,"resetSinkEntry.ui",None,None,None,None,None,None,None),
|
(18,1,None,"resetSinkEntry.ui",None,None,None,None,None,None,None),
|
||||||
(19,1,None,"resetSourceEntry.ui",None,None,None,None,None,None,None)
|
(19,1,None,"resetSourceEntry.ui",None,None,None,None,None,None,None),
|
||||||
|
(20,1,None,"resetCardEntry.ui",None,None,None,None,None,None,None)
|
||||||
</ui>
|
</ui>
|
||||||
<object>
|
<object>
|
||||||
(3,1,"AdwApplicationWindow","resetUI",None,None,None,None,-1," <child>\n <object id=\"resetSidebarBreakpoint\" class=\"AdwBreakpoint\">\n </object>\n </child>"),
|
(3,1,"AdwApplicationWindow","resetUI",None,None,None,None,-1," <child>\n <object id=\"resetSidebarBreakpoint\" class=\"AdwBreakpoint\">\n </object>\n </child>"),
|
||||||
|
@ -134,6 +135,20 @@
|
||||||
(8,112,"GtkLabel",None,111,None,None,None,None,None),
|
(8,112,"GtkLabel",None,111,None,None,None,None,None),
|
||||||
(8,113,"GtkImage",None,111,None,None,None,1,None),
|
(8,113,"GtkImage",None,111,None,None,None,1,None),
|
||||||
(8,115,"GtkAdjustment",None,99,None,None,None,-1,None),
|
(8,115,"GtkAdjustment",None,99,None,None,None,-1,None),
|
||||||
|
(8,116,"AdwNavigationPage",None,54,None,None,None,2,None),
|
||||||
|
(8,117,"GtkBox",None,116,None,None,None,None,None),
|
||||||
|
(8,118,"GtkListBox",None,117,None,None,None,None,None),
|
||||||
|
(8,119,"resetListBoxRow","resetInputCardsBackButton",118,None,None,None,None,None),
|
||||||
|
(8,120,"GtkBox",None,119,None,None,None,None,None),
|
||||||
|
(8,121,"GtkLabel",None,120,None,None,None,None,None),
|
||||||
|
(8,122,"GtkImage",None,120,None,None,None,1,None),
|
||||||
|
(8,123,"GtkLabel",None,117,None,None,None,1,None),
|
||||||
|
(8,124,"GtkBox","resetCards",117,None,None,None,2,None),
|
||||||
|
(8,125,"GtkLabel",None,124,None,None,None,None,None),
|
||||||
|
(8,126,"resetListBoxRow","resetCardsRow",73,None,None,None,1,None),
|
||||||
|
(8,127,"GtkBox",None,126,None,None,None,None,None),
|
||||||
|
(8,128,"GtkLabel",None,127,None,None,None,None,None),
|
||||||
|
(8,129,"GtkImage",None,127,None,None,None,1,None),
|
||||||
(10,1,"GtkBox","resetBluetooth",None,None,None,None,None,None),
|
(10,1,"GtkBox","resetBluetooth",None,None,None,None,None,None),
|
||||||
(10,119,"AdwNavigationView",None,1,None,None,None,1,None),
|
(10,119,"AdwNavigationView",None,1,None,None,None,1,None),
|
||||||
(10,120,"AdwNavigationPage",None,119,None,None,None,None,None),
|
(10,120,"AdwNavigationPage",None,119,None,None,None,None,None),
|
||||||
|
@ -170,8 +185,10 @@
|
||||||
(10,171,"GtkImage",None,169,None,None,None,1,None),
|
(10,171,"GtkImage",None,169,None,None,None,1,None),
|
||||||
(11,2,"GtkBox","resetBluetoothEntry",None,None,None,None,None,None),
|
(11,2,"GtkBox","resetBluetoothEntry",None,None,None,None,None,None),
|
||||||
(11,3,"GtkImage","resetBluetoothDeviceType",2,None,None,None,None,None),
|
(11,3,"GtkImage","resetBluetoothDeviceType",2,None,None,None,None,None),
|
||||||
(11,4,"GtkLabel","resetBluetoothLabel",2,None,None,None,1,None),
|
(11,5,"GtkButton","resetBluetoothButton",2,None,None,None,3,None),
|
||||||
(11,5,"GtkButton","resetBluetoothButton",2,None,None,None,2,None),
|
(11,6,"GtkBox",None,2,None,None,None,2,None),
|
||||||
|
(11,7,"GtkLabel","resetBluetoothLabel",6,None,None,None,None,None),
|
||||||
|
(11,8,"GtkLabel","resetBluetoothAddress",6,None,None,None,1,None),
|
||||||
(12,11,"GtkBox","resetAudioInput",None,None,None,None,None,None),
|
(12,11,"GtkBox","resetAudioInput",None,None,None,None,None,None),
|
||||||
(12,12,"GtkLabel",None,11,None,None,None,None,None),
|
(12,12,"GtkLabel",None,11,None,None,None,None,None),
|
||||||
(12,13,"AdwNavigationView",None,11,None,None,None,1,None),
|
(12,13,"AdwNavigationView",None,11,None,None,None,1,None),
|
||||||
|
@ -202,6 +219,20 @@
|
||||||
(12,49,"GtkBox","resetSources",42,None,None,None,2,None),
|
(12,49,"GtkBox","resetSources",42,None,None,None,2,None),
|
||||||
(12,50,"GtkLabel",None,49,None,None,None,None,None),
|
(12,50,"GtkLabel",None,49,None,None,None,None,None),
|
||||||
(12,51,"GtkAdjustment",None,25,None,None,None,-1,None),
|
(12,51,"GtkAdjustment",None,25,None,None,None,-1,None),
|
||||||
|
(12,52,"AdwNavigationPage",None,13,None,None,None,2,None),
|
||||||
|
(12,53,"GtkBox",None,52,None,None,None,None,None),
|
||||||
|
(12,54,"GtkListBox",None,53,None,None,None,None,None),
|
||||||
|
(12,55,"resetListBoxRow","resetInputCardsBackButton",54,None,None,None,None,None),
|
||||||
|
(12,56,"GtkBox",None,55,None,None,None,None,None),
|
||||||
|
(12,57,"GtkLabel",None,56,None,None,None,None,None),
|
||||||
|
(12,58,"GtkImage",None,56,None,None,None,1,None),
|
||||||
|
(12,59,"GtkLabel",None,53,None,None,None,1,None),
|
||||||
|
(12,60,"GtkBox","resetCards",53,None,None,None,2,None),
|
||||||
|
(12,61,"GtkLabel",None,60,None,None,None,None,None),
|
||||||
|
(12,62,"resetListBoxRow","resetCardsRow",16,None,None,None,1,None),
|
||||||
|
(12,63,"GtkBox",None,62,None,None,None,None,None),
|
||||||
|
(12,64,"GtkLabel",None,63,None,None,None,None,None),
|
||||||
|
(12,65,"GtkImage",None,63,None,None,None,1,None),
|
||||||
(13,11,"GtkBox","resetOutputStreamEntry",None,None,None,None,None,None),
|
(13,11,"GtkBox","resetOutputStreamEntry",None,None,None,None,None,None),
|
||||||
(13,12,"GtkBox",None,11,None,None,None,None,None),
|
(13,12,"GtkBox",None,11,None,None,None,None,None),
|
||||||
(13,13,"GtkLabel","resetSourceName",12,None,None,None,None,None),
|
(13,13,"GtkLabel","resetSourceName",12,None,None,None,None,None),
|
||||||
|
@ -243,7 +274,12 @@
|
||||||
(19,7,"GtkScale","resetVolumeSlider",5,None,None,None,1,None),
|
(19,7,"GtkScale","resetVolumeSlider",5,None,None,None,1,None),
|
||||||
(19,9,"GtkLabel","resetVolumePercentage",5,None,None,None,2,None),
|
(19,9,"GtkLabel","resetVolumePercentage",5,None,None,None,2,None),
|
||||||
(19,10,"GtkProgressBar","resetVolumeMeter",1,None,None,None,2,None),
|
(19,10,"GtkProgressBar","resetVolumeMeter",1,None,None,None,2,None),
|
||||||
(19,12,"GtkAdjustment",None,7,None,None,None,-1,None)
|
(19,12,"GtkAdjustment",None,7,None,None,None,-1,None),
|
||||||
|
(20,1,"GtkBox","resetCardEntry",None,None,None,None,None,None),
|
||||||
|
(20,2,"GtkBox",None,1,None,None,None,None,None),
|
||||||
|
(20,3,"GtkLabel","resetCardName",2,None,None,None,None,None),
|
||||||
|
(20,5,"GtkDropDown","resetCardDropdown",2,None,None,None,1,None),
|
||||||
|
(20,6,"GtkStringList","resetCardList",5,None,None,None,-1,None)
|
||||||
</object>
|
</object>
|
||||||
<object_property>
|
<object_property>
|
||||||
(3,1,"GtkWidget","height-request","200",None,None,None,None,None,None,None,None,None),
|
(3,1,"GtkWidget","height-request","200",None,None,None,None,None,None,None,None,None),
|
||||||
|
@ -521,6 +557,35 @@
|
||||||
(8,115,"GtkAdjustment","page-increment","2005.4016",None,None,None,None,None,None,None,None,None),
|
(8,115,"GtkAdjustment","page-increment","2005.4016",None,None,None,None,None,None,None,None,None),
|
||||||
(8,115,"GtkAdjustment","step-increment","2005.4016",None,None,None,None,None,None,None,None,None),
|
(8,115,"GtkAdjustment","step-increment","2005.4016",None,None,None,None,None,None,None,None,None),
|
||||||
(8,115,"GtkAdjustment","upper","100270.08",None,None,None,None,None,None,None,None,None),
|
(8,115,"GtkAdjustment","upper","100270.08",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,116,"AdwNavigationPage","tag","profileConfiguration",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,117,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,118,"GtkListBox","show-separators","True",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,118,"GtkWidget","css-classes","boxed-list",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,118,"GtkWidget","margin-bottom","10",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,118,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,118,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,118,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,118,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,120,"GtkWidget","height-request","40",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,121,"GtkLabel","label","Output Streams",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,121,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,122,"GtkImage","icon-name","go-previous-symbolic",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,122,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,122,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,122,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,124,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,124,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,124,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,124,"GtkWidget","margin-top","10",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,125,"GtkLabel","label","Devices",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,125,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,127,"GtkWidget","height-request","40",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,128,"GtkLabel","label","Profile Settings",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,128,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,129,"GtkImage","icon-name","go-previous-symbolic-rtl",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,129,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,129,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
||||||
|
(8,129,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
||||||
(10,1,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
|
(10,1,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
|
||||||
(10,1,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
|
(10,1,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
|
||||||
(10,120,"AdwNavigationPage","tag","main",None,None,None,None,None,None,None,None,None),
|
(10,120,"AdwNavigationPage","tag","main",None,None,None,None,None,None,None,None,None),
|
||||||
|
@ -603,15 +668,27 @@
|
||||||
(11,2,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
|
(11,2,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
|
||||||
(11,3,"GtkImage","icon-name","input-mouse-symbolic",None,None,None,None,None,None,None,None,None),
|
(11,3,"GtkImage","icon-name","input-mouse-symbolic",None,None,None,None,None,None,None,None,None),
|
||||||
(11,3,"GtkWidget","margin-end","15",None,None,None,None,None,None,None,None,None),
|
(11,3,"GtkWidget","margin-end","15",None,None,None,None,None,None,None,None,None),
|
||||||
(11,4,"GtkLabel","ellipsize","end",None,None,None,None,None,None,None,None,None),
|
|
||||||
(11,4,"GtkLabel","label","LoremIpsum Wireless Mouse",None,None,None,None,None,None,None,None,None),
|
|
||||||
(11,4,"GtkLabel","single-line-mode","True",None,None,None,None,None,None,None,None,None),
|
|
||||||
(11,4,"GtkLabel","xalign","0.0",None,None,None,None,None,None,None,None,None),
|
|
||||||
(11,4,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
|
||||||
(11,4,"GtkWidget","margin-end","10",None,None,None,None,None,None,None,None,None),
|
|
||||||
(11,4,"GtkWidget","width-request","200",None,None,None,None,None,None,None,None,None),
|
|
||||||
(11,5,"GtkButton","has-frame","False",None,None,None,None,None,None,None,None,None),
|
(11,5,"GtkButton","has-frame","False",None,None,None,None,None,None,None,None,None),
|
||||||
(11,5,"GtkButton","icon-name","emblem-system-symbolic",None,None,None,None,None,None,None,None,None),
|
(11,5,"GtkButton","icon-name","emblem-system-symbolic",None,None,None,None,None,None,None,None,None),
|
||||||
|
(11,6,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
|
||||||
|
(11,7,"GtkLabel","ellipsize","end",None,None,None,None,None,None,None,None,None),
|
||||||
|
(11,7,"GtkLabel","label","LoremIpsum Wireless Mouse",None,None,None,None,None,None,None,None,None),
|
||||||
|
(11,7,"GtkLabel","single-line-mode","True",None,None,None,None,None,None,None,None,None),
|
||||||
|
(11,7,"GtkLabel","xalign","0.0",None,None,None,None,None,None,None,None,None),
|
||||||
|
(11,7,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
||||||
|
(11,7,"GtkWidget","hexpand-set","True",None,None,None,None,None,None,None,None,None),
|
||||||
|
(11,7,"GtkWidget","margin-end","10",None,None,None,None,None,None,None,None,None),
|
||||||
|
(11,7,"GtkWidget","vexpand","True",None,None,None,None,None,None,None,None,None),
|
||||||
|
(11,7,"GtkWidget","vexpand-set","True",None,None,None,None,None,None,None,None,None),
|
||||||
|
(11,7,"GtkWidget","width-request","200",None,None,None,None,None,None,None,None,None),
|
||||||
|
(11,8,"GtkLabel","ellipsize","end",None,None,None,None,None,None,None,None,None),
|
||||||
|
(11,8,"GtkLabel","label","LoremIpsum Wireless Mouse",None,None,None,None,None,None,None,None,None),
|
||||||
|
(11,8,"GtkLabel","single-line-mode","True",None,None,None,None,None,None,None,None,None),
|
||||||
|
(11,8,"GtkLabel","xalign","0.0",None,None,None,None,None,None,None,None,None),
|
||||||
|
(11,8,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
|
||||||
|
(11,8,"GtkWidget","margin-end","10",None,None,None,None,None,None,None,None,None),
|
||||||
|
(11,8,"GtkWidget","valign","end",None,None,None,None,None,None,None,None,None),
|
||||||
|
(11,8,"GtkWidget","width-request","200",None,None,None,None,None,None,None,None,None),
|
||||||
(12,11,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
|
(12,11,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
|
||||||
(12,11,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
|
(12,11,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
|
||||||
(12,12,"GtkLabel","label","Input",None,None,None,None,None,None,None,None,None),
|
(12,12,"GtkLabel","label","Input",None,None,None,None,None,None,None,None,None),
|
||||||
|
@ -683,6 +760,35 @@
|
||||||
(12,51,"GtkAdjustment","page-increment","2005.4016",None,None,None,None,None,None,None,None,None),
|
(12,51,"GtkAdjustment","page-increment","2005.4016",None,None,None,None,None,None,None,None,None),
|
||||||
(12,51,"GtkAdjustment","step-increment","2005.4016",None,None,None,None,None,None,None,None,None),
|
(12,51,"GtkAdjustment","step-increment","2005.4016",None,None,None,None,None,None,None,None,None),
|
||||||
(12,51,"GtkAdjustment","upper","100270.08",None,None,None,None,None,None,None,None,None),
|
(12,51,"GtkAdjustment","upper","100270.08",None,None,None,None,None,None,None,None,None),
|
||||||
|
(12,52,"AdwNavigationPage","tag","profileConfiguration",None,None,None,None,None,None,None,None,None),
|
||||||
|
(12,53,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
|
||||||
|
(12,54,"GtkListBox","show-separators","True",None,None,None,None,None,None,None,None,None),
|
||||||
|
(12,54,"GtkWidget","css-classes","boxed-list",None,None,None,None,None,None,None,None,None),
|
||||||
|
(12,54,"GtkWidget","margin-bottom","10",None,None,None,None,None,None,None,None,None),
|
||||||
|
(12,54,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(12,54,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(12,54,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(12,54,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
|
||||||
|
(12,56,"GtkWidget","height-request","40",None,None,None,None,None,None,None,None,None),
|
||||||
|
(12,57,"GtkLabel","label","Input Streams",None,None,None,None,None,None,None,None,None),
|
||||||
|
(12,57,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(12,58,"GtkImage","icon-name","go-previous-symbolic",None,None,None,None,None,None,None,None,None),
|
||||||
|
(12,58,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
|
||||||
|
(12,58,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
||||||
|
(12,58,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(12,60,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
|
||||||
|
(12,60,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(12,60,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(12,60,"GtkWidget","margin-top","10",None,None,None,None,None,None,None,None,None),
|
||||||
|
(12,61,"GtkLabel","label","Devices",None,None,None,None,None,None,None,None,None),
|
||||||
|
(12,61,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
|
||||||
|
(12,63,"GtkWidget","height-request","40",None,None,None,None,None,None,None,None,None),
|
||||||
|
(12,64,"GtkLabel","label","Profile Settings",None,None,None,None,None,None,None,None,None),
|
||||||
|
(12,64,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(12,65,"GtkImage","icon-name","go-previous-symbolic-rtl",None,None,None,None,None,None,None,None,None),
|
||||||
|
(12,65,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
|
||||||
|
(12,65,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
||||||
|
(12,65,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
||||||
(13,11,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
|
(13,11,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
|
||||||
(13,11,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
|
(13,11,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
|
||||||
(13,11,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
(13,11,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
@ -794,14 +900,50 @@
|
||||||
(19,10,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
|
(19,10,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
|
||||||
(19,12,"GtkAdjustment","page-increment","2005.4016",None,None,None,None,None,None,None,None,None),
|
(19,12,"GtkAdjustment","page-increment","2005.4016",None,None,None,None,None,None,None,None,None),
|
||||||
(19,12,"GtkAdjustment","step-increment","2005.4016",None,None,None,None,None,None,None,None,None),
|
(19,12,"GtkAdjustment","step-increment","2005.4016",None,None,None,None,None,None,None,None,None),
|
||||||
(19,12,"GtkAdjustment","upper","100270.08",None,None,None,None,None,None,None,None,None)
|
(19,12,"GtkAdjustment","upper","100270.08",None,None,None,None,None,None,None,None,None),
|
||||||
|
(20,1,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
|
||||||
|
(20,1,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(20,1,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(20,1,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(20,1,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(20,2,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(20,3,"GtkLabel","label","text",None,None,None,None,None,None,None,None,None),
|
||||||
|
(20,3,"GtkLabel","wrap","True",None,None,None,None,None,None,None,None,None),
|
||||||
|
(20,3,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(20,5,"GtkDropDown","model",None,None,None,None,None,6,None,None,None,None),
|
||||||
|
(20,5,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
|
||||||
|
(20,5,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
||||||
|
(20,5,"GtkWidget","hexpand-set","True",None,None,None,None,None,None,None,None,None)
|
||||||
</object_property>
|
</object_property>
|
||||||
<object_data>
|
<object_data>
|
||||||
(3,42,"GtkWidget",1,1,None,None,None,None,None,None),
|
(3,42,"GtkWidget",1,1,None,None,None,None,None,None),
|
||||||
(3,42,"GtkWidget",2,2,None,1,None,None,None,None)
|
(3,42,"GtkWidget",2,2,None,1,None,None,None,None),
|
||||||
|
(7,9,"GtkScale",1,1,None,None,None,None,None,None),
|
||||||
|
(7,9,"GtkScale",2,2,"100%",1,None,None,None,None),
|
||||||
|
(8,99,"GtkScale",1,1,None,None,None,None,None,None),
|
||||||
|
(8,99,"GtkScale",2,2,"100%",1,None,None,None,None),
|
||||||
|
(12,25,"GtkScale",1,1,None,None,None,None,None,None),
|
||||||
|
(12,25,"GtkScale",2,2,"100%",1,None,None,None,None),
|
||||||
|
(13,17,"GtkScale",1,1,None,None,None,None,None,None),
|
||||||
|
(13,17,"GtkScale",2,2,"100%",1,None,None,None,None),
|
||||||
|
(18,7,"GtkScale",1,1,None,None,None,None,None,None),
|
||||||
|
(18,7,"GtkScale",2,2,"100%",1,None,None,None,None),
|
||||||
|
(19,7,"GtkScale",1,1,None,None,None,None,None,None),
|
||||||
|
(19,7,"GtkScale",2,2,"100%",1,None,None,None,None)
|
||||||
</object_data>
|
</object_data>
|
||||||
<object_data_arg>
|
<object_data_arg>
|
||||||
(7,9,"GtkScale",2,2,"value","50.0"),
|
(7,9,"GtkScale",2,2,"value","65536.0"),
|
||||||
(3,42,"GtkWidget",2,2,"name","b")
|
(3,42,"GtkWidget",2,2,"name","b"),
|
||||||
|
(7,9,"GtkScale",2,2,"position","bottom"),
|
||||||
|
(8,99,"GtkScale",2,2,"position","bottom"),
|
||||||
|
(8,99,"GtkScale",2,2,"value","65536.0"),
|
||||||
|
(12,25,"GtkScale",2,2,"value","65536.0"),
|
||||||
|
(12,25,"GtkScale",2,2,"position","bottom"),
|
||||||
|
(13,17,"GtkScale",2,2,"value","65536.0"),
|
||||||
|
(13,17,"GtkScale",2,2,"position","bottom"),
|
||||||
|
(18,7,"GtkScale",2,2,"position","bottom"),
|
||||||
|
(18,7,"GtkScale",2,2,"value","65536.0"),
|
||||||
|
(19,7,"GtkScale",2,2,"position","bottom"),
|
||||||
|
(19,7,"GtkScale",2,2,"value","65536.0")
|
||||||
</object_data_arg>
|
</object_data_arg>
|
||||||
</cambalache-project>
|
</cambalache-project>
|
||||||
|
|
|
@ -17,5 +17,6 @@
|
||||||
<file compressed="true" preprocess="xml-stripblanks">resetSinkEntry.ui</file>
|
<file compressed="true" preprocess="xml-stripblanks">resetSinkEntry.ui</file>
|
||||||
<file compressed="true" preprocess="xml-stripblanks">resetSourceEntry.ui</file>
|
<file compressed="true" preprocess="xml-stripblanks">resetSourceEntry.ui</file>
|
||||||
<file compressed="true" preprocess="xml-stripblanks">resetPopup.ui</file>
|
<file compressed="true" preprocess="xml-stripblanks">resetPopup.ui</file>
|
||||||
|
<file compressed="true" preprocess="xml-stripblanks">resetCardEntry.ui</file>
|
||||||
</gresource>
|
</gresource>
|
||||||
</gresources>
|
</gresources>
|
||||||
|
|
Loading…
Reference in a new issue