mirror of
https://github.com/Xetibo/ReSet.git
synced 2025-04-17 18:18:34 +02:00
Merge pull request #54 from Xetibo/dashie
feat: Add functionality to volume sliders and mute buttons
This commit is contained in:
commit
98fb183963
|
@ -6,7 +6,7 @@ description = "A wip universal Linux settings application."
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
reset_daemon = "0.1.2"
|
reset_daemon = "0.1.2"
|
||||||
ReSet-Lib = "0.2.6"
|
ReSet-Lib = "0.2.8"
|
||||||
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"] }
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
use crate::components::input::inputStreamEntryImpl;
|
|
||||||
use adw::glib;
|
|
||||||
use adw::glib::Object;
|
|
||||||
|
|
||||||
glib::wrapper! {
|
|
||||||
pub struct InputStreamEntry(ObjectSubclass<inputStreamEntryImpl::InputStreamEntry>)
|
|
||||||
@extends gtk::Box, gtk::Widget,
|
|
||||||
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl InputStreamEntry {
|
|
||||||
pub fn new() -> Self {
|
|
||||||
Object::builder().build()
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +1,7 @@
|
||||||
#![allow(non_snake_case)]
|
#![allow(non_snake_case)]
|
||||||
pub mod inputStreamEntry;
|
|
||||||
pub mod sourceBox;
|
pub mod sourceBox;
|
||||||
pub mod sourceBoxImpl;
|
pub mod sourceBoxImpl;
|
||||||
pub mod inputStreamEntryImpl;
|
pub mod outputStreamEntry;
|
||||||
|
pub mod outputStreamEntryImpl;
|
||||||
|
pub mod sourceEntry;
|
||||||
|
pub mod sourceEntryImpl;
|
||||||
|
|
102
src/components/input/outputStreamEntry.rs
Normal file
102
src/components/input/outputStreamEntry.rs
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
use std::cell::RefCell;
|
||||||
|
use std::sync::Arc;
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
|
use adw::glib;
|
||||||
|
use adw::glib::Object;
|
||||||
|
use adw::prelude::{ButtonExt, RangeExt};
|
||||||
|
use dbus::blocking::Connection;
|
||||||
|
use dbus::Error;
|
||||||
|
use glib::subclass::types::ObjectSubclassIsExt;
|
||||||
|
use glib::{clone, Propagation};
|
||||||
|
use ReSet_Lib::audio::audio::OutputStream;
|
||||||
|
|
||||||
|
use super::outputStreamEntryImpl;
|
||||||
|
|
||||||
|
glib::wrapper! {
|
||||||
|
pub struct OutputStreamEntry(ObjectSubclass<outputStreamEntryImpl::OutputStreamEntry>)
|
||||||
|
@extends gtk::Box, gtk::Widget,
|
||||||
|
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl OutputStreamEntry {
|
||||||
|
pub fn new(stream: OutputStream) -> Self {
|
||||||
|
let obj: Self = Object::builder().build();
|
||||||
|
// TODO use event callback for progress bar -> this is the "im speaking" indicator
|
||||||
|
// TODO map mute to callback
|
||||||
|
// TODO map dropdown
|
||||||
|
{
|
||||||
|
let imp = obj.imp();
|
||||||
|
let name = stream.application_name.clone() + ": " + stream.name.as_str();
|
||||||
|
imp.resetSourceName.set_text(name.as_str());
|
||||||
|
let volume = stream.volume.first().unwrap_or_else(|| &(0 as u32));
|
||||||
|
let fraction = (*volume as f64 / 655.36).round();
|
||||||
|
let percentage = (fraction).to_string() + "%";
|
||||||
|
imp.resetVolumePercentage.set_text(&percentage);
|
||||||
|
imp.resetVolumeSlider.set_value(*volume as f64);
|
||||||
|
imp.stream.replace(stream);
|
||||||
|
imp.resetVolumeSlider.connect_change_value(
|
||||||
|
clone!(@weak imp => @default-return Propagation::Stop, move |_, _, value| {
|
||||||
|
let fraction = (value / 655.36).round();
|
||||||
|
let percentage = (fraction).to_string() + "%";
|
||||||
|
imp.resetVolumePercentage.set_text(&percentage);
|
||||||
|
let stream = imp.stream.borrow();
|
||||||
|
let index = stream.index;
|
||||||
|
let channels = stream.channels;
|
||||||
|
set_outputstream_volume(value, index, channels);
|
||||||
|
Propagation::Proceed
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
imp.resetSourceMute
|
||||||
|
.connect_clicked(clone!(@weak imp => move |_| {
|
||||||
|
let stream = imp.stream.clone();
|
||||||
|
let mut stream = stream.borrow_mut();
|
||||||
|
stream.muted = !stream.muted;
|
||||||
|
let muted = stream.muted;
|
||||||
|
let index = stream.index;
|
||||||
|
if muted {
|
||||||
|
imp.resetSourceMute
|
||||||
|
.set_icon_name("audio-volume-muted-symbolic");
|
||||||
|
} else {
|
||||||
|
imp.resetSourceMute
|
||||||
|
.set_icon_name("audio-volume-high-symbolic");
|
||||||
|
}
|
||||||
|
toggle_output_stream_mute(index, muted);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
obj
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_outputstream_volume(value: f64, index: u32, channels: u16) -> bool {
|
||||||
|
let conn = Connection::new_session().unwrap();
|
||||||
|
let proxy = conn.with_proxy(
|
||||||
|
"org.xetibo.ReSet",
|
||||||
|
"/org/xetibo/ReSet",
|
||||||
|
Duration::from_millis(1000),
|
||||||
|
);
|
||||||
|
let res: Result<(bool,), Error> = proxy.method_call(
|
||||||
|
"org.xetibo.ReSet",
|
||||||
|
"SetOutputStreamVolume",
|
||||||
|
(index, channels, value as u32),
|
||||||
|
);
|
||||||
|
if res.is_err() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
res.unwrap().0
|
||||||
|
}
|
||||||
|
|
||||||
|
fn toggle_output_stream_mute(index: u32, muted: bool) -> bool {
|
||||||
|
let conn = Connection::new_session().unwrap();
|
||||||
|
let proxy = conn.with_proxy(
|
||||||
|
"org.xetibo.ReSet",
|
||||||
|
"/org/xetibo/ReSet",
|
||||||
|
Duration::from_millis(1000),
|
||||||
|
);
|
||||||
|
let res: Result<(bool,), Error> =
|
||||||
|
proxy.method_call("org.xetibo.ReSet", "SetOutputStreamMute", (index, muted));
|
||||||
|
if res.is_err() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
res.unwrap().0
|
||||||
|
}
|
|
@ -1,17 +1,19 @@
|
||||||
use std::cell::{Cell, RefCell};
|
use std::cell::RefCell;
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
use crate::components::output::audioSource;
|
use crate::components::input::outputStreamEntry;
|
||||||
|
use ReSet_Lib::audio::audio::OutputStream;
|
||||||
use gtk::subclass::prelude::*;
|
use gtk::subclass::prelude::*;
|
||||||
use gtk::{glib, Button, CompositeTemplate, DropDown, Label, ProgressBar, Scale};
|
use gtk::{glib, Button, CompositeTemplate, Label, ProgressBar, Scale, DropDown};
|
||||||
|
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
#[derive(Default, CompositeTemplate)]
|
#[derive(Default, CompositeTemplate)]
|
||||||
#[template(resource = "/org/Xetibo/ReSet/resetOutputStreamEntry.ui")]
|
#[template(resource = "/org/Xetibo/ReSet/resetOutputStreamEntry.ui")]
|
||||||
pub struct AudioSourceEntry {
|
pub struct OutputStreamEntry {
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetSourceName: TemplateChild<Label>,
|
pub resetSourceName: TemplateChild<Label>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetSelectedSink: TemplateChild<DropDown>,
|
pub resetSelectedSource: TemplateChild<DropDown>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetSourceMute: TemplateChild<Button>,
|
pub resetSourceMute: TemplateChild<Button>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
|
@ -20,15 +22,13 @@ pub struct AudioSourceEntry {
|
||||||
pub resetVolumePercentage: TemplateChild<Label>,
|
pub resetVolumePercentage: TemplateChild<Label>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetVolumeMeter: TemplateChild<ProgressBar>,
|
pub resetVolumeMeter: TemplateChild<ProgressBar>,
|
||||||
pub associatedIndex: Cell<u32>,
|
pub stream: Arc<RefCell<OutputStream>>,
|
||||||
pub isMuted: Cell<bool>,
|
|
||||||
pub volume: RefCell<Vec<u32>>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[glib::object_subclass]
|
#[glib::object_subclass]
|
||||||
impl ObjectSubclass for AudioSourceEntry {
|
impl ObjectSubclass for OutputStreamEntry {
|
||||||
const NAME: &'static str = "resetOutputStreamEntry";
|
const NAME: &'static str = "resetOutputStreamEntry";
|
||||||
type Type = audioSource::AudioSourceEntry;
|
type Type = outputStreamEntry::OutputStreamEntry;
|
||||||
type ParentType = gtk::Box;
|
type ParentType = gtk::Box;
|
||||||
|
|
||||||
fn class_init(klass: &mut Self::Class) {
|
fn class_init(klass: &mut Self::Class) {
|
||||||
|
@ -40,8 +40,9 @@ impl ObjectSubclass for AudioSourceEntry {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl BoxImpl for AudioSourceEntry {}
|
impl BoxImpl for OutputStreamEntry {}
|
||||||
|
|
||||||
impl ObjectImpl for AudioSourceEntry {}
|
impl ObjectImpl for OutputStreamEntry {}
|
||||||
|
|
||||||
|
impl WidgetImpl for OutputStreamEntry {}
|
||||||
|
|
||||||
impl WidgetImpl for AudioSourceEntry {}
|
|
|
@ -1,9 +1,23 @@
|
||||||
|
use std::sync::Arc;
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
|
use crate::components::base::listEntry::ListEntry;
|
||||||
|
use crate::components::base::utils::Listeners;
|
||||||
use crate::components::input::sourceBoxImpl;
|
use crate::components::input::sourceBoxImpl;
|
||||||
|
use crate::components::input::sourceEntry::set_source_volume;
|
||||||
use adw::glib;
|
use adw::glib;
|
||||||
use adw::glib::Object;
|
use adw::glib::Object;
|
||||||
|
use adw::prelude::{BoxExt, ButtonExt, ListBoxRowExt, RangeExt};
|
||||||
|
use dbus::blocking::Connection;
|
||||||
|
use dbus::Error;
|
||||||
use glib::subclass::prelude::ObjectSubclassIsExt;
|
use glib::subclass::prelude::ObjectSubclassIsExt;
|
||||||
use glib::Variant;
|
use glib::{Propagation, Variant};
|
||||||
|
use gtk::gio;
|
||||||
use gtk::prelude::ActionableExt;
|
use gtk::prelude::ActionableExt;
|
||||||
|
use ReSet_Lib::audio::audio::{OutputStream, Source};
|
||||||
|
|
||||||
|
use super::outputStreamEntry::OutputStreamEntry;
|
||||||
|
use super::sourceEntry::{toggle_source_mute, SourceEntry};
|
||||||
|
|
||||||
glib::wrapper! {
|
glib::wrapper! {
|
||||||
pub struct SourceBox(ObjectSubclass<sourceBoxImpl::SourceBox>)
|
pub struct SourceBox(ObjectSubclass<sourceBoxImpl::SourceBox>)
|
||||||
|
@ -11,6 +25,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 SourceBox {}
|
||||||
|
unsafe impl Sync for SourceBox {}
|
||||||
|
|
||||||
impl SourceBox {
|
impl SourceBox {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
Object::builder().build()
|
Object::builder().build()
|
||||||
|
@ -18,9 +35,152 @@ impl SourceBox {
|
||||||
|
|
||||||
pub fn setupCallbacks(&self) {
|
pub fn setupCallbacks(&self) {
|
||||||
let selfImp = self.imp();
|
let selfImp = self.imp();
|
||||||
selfImp.resetSourceRow.set_action_name(Some("navigation.push"));
|
selfImp
|
||||||
selfImp.resetSourceRow.set_action_target_value(Some(&Variant::from("sources")));
|
.resetSourceRow
|
||||||
|
.set_action_name(Some("navigation.push"));
|
||||||
|
selfImp
|
||||||
|
.resetSourceRow
|
||||||
|
.set_action_target_value(Some(&Variant::from("sources")));
|
||||||
|
|
||||||
selfImp.resetInputStreamButton.set_action_name(Some("navigation.pop"));
|
selfImp
|
||||||
|
.resetOutputStreamButton
|
||||||
|
.set_action_name(Some("navigation.pop"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn populate_sources(output_box: Arc<SourceBox>) {
|
||||||
|
gio::spawn_blocking(move || {
|
||||||
|
let output_box_imp = output_box.imp();
|
||||||
|
let sinks = get_sources();
|
||||||
|
output_box_imp
|
||||||
|
.resetDefaultSource
|
||||||
|
.replace(get_default_source());
|
||||||
|
glib::spawn_future(async move {
|
||||||
|
glib::idle_add_once(move || {
|
||||||
|
// TODO handle default mapping
|
||||||
|
let output_box_ref_slider = output_box.clone();
|
||||||
|
let output_box_ref_mute = output_box.clone();
|
||||||
|
let output_box_ref = output_box.clone();
|
||||||
|
{
|
||||||
|
let output_box_imp = output_box_ref.imp();
|
||||||
|
let default_sink = output_box_imp.resetDefaultSource.clone(); // Clone outside closure
|
||||||
|
let source = default_sink.borrow(); //
|
||||||
|
|
||||||
|
let volume = source.volume.first().unwrap_or_else(|| &(0 as u32));
|
||||||
|
let fraction = (*volume as f64 / 655.36).round();
|
||||||
|
let percentage = (fraction).to_string() + "%";
|
||||||
|
output_box_imp.resetVolumePercentage.set_text(&percentage);
|
||||||
|
output_box_imp.resetVolumeSlider.set_value(*volume as f64);
|
||||||
|
for stream in sinks {
|
||||||
|
let mut is_default = false;
|
||||||
|
if output_box_imp.resetDefaultSource.borrow().name == stream.name {
|
||||||
|
is_default = true;
|
||||||
|
}
|
||||||
|
let entry = ListEntry::new(&SourceEntry::new(is_default, output_box_imp.resetDefaultCheckButton.clone(), stream));
|
||||||
|
entry.set_activatable(false);
|
||||||
|
output_box_imp.resetSources.append(&entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
output_box_ref
|
||||||
|
.imp()
|
||||||
|
.resetVolumeSlider
|
||||||
|
.connect_change_value(move |_, _, value| {
|
||||||
|
let imp = output_box_ref_slider.imp();
|
||||||
|
let fraction = (value / 655.36).round();
|
||||||
|
println!("{fraction}");
|
||||||
|
let percentage = (fraction).to_string() + "%";
|
||||||
|
imp.resetVolumePercentage.set_text(&percentage);
|
||||||
|
let source = imp.resetDefaultSource.borrow();
|
||||||
|
let index = source.index;
|
||||||
|
let channels = source.channels;
|
||||||
|
set_source_volume(value, index, channels);
|
||||||
|
Propagation::Proceed
|
||||||
|
});
|
||||||
|
|
||||||
|
output_box_ref
|
||||||
|
.imp()
|
||||||
|
.resetSourceMute
|
||||||
|
.connect_clicked(move |_| {
|
||||||
|
let imp = output_box_ref_mute.imp();
|
||||||
|
let stream = imp.resetDefaultSource.clone();
|
||||||
|
let mut stream = stream.borrow_mut();
|
||||||
|
stream.muted = !stream.muted;
|
||||||
|
let muted = stream.muted;
|
||||||
|
let index = stream.index;
|
||||||
|
if muted {
|
||||||
|
imp.resetSourceMute
|
||||||
|
.set_icon_name("audio-volume-muted-symbolic");
|
||||||
|
} else {
|
||||||
|
imp.resetSourceMute
|
||||||
|
.set_icon_name("audio-volume-high-symbolic");
|
||||||
|
}
|
||||||
|
toggle_source_mute(index, muted);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn populate_outputstreams(listeners: Arc<Listeners>, output_box: Arc<SourceBox>) {
|
||||||
|
// TODO add listener
|
||||||
|
let output_box_ref = output_box.clone();
|
||||||
|
|
||||||
|
gio::spawn_blocking(move || {
|
||||||
|
let streams = get_output_streams();
|
||||||
|
glib::spawn_future(async move {
|
||||||
|
glib::idle_add_once(move || {
|
||||||
|
let output_box_imp = output_box_ref.imp();
|
||||||
|
for stream in streams {
|
||||||
|
let entry = ListEntry::new(&OutputStreamEntry::new(stream));
|
||||||
|
entry.set_activatable(false);
|
||||||
|
output_box_imp.resetOutputStreams.append(&entry);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_output_streams() -> Vec<OutputStream> {
|
||||||
|
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<OutputStream>,), Error> =
|
||||||
|
proxy.method_call("org.xetibo.ReSet", "ListOutputStreams", ());
|
||||||
|
if res.is_err() {
|
||||||
|
return Vec::new();
|
||||||
|
}
|
||||||
|
res.unwrap().0
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_sources() -> Vec<Source> {
|
||||||
|
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<Source>,), Error> =
|
||||||
|
proxy.method_call("org.xetibo.ReSet", "ListSources", ());
|
||||||
|
if res.is_err() {
|
||||||
|
return Vec::new();
|
||||||
|
}
|
||||||
|
res.unwrap().0
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_default_source() -> Source {
|
||||||
|
let conn = Connection::new_session().unwrap();
|
||||||
|
let proxy = conn.with_proxy(
|
||||||
|
"org.xetibo.ReSet",
|
||||||
|
"/org/xetibo/ReSet",
|
||||||
|
Duration::from_millis(1000),
|
||||||
|
);
|
||||||
|
let res: Result<(Source,), Error> =
|
||||||
|
proxy.method_call("org.xetibo.ReSet", "GetDefaultSource", ());
|
||||||
|
if res.is_err() {
|
||||||
|
return Source::default();
|
||||||
|
}
|
||||||
|
res.unwrap().0
|
||||||
|
}
|
||||||
|
|
|
@ -1,35 +1,53 @@
|
||||||
|
use std::cell::RefCell;
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
|
|
||||||
use crate::components::base::listEntry::ListEntry;
|
use crate::components::base::listEntry::ListEntry;
|
||||||
use crate::components::input::inputStreamEntry::InputStreamEntry;
|
|
||||||
use crate::components::input::sourceBox;
|
use crate::components::input::sourceBox;
|
||||||
use gtk::prelude::*;
|
|
||||||
use gtk::subclass::prelude::*;
|
use gtk::subclass::prelude::*;
|
||||||
use gtk::{glib, CompositeTemplate, DropDown, TemplateChild};
|
use gtk::{glib, CompositeTemplate, DropDown, TemplateChild, CheckButton};
|
||||||
|
use gtk::{prelude::*, Button, Label, ProgressBar, Scale};
|
||||||
use ReSet_Lib::audio::audio::{OutputStream, Source};
|
use ReSet_Lib::audio::audio::{OutputStream, Source};
|
||||||
|
|
||||||
|
use super::outputStreamEntry::OutputStreamEntry;
|
||||||
|
use super::sourceEntry::SourceEntry;
|
||||||
|
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
#[derive(Default, CompositeTemplate)]
|
#[derive(Default, CompositeTemplate)]
|
||||||
#[template(resource = "/org/Xetibo/ReSet/resetMicrophone.ui")]
|
#[template(resource = "/org/Xetibo/ReSet/resetAudioInput.ui")]
|
||||||
pub struct SourceBox {
|
pub struct SourceBox {
|
||||||
#[template_child]
|
|
||||||
pub resetSourceDropdown: TemplateChild<DropDown>,
|
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetSourceRow: TemplateChild<ListEntry>,
|
pub resetSourceRow: TemplateChild<ListEntry>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetInputStreamButton: TemplateChild<ListEntry>,
|
pub resetSourceDropdown: TemplateChild<DropDown>,
|
||||||
pub resetSources: Arc<Mutex<Vec<Source>>>,
|
#[template_child]
|
||||||
pub resetOutputStreams: Arc<Mutex<Vec<OutputStream>>>,
|
pub resetSourceMute: TemplateChild<Button>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetVolumeSlider: TemplateChild<Scale>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetVolumePercentage: TemplateChild<Label>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetVolumeMeter: TemplateChild<ProgressBar>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetSources: TemplateChild<gtk::Box>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetOutputStreamButton: TemplateChild<ListEntry>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetOutputStreams: TemplateChild<gtk::Box>,
|
||||||
|
pub resetDefaultCheckButton: Arc<CheckButton>,
|
||||||
|
pub resetDefaultSource: Arc<RefCell<Source>>,
|
||||||
|
pub resetSourceList: Arc<Mutex<Vec<Source>>>,
|
||||||
|
pub resetOutputStreamList: Arc<Mutex<Vec<OutputStream>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[glib::object_subclass]
|
#[glib::object_subclass]
|
||||||
impl ObjectSubclass for SourceBox {
|
impl ObjectSubclass for SourceBox {
|
||||||
const NAME: &'static str = "resetMicrophone";
|
const NAME: &'static str = "resetAudioInput";
|
||||||
type Type = sourceBox::SourceBox;
|
type Type = sourceBox::SourceBox;
|
||||||
type ParentType = gtk::Box;
|
type ParentType = gtk::Box;
|
||||||
|
|
||||||
fn class_init(klass: &mut Self::Class) {
|
fn class_init(klass: &mut Self::Class) {
|
||||||
InputStreamEntry::ensure_type();
|
OutputStreamEntry::ensure_type();
|
||||||
|
SourceEntry::ensure_type();
|
||||||
ListEntry::ensure_type();
|
ListEntry::ensure_type();
|
||||||
klass.bind_template();
|
klass.bind_template();
|
||||||
}
|
}
|
||||||
|
@ -55,4 +73,3 @@ impl WidgetImpl for SourceBox {}
|
||||||
impl WindowImpl for SourceBox {}
|
impl WindowImpl for SourceBox {}
|
||||||
|
|
||||||
impl ApplicationWindowImpl for SourceBox {}
|
impl ApplicationWindowImpl for SourceBox {}
|
||||||
|
|
||||||
|
|
136
src/components/input/sourceEntry.rs
Normal file
136
src/components/input/sourceEntry.rs
Normal file
|
@ -0,0 +1,136 @@
|
||||||
|
use std::cell::RefCell;
|
||||||
|
use std::sync::Arc;
|
||||||
|
use std::thread;
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
|
use adw::glib;
|
||||||
|
use adw::glib::Object;
|
||||||
|
use adw::prelude::{ButtonExt, RangeExt, CheckButtonExt};
|
||||||
|
use dbus::blocking::Connection;
|
||||||
|
use dbus::Error;
|
||||||
|
use glib::subclass::types::ObjectSubclassIsExt;
|
||||||
|
use glib::{clone, Propagation};
|
||||||
|
use ReSet_Lib::audio::audio::Source;
|
||||||
|
use gtk::CheckButton;
|
||||||
|
|
||||||
|
use super::sourceEntryImpl;
|
||||||
|
|
||||||
|
glib::wrapper! {
|
||||||
|
pub struct SourceEntry(ObjectSubclass<sourceEntryImpl::SourceEntry>)
|
||||||
|
@extends gtk::Box, gtk::Widget,
|
||||||
|
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl SourceEntry {
|
||||||
|
pub fn new(is_default: bool, check_group: Arc<CheckButton>, stream: Source) -> Self {
|
||||||
|
let obj: Self = Object::builder().build();
|
||||||
|
// TODO use event callback for progress bar -> this is the "im speaking" indicator
|
||||||
|
// TODO map the slider to volume
|
||||||
|
// TODO properly use volume fraction
|
||||||
|
// TODO map mute to callback
|
||||||
|
// TODO map dropdown
|
||||||
|
{
|
||||||
|
let imp = obj.imp();
|
||||||
|
imp.resetSourceName.set_text(stream.name.clone().as_str());
|
||||||
|
let name = Arc::new(stream.name.clone());
|
||||||
|
let volume = stream.volume.first().unwrap_or_else(|| &(0 as u32));
|
||||||
|
let fraction = (*volume as f64 / 655.36).round();
|
||||||
|
let percentage = (fraction).to_string() + "%";
|
||||||
|
imp.resetVolumePercentage.set_text(&percentage);
|
||||||
|
imp.resetVolumeSlider.set_value(*volume as f64);
|
||||||
|
imp.stream.replace(stream);
|
||||||
|
imp.resetVolumeSlider.connect_change_value(
|
||||||
|
clone!(@weak imp => @default-return Propagation::Stop, move |_, _, value| {
|
||||||
|
let fraction = (value / 655.36).round();
|
||||||
|
println!("{fraction}");
|
||||||
|
let percentage = (fraction).to_string() + "%";
|
||||||
|
imp.resetVolumePercentage.set_text(&percentage);
|
||||||
|
let source = imp.stream.borrow();
|
||||||
|
let index = source.index;
|
||||||
|
let channels = source.channels;
|
||||||
|
set_source_volume(value, index, channels);
|
||||||
|
Propagation::Proceed
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
imp.resetSelectedSource.set_group(Some(&*check_group));
|
||||||
|
// check_group.set_group(Some(&*imp.resetSelectedSink));
|
||||||
|
if is_default {
|
||||||
|
imp.resetSelectedSource.set_active(true);
|
||||||
|
} else {
|
||||||
|
imp.resetSelectedSource.set_active(false);
|
||||||
|
}
|
||||||
|
imp.resetSelectedSource.connect_toggled(move |button| {
|
||||||
|
if button.is_active() {
|
||||||
|
set_default_source(name.clone());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
imp.resetSourceMute
|
||||||
|
.connect_clicked(clone!(@weak imp => move |_| {
|
||||||
|
let stream = imp.stream.clone();
|
||||||
|
let mut stream = stream.borrow_mut();
|
||||||
|
stream.muted = !stream.muted;
|
||||||
|
let muted = stream.muted;
|
||||||
|
let index = stream.index;
|
||||||
|
if muted {
|
||||||
|
imp.resetSourceMute
|
||||||
|
.set_icon_name("audio-volume-muted-symbolic");
|
||||||
|
} else {
|
||||||
|
imp.resetSourceMute
|
||||||
|
.set_icon_name("audio-volume-high-symbolic");
|
||||||
|
}
|
||||||
|
toggle_source_mute(index, muted);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
obj
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_source_volume(value: f64, index: u32, channels: u16) -> bool {
|
||||||
|
let conn = Connection::new_session().unwrap();
|
||||||
|
let proxy = conn.with_proxy(
|
||||||
|
"org.xetibo.ReSet",
|
||||||
|
"/org/xetibo/ReSet",
|
||||||
|
Duration::from_millis(1000),
|
||||||
|
);
|
||||||
|
let res: Result<(bool,), Error> = proxy.method_call(
|
||||||
|
"org.xetibo.ReSet",
|
||||||
|
"SetSourceVolume",
|
||||||
|
(index, channels, value as u32),
|
||||||
|
);
|
||||||
|
if res.is_err() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
res.unwrap().0
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn toggle_source_mute(index: u32, muted: bool) -> bool {
|
||||||
|
let conn = Connection::new_session().unwrap();
|
||||||
|
let proxy = conn.with_proxy(
|
||||||
|
"org.xetibo.ReSet",
|
||||||
|
"/org/xetibo/ReSet",
|
||||||
|
Duration::from_millis(1000),
|
||||||
|
);
|
||||||
|
let res: Result<(bool,), Error> =
|
||||||
|
proxy.method_call("org.xetibo.ReSet", "SetSourceMute", (index, muted));
|
||||||
|
if res.is_err() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
res.unwrap().0
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_default_source(name: Arc<String>) {
|
||||||
|
thread::spawn(move || {
|
||||||
|
let conn = Connection::new_session().unwrap();
|
||||||
|
let proxy = conn.with_proxy(
|
||||||
|
"org.xetibo.ReSet",
|
||||||
|
"/org/xetibo/ReSet",
|
||||||
|
Duration::from_millis(1000),
|
||||||
|
);
|
||||||
|
let res: Result<(bool,), Error> =
|
||||||
|
proxy.method_call("org.xetibo.ReSet", "SetDefaultSink", (name.as_str(),));
|
||||||
|
if res.is_err() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// handle change
|
||||||
|
});
|
||||||
|
}
|
48
src/components/input/sourceEntryImpl.rs
Normal file
48
src/components/input/sourceEntryImpl.rs
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
use std::cell::RefCell;
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
use gtk::subclass::prelude::*;
|
||||||
|
use gtk::{glib, Button, CompositeTemplate, Label, ProgressBar, Scale, CheckButton};
|
||||||
|
use ReSet_Lib::audio::audio::Source;
|
||||||
|
|
||||||
|
use super::sourceEntry;
|
||||||
|
|
||||||
|
#[allow(non_snake_case)]
|
||||||
|
#[derive(Default, CompositeTemplate)]
|
||||||
|
#[template(resource = "/org/Xetibo/ReSet/resetSourceEntry.ui")]
|
||||||
|
pub struct SourceEntry {
|
||||||
|
#[template_child]
|
||||||
|
pub resetSourceName: TemplateChild<Label>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetSelectedSource: TemplateChild<CheckButton>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetSourceMute: TemplateChild<Button>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetVolumeSlider: TemplateChild<Scale>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetVolumePercentage: TemplateChild<Label>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetVolumeMeter: TemplateChild<ProgressBar>,
|
||||||
|
pub stream: Arc<RefCell<Source>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[glib::object_subclass]
|
||||||
|
impl ObjectSubclass for SourceEntry {
|
||||||
|
const NAME: &'static str = "resetSourceEntry";
|
||||||
|
type Type = sourceEntry::SourceEntry;
|
||||||
|
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 SourceEntry {}
|
||||||
|
|
||||||
|
impl ObjectImpl for SourceEntry {}
|
||||||
|
|
||||||
|
impl WidgetImpl for SourceEntry {}
|
|
@ -1,145 +0,0 @@
|
||||||
use std::sync::Arc;
|
|
||||||
use std::time::Duration;
|
|
||||||
|
|
||||||
use crate::components::base::listEntry::ListEntry;
|
|
||||||
use crate::components::base::utils::Listeners;
|
|
||||||
use crate::components::output::audioBoxImpl;
|
|
||||||
use adw::glib::Object;
|
|
||||||
use adw::prelude::BoxExt;
|
|
||||||
use adw::{glib, prelude::ListBoxRowExt};
|
|
||||||
use dbus::blocking::Connection;
|
|
||||||
use dbus::Error;
|
|
||||||
use glib::subclass::prelude::ObjectSubclassIsExt;
|
|
||||||
use glib::Variant;
|
|
||||||
use gtk::gio;
|
|
||||||
use gtk::prelude::ActionableExt;
|
|
||||||
use ReSet_Lib::audio::audio::{InputStream, Sink};
|
|
||||||
|
|
||||||
use super::audioSource::{self, AudioSourceEntry};
|
|
||||||
|
|
||||||
glib::wrapper! {
|
|
||||||
pub struct AudioBox(ObjectSubclass<audioBoxImpl::AudioBox>)
|
|
||||||
@extends gtk::Box, gtk::Widget,
|
|
||||||
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe impl Send for AudioBox {}
|
|
||||||
unsafe impl Sync for AudioBox {}
|
|
||||||
|
|
||||||
impl AudioBox {
|
|
||||||
pub fn new() -> Self {
|
|
||||||
Object::builder().build()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn setupCallbacks(&self) {
|
|
||||||
let selfImp = self.imp();
|
|
||||||
selfImp
|
|
||||||
.resetSinksRow
|
|
||||||
.set_action_name(Some("navigation.push"));
|
|
||||||
selfImp
|
|
||||||
.resetSinksRow
|
|
||||||
.set_action_target_value(Some(&Variant::from("outputDevices")));
|
|
||||||
|
|
||||||
selfImp
|
|
||||||
.resetOutputStreamButton
|
|
||||||
.set_action_name(Some("navigation.pop"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn populate_sinks(output_box: Arc<AudioBox>) {
|
|
||||||
let output_box_ref = output_box.clone();
|
|
||||||
gio::spawn_blocking(move || {
|
|
||||||
let output_box_imp = output_box.imp();
|
|
||||||
let sinks = get_sinks();
|
|
||||||
output_box_imp.resetDefaultSink.replace(get_default_sink());
|
|
||||||
glib::spawn_future(async move {
|
|
||||||
glib::idle_add_once(move || {
|
|
||||||
let output_box_imp = output_box_ref.imp();
|
|
||||||
// TODO handle default mapping
|
|
||||||
// output_box_imp.resetVolumePercentage.set_text();
|
|
||||||
// output_box_imp.resetVolumeSlider.let
|
|
||||||
for stream in sinks {
|
|
||||||
let entry = ListEntry::new(&AudioSourceEntry::new(
|
|
||||||
stream.name,
|
|
||||||
stream.volume,
|
|
||||||
stream.muted,
|
|
||||||
stream.index,
|
|
||||||
));
|
|
||||||
entry.set_activatable(false);
|
|
||||||
output_box_imp.resetSinks.append(&entry);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn populate_streams(listeners: Arc<Listeners>, output_box: Arc<AudioBox>) {
|
|
||||||
// TODO add listener
|
|
||||||
let output_box_ref = output_box.clone();
|
|
||||||
// let output_box_ref_listener = output_box.clone();
|
|
||||||
let output_box_imp = output_box.imp();
|
|
||||||
// let sources = output_box_imp.resetSinks.clone();
|
|
||||||
// let output_streams = output_box_imp.resetInputStreams.clone();
|
|
||||||
|
|
||||||
gio::spawn_blocking(move || {
|
|
||||||
let streams = get_input_streams();
|
|
||||||
glib::spawn_future(async move {
|
|
||||||
glib::idle_add_once(move || {
|
|
||||||
let output_box_imp = output_box_ref.imp();
|
|
||||||
for stream in streams {
|
|
||||||
let entry = ListEntry::new(&AudioSourceEntry::new(
|
|
||||||
stream.name,
|
|
||||||
stream.volume,
|
|
||||||
stream.muted,
|
|
||||||
stream.index,
|
|
||||||
));
|
|
||||||
entry.set_activatable(false);
|
|
||||||
output_box_imp.resetOutputStreams.append(&entry);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_input_streams() -> Vec<InputStream> {
|
|
||||||
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<InputStream>,), Error> =
|
|
||||||
proxy.method_call("org.xetibo.ReSet", "ListInputStreams", ());
|
|
||||||
if res.is_err() {
|
|
||||||
return Vec::new();
|
|
||||||
}
|
|
||||||
res.unwrap().0
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_sinks() -> Vec<Sink> {
|
|
||||||
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<Sink>,), Error> = proxy.method_call("org.xetibo.ReSet", "ListSinks", ());
|
|
||||||
if res.is_err() {
|
|
||||||
return Vec::new();
|
|
||||||
}
|
|
||||||
res.unwrap().0
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_default_sink() -> Option<Sink> {
|
|
||||||
let conn = Connection::new_session().unwrap();
|
|
||||||
let proxy = conn.with_proxy(
|
|
||||||
"org.xetibo.ReSet",
|
|
||||||
"/org/xetibo/ReSet",
|
|
||||||
Duration::from_millis(1000),
|
|
||||||
);
|
|
||||||
let res: Result<(Sink,), Error> = proxy.method_call("org.xetibo.ReSet", "GetDefaultSink", ());
|
|
||||||
if res.is_err() {
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
Some(res.unwrap().0)
|
|
||||||
}
|
|
|
@ -1,34 +0,0 @@
|
||||||
use crate::components::output::audioSourceImpl;
|
|
||||||
use adw::glib;
|
|
||||||
use adw::glib::Object;
|
|
||||||
use glib::subclass::types::ObjectSubclassIsExt;
|
|
||||||
|
|
||||||
glib::wrapper! {
|
|
||||||
pub struct AudioSourceEntry(ObjectSubclass<audioSourceImpl::AudioSourceEntry>)
|
|
||||||
@extends gtk::Box, gtk::Widget,
|
|
||||||
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl AudioSourceEntry {
|
|
||||||
pub fn new(name: String, volume: Vec<u32>, muted: bool, index: u32) -> Self {
|
|
||||||
let obj: Self = Object::builder().build();
|
|
||||||
// TODO use event callback for progress bar -> this is the "im speaking" indicator
|
|
||||||
// TODO map the slider to volume
|
|
||||||
// TODO properly use volume fraction
|
|
||||||
// TODO map mute to callback
|
|
||||||
// TODO map dropdown
|
|
||||||
{
|
|
||||||
let imp = obj.imp();
|
|
||||||
imp.associatedIndex.set(index);
|
|
||||||
imp.isMuted.set(muted);
|
|
||||||
let mut volume_borrow = imp.volume.borrow_mut();
|
|
||||||
*volume_borrow = volume;
|
|
||||||
imp.resetSourceName.set_text(name.as_str());
|
|
||||||
let fraction = (volume_borrow.first().unwrap_or_else(|| &(0 as u32)) / 100) as f64;
|
|
||||||
imp.resetVolumeMeter.set_fraction(fraction);
|
|
||||||
let percentage = (fraction * 100 as f64).to_string();
|
|
||||||
imp.resetVolumePercentage.set_text(&percentage);
|
|
||||||
}
|
|
||||||
obj
|
|
||||||
}
|
|
||||||
}
|
|
109
src/components/output/inputStreamEntry.rs
Normal file
109
src/components/output/inputStreamEntry.rs
Normal file
|
@ -0,0 +1,109 @@
|
||||||
|
use std::cell::RefCell;
|
||||||
|
use std::sync::Arc;
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
|
use adw::glib;
|
||||||
|
use adw::glib::Object;
|
||||||
|
use adw::prelude::{ButtonExt, RangeExt};
|
||||||
|
use dbus::blocking::Connection;
|
||||||
|
use dbus::Error;
|
||||||
|
use glib::subclass::types::ObjectSubclassIsExt;
|
||||||
|
use glib::subclass::ObjectImplRef;
|
||||||
|
use glib::{clone, Propagation};
|
||||||
|
use ReSet_Lib::audio::audio::InputStream;
|
||||||
|
|
||||||
|
use super::inputStreamEntryImpl;
|
||||||
|
|
||||||
|
glib::wrapper! {
|
||||||
|
pub struct InputStreamEntry(ObjectSubclass<inputStreamEntryImpl::InputStreamEntry>)
|
||||||
|
@extends gtk::Box, gtk::Widget,
|
||||||
|
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl InputStreamEntry {
|
||||||
|
pub fn new(stream: InputStream) -> Self {
|
||||||
|
let obj: Self = Object::builder().build();
|
||||||
|
// TODO use event callback for progress bar -> this is the "im speaking" indicator
|
||||||
|
// TODO map dropdown
|
||||||
|
{
|
||||||
|
let imp = obj.imp();
|
||||||
|
if stream.muted {
|
||||||
|
imp.resetSinkMute
|
||||||
|
.set_icon_name("audio-volume-muted-symbolic");
|
||||||
|
} else {
|
||||||
|
imp.resetSinkMute
|
||||||
|
.set_icon_name("audio-volume-high-symbolic");
|
||||||
|
}
|
||||||
|
let name = stream.application_name.clone() + ": " + stream.name.as_str();
|
||||||
|
imp.resetSinkName.set_text(name.as_str());
|
||||||
|
let volume = stream.volume.first().unwrap_or_else(|| &(0 as u32));
|
||||||
|
let fraction = (*volume as f64 / 655.36).round();
|
||||||
|
let percentage = (fraction).to_string() + "%";
|
||||||
|
imp.resetVolumePercentage.set_text(&percentage);
|
||||||
|
imp.resetVolumeSlider.set_value(*volume as f64);
|
||||||
|
imp.stream.replace(stream);
|
||||||
|
imp.resetVolumeSlider.connect_change_value(
|
||||||
|
clone!(@weak imp => @default-return Propagation::Stop, move |_, _, value| {
|
||||||
|
let fraction = (value / 655.36).round();
|
||||||
|
let percentage = (fraction).to_string() + "%";
|
||||||
|
imp.resetVolumePercentage.set_text(&percentage);
|
||||||
|
let stream = imp.stream.borrow();
|
||||||
|
let index = stream.index;
|
||||||
|
let channels = stream.channels;
|
||||||
|
set_inputstream_volume(value, index, channels);
|
||||||
|
Propagation::Proceed
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
imp.resetSinkMute
|
||||||
|
.connect_clicked(clone!(@weak imp => move |_| {
|
||||||
|
let stream = imp.stream.clone();
|
||||||
|
let mut stream = stream.borrow_mut();
|
||||||
|
stream.muted = !stream.muted;
|
||||||
|
let muted = stream.muted;
|
||||||
|
let index = stream.index;
|
||||||
|
if muted {
|
||||||
|
imp.resetSinkMute
|
||||||
|
.set_icon_name("audio-volume-muted-symbolic");
|
||||||
|
} else {
|
||||||
|
imp.resetSinkMute
|
||||||
|
.set_icon_name("audio-volume-high-symbolic");
|
||||||
|
}
|
||||||
|
toggle_input_stream_mute(index, muted);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
obj
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_inputstream_volume(value: f64, index: u32, channels: u16) -> bool {
|
||||||
|
let conn = Connection::new_session().unwrap();
|
||||||
|
let proxy = conn.with_proxy(
|
||||||
|
"org.xetibo.ReSet",
|
||||||
|
"/org/xetibo/ReSet",
|
||||||
|
Duration::from_millis(1000),
|
||||||
|
);
|
||||||
|
let res: Result<(bool,), Error> = proxy.method_call(
|
||||||
|
"org.xetibo.ReSet",
|
||||||
|
"SetInputStreamVolume",
|
||||||
|
(index, channels, value as u32),
|
||||||
|
);
|
||||||
|
if res.is_err() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
res.unwrap().0
|
||||||
|
}
|
||||||
|
|
||||||
|
fn toggle_input_stream_mute(index: u32, muted: bool) -> bool {
|
||||||
|
let conn = Connection::new_session().unwrap();
|
||||||
|
let proxy = conn.with_proxy(
|
||||||
|
"org.xetibo.ReSet",
|
||||||
|
"/org/xetibo/ReSet",
|
||||||
|
Duration::from_millis(1000),
|
||||||
|
);
|
||||||
|
let res: Result<(bool,), Error> =
|
||||||
|
proxy.method_call("org.xetibo.ReSet", "SetInputStreamMute", (index, muted));
|
||||||
|
if res.is_err() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
res.unwrap().0
|
||||||
|
}
|
|
@ -1,21 +1,29 @@
|
||||||
use gtk::{Button, CompositeTemplate, glib, Label, ProgressBar, Scale};
|
use std::cell::RefCell;
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
use gtk::subclass::prelude::*;
|
use gtk::subclass::prelude::*;
|
||||||
use crate::components::input::inputStreamEntry;
|
use gtk::{glib, Button, CompositeTemplate, DropDown, Label, ProgressBar, Scale};
|
||||||
|
use ReSet_Lib::audio::audio::InputStream;
|
||||||
|
|
||||||
|
use super::inputStreamEntry;
|
||||||
|
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
#[derive(Default, CompositeTemplate)]
|
#[derive(Default, CompositeTemplate)]
|
||||||
#[template(resource = "/org/Xetibo/ReSet/resetInputStreamEntry.ui")]
|
#[template(resource = "/org/Xetibo/ReSet/resetInputStreamEntry.ui")]
|
||||||
pub struct InputStreamEntry {
|
pub struct InputStreamEntry {
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetSourceName: TemplateChild<Label>,
|
pub resetSinkName: TemplateChild<Label>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetSourceMute: TemplateChild<Button>,
|
pub resetSelectedSink: TemplateChild<DropDown>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetSinkMute: TemplateChild<Button>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetVolumeSlider: TemplateChild<Scale>,
|
pub resetVolumeSlider: TemplateChild<Scale>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetVolumePercentage: TemplateChild<Label>,
|
pub resetVolumePercentage: TemplateChild<Label>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetVolumeMeter: TemplateChild<ProgressBar>,
|
pub resetVolumeMeter: TemplateChild<ProgressBar>,
|
||||||
|
pub stream: Arc<RefCell<InputStream>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[glib::object_subclass]
|
#[glib::object_subclass]
|
||||||
|
@ -37,4 +45,4 @@ impl BoxImpl for InputStreamEntry {}
|
||||||
|
|
||||||
impl ObjectImpl for InputStreamEntry {}
|
impl ObjectImpl for InputStreamEntry {}
|
||||||
|
|
||||||
impl WidgetImpl for InputStreamEntry {}
|
impl WidgetImpl for InputStreamEntry {}
|
|
@ -1,5 +1,7 @@
|
||||||
#![allow(non_snake_case)]
|
#![allow(non_snake_case)]
|
||||||
pub mod audioSource;
|
pub mod sinkBox;
|
||||||
pub mod audioBox;
|
pub mod sinkBoxImpl;
|
||||||
pub mod audioBoxImpl;
|
pub mod inputStreamEntry;
|
||||||
pub mod audioSourceImpl;
|
pub mod inputStreamEntryImpl;
|
||||||
|
pub mod sinkEntry;
|
||||||
|
pub mod sinkEntryImpl;
|
||||||
|
|
188
src/components/output/sinkBox.rs
Normal file
188
src/components/output/sinkBox.rs
Normal file
|
@ -0,0 +1,188 @@
|
||||||
|
use std::sync::Arc;
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
|
use crate::components::base::listEntry::ListEntry;
|
||||||
|
use crate::components::base::utils::Listeners;
|
||||||
|
use crate::components::output::sinkEntry::set_sink_volume;
|
||||||
|
use adw::glib::Object;
|
||||||
|
use adw::prelude::{BoxExt, ButtonExt, RangeExt};
|
||||||
|
use adw::{glib, prelude::ListBoxRowExt};
|
||||||
|
use dbus::blocking::Connection;
|
||||||
|
use dbus::Error;
|
||||||
|
use glib::subclass::prelude::ObjectSubclassIsExt;
|
||||||
|
use glib::{clone, Propagation, Variant};
|
||||||
|
use gtk::gio;
|
||||||
|
use gtk::prelude::ActionableExt;
|
||||||
|
use ReSet_Lib::audio::audio::{InputStream, Sink};
|
||||||
|
|
||||||
|
use super::inputStreamEntry::InputStreamEntry;
|
||||||
|
use super::sinkBoxImpl;
|
||||||
|
use super::sinkEntry::{toggle_sink_mute, SinkEntry};
|
||||||
|
|
||||||
|
glib::wrapper! {
|
||||||
|
pub struct SinkBox(ObjectSubclass<sinkBoxImpl::SinkBox>)
|
||||||
|
@extends gtk::Box, gtk::Widget,
|
||||||
|
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe impl Send for SinkBox {}
|
||||||
|
unsafe impl Sync for SinkBox {}
|
||||||
|
|
||||||
|
impl SinkBox {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Object::builder().build()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn setupCallbacks(&self) {
|
||||||
|
let selfImp = self.imp();
|
||||||
|
selfImp
|
||||||
|
.resetSinksRow
|
||||||
|
.set_action_name(Some("navigation.push"));
|
||||||
|
selfImp
|
||||||
|
.resetSinksRow
|
||||||
|
.set_action_target_value(Some(&Variant::from("outputDevices")));
|
||||||
|
|
||||||
|
selfImp
|
||||||
|
.resetInputStreamButton
|
||||||
|
.set_action_name(Some("navigation.pop"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn populate_sinks(output_box: Arc<SinkBox>) {
|
||||||
|
gio::spawn_blocking(move || {
|
||||||
|
let output_box_ref = output_box.clone();
|
||||||
|
{
|
||||||
|
let output_box_imp = output_box.imp();
|
||||||
|
output_box_imp.resetDefaultSink.replace(get_default_sink());
|
||||||
|
}
|
||||||
|
let sinks = get_sinks();
|
||||||
|
glib::spawn_future(async move {
|
||||||
|
glib::idle_add_once(move || {
|
||||||
|
// TODO handle default mapping
|
||||||
|
let output_box_ref_slider = output_box.clone();
|
||||||
|
let output_box_ref_mute = output_box.clone();
|
||||||
|
{
|
||||||
|
let output_box_imp = output_box_ref.imp();
|
||||||
|
let default_sink = output_box_imp.resetDefaultSink.clone(); // Clone outside closure
|
||||||
|
let sink = default_sink.borrow(); //
|
||||||
|
|
||||||
|
let volume = sink.volume.first().unwrap_or_else(|| &(0 as u32));
|
||||||
|
let fraction = (*volume as f64 / 655.36).round();
|
||||||
|
let percentage = (fraction).to_string() + "%";
|
||||||
|
output_box_imp.resetVolumePercentage.set_text(&percentage);
|
||||||
|
output_box_imp.resetVolumeSlider.set_value(*volume as f64);
|
||||||
|
for stream in sinks {
|
||||||
|
// TODO create sink handler -> currently only allows input streams
|
||||||
|
let mut is_default = false;
|
||||||
|
if output_box_imp.resetDefaultSink.borrow().name == stream.name {
|
||||||
|
is_default = true;
|
||||||
|
}
|
||||||
|
let entry = ListEntry::new(&SinkEntry::new(is_default, output_box_imp.resetDefaultCheckButton.clone(), stream));
|
||||||
|
entry.set_activatable(false);
|
||||||
|
output_box_imp.resetSinks.append(&entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
output_box_ref
|
||||||
|
.imp()
|
||||||
|
.resetVolumeSlider
|
||||||
|
.connect_change_value(move |_, _, value| {
|
||||||
|
let imp = output_box_ref_slider.imp();
|
||||||
|
let fraction = (value / 655.36).round();
|
||||||
|
println!("{fraction}");
|
||||||
|
let percentage = (fraction).to_string() + "%";
|
||||||
|
imp.resetVolumePercentage.set_text(&percentage);
|
||||||
|
let sink = imp.resetDefaultSink.borrow();
|
||||||
|
let index = sink.index;
|
||||||
|
let channels = sink.channels;
|
||||||
|
set_sink_volume(value, index, channels);
|
||||||
|
Propagation::Proceed
|
||||||
|
});
|
||||||
|
output_box_ref
|
||||||
|
.imp()
|
||||||
|
.resetSinkMute
|
||||||
|
.connect_clicked(move |_| {
|
||||||
|
let imp = output_box_ref_mute.imp();
|
||||||
|
let stream = imp.resetDefaultSink.clone();
|
||||||
|
let mut stream = stream.borrow_mut();
|
||||||
|
stream.muted = !stream.muted;
|
||||||
|
let muted = stream.muted;
|
||||||
|
let index = stream.index;
|
||||||
|
if muted {
|
||||||
|
imp.resetSinkMute
|
||||||
|
.set_icon_name("audio-volume-muted-symbolic");
|
||||||
|
} else {
|
||||||
|
imp.resetSinkMute
|
||||||
|
.set_icon_name("audio-volume-high-symbolic");
|
||||||
|
}
|
||||||
|
toggle_sink_mute(index, muted);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn populate_inputstreams(listeners: Arc<Listeners>, output_box: Arc<SinkBox>) {
|
||||||
|
// TODO add listener
|
||||||
|
let output_box_ref = output_box.clone();
|
||||||
|
// let output_box_ref_listener = output_box.clone();
|
||||||
|
let output_box_imp = output_box.imp();
|
||||||
|
// let sources = output_box_imp.resetSinks.clone();
|
||||||
|
// let output_streams = output_box_imp.resetInputStreams.clone();
|
||||||
|
|
||||||
|
gio::spawn_blocking(move || {
|
||||||
|
let streams = get_input_streams();
|
||||||
|
glib::spawn_future(async move {
|
||||||
|
glib::idle_add_once(move || {
|
||||||
|
let output_box_imp = output_box_ref.imp();
|
||||||
|
for stream in streams {
|
||||||
|
let entry = ListEntry::new(&InputStreamEntry::new(stream));
|
||||||
|
entry.set_activatable(false);
|
||||||
|
output_box_imp.resetInputStreams.append(&entry);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_input_streams() -> Vec<InputStream> {
|
||||||
|
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<InputStream>,), Error> =
|
||||||
|
proxy.method_call("org.xetibo.ReSet", "ListInputStreams", ());
|
||||||
|
if res.is_err() {
|
||||||
|
return Vec::new();
|
||||||
|
}
|
||||||
|
res.unwrap().0
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_sinks() -> Vec<Sink> {
|
||||||
|
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<Sink>,), Error> = proxy.method_call("org.xetibo.ReSet", "ListSinks", ());
|
||||||
|
if res.is_err() {
|
||||||
|
return Vec::new();
|
||||||
|
}
|
||||||
|
res.unwrap().0
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_default_sink() -> Sink {
|
||||||
|
let conn = Connection::new_session().unwrap();
|
||||||
|
let proxy = conn.with_proxy(
|
||||||
|
"org.xetibo.ReSet",
|
||||||
|
"/org/xetibo/ReSet",
|
||||||
|
Duration::from_millis(1000),
|
||||||
|
);
|
||||||
|
let res: Result<(Sink,), Error> = proxy.method_call("org.xetibo.ReSet", "GetDefaultSink", ());
|
||||||
|
if res.is_err() {
|
||||||
|
return Sink::default();
|
||||||
|
}
|
||||||
|
res.unwrap().0
|
||||||
|
}
|
|
@ -2,21 +2,23 @@ use std::cell::RefCell;
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
|
|
||||||
use crate::components::base::listEntry::ListEntry;
|
use crate::components::base::listEntry::ListEntry;
|
||||||
use crate::components::output::audioBox;
|
use crate::components::output::inputStreamEntry::InputStreamEntry;
|
||||||
use crate::components::output::audioSource::AudioSourceEntry;
|
|
||||||
use gtk::subclass::prelude::*;
|
use gtk::subclass::prelude::*;
|
||||||
use gtk::{glib, Box, Button, CompositeTemplate, DropDown, Label, TemplateChild};
|
use gtk::{glib, Box, Button, CompositeTemplate, DropDown, Label, TemplateChild, CheckButton};
|
||||||
use gtk::{prelude::*, ProgressBar, Scale};
|
use gtk::{prelude::*, ProgressBar, Scale};
|
||||||
use ReSet_Lib::audio::audio::{InputStream, Sink};
|
use ReSet_Lib::audio::audio::{InputStream, Sink};
|
||||||
|
|
||||||
|
use super::sinkBox;
|
||||||
|
use super::sinkEntry::SinkEntry;
|
||||||
|
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
#[derive(Default, CompositeTemplate)]
|
#[derive(Default, CompositeTemplate)]
|
||||||
#[template(resource = "/org/Xetibo/ReSet/resetAudio.ui")]
|
#[template(resource = "/org/Xetibo/ReSet/resetAudioOutput.ui")]
|
||||||
pub struct AudioBox {
|
pub struct SinkBox {
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetSinksRow: TemplateChild<ListEntry>,
|
pub resetSinksRow: TemplateChild<ListEntry>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetOutputDevice: TemplateChild<DropDown>,
|
pub resetInputDevice: TemplateChild<DropDown>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetSinkMute: TemplateChild<Button>,
|
pub resetSinkMute: TemplateChild<Button>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
|
@ -28,22 +30,24 @@ pub struct AudioBox {
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetSinks: TemplateChild<Box>,
|
pub resetSinks: TemplateChild<Box>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetOutputStreamButton: TemplateChild<ListEntry>,
|
pub resetInputStreamButton: TemplateChild<ListEntry>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetOutputStreams: TemplateChild<Box>,
|
pub resetInputStreams: TemplateChild<Box>,
|
||||||
pub resetDefaultSink: RefCell<Option<Sink>>,
|
pub resetDefaultCheckButton: Arc<CheckButton>,
|
||||||
|
pub resetDefaultSink: Arc<RefCell<Sink>>,
|
||||||
pub resetSinkList: Arc<Mutex<Vec<Sink>>>,
|
pub resetSinkList: Arc<Mutex<Vec<Sink>>>,
|
||||||
pub resetInputStreamList: Arc<Mutex<Vec<InputStream>>>,
|
pub resetInputStreamList: Arc<Mutex<Vec<InputStream>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[glib::object_subclass]
|
#[glib::object_subclass]
|
||||||
impl ObjectSubclass for AudioBox {
|
impl ObjectSubclass for SinkBox {
|
||||||
const NAME: &'static str = "resetAudio";
|
const NAME: &'static str = "resetAudioOutput";
|
||||||
type Type = audioBox::AudioBox;
|
type Type = sinkBox::SinkBox;
|
||||||
type ParentType = gtk::Box;
|
type ParentType = gtk::Box;
|
||||||
|
|
||||||
fn class_init(klass: &mut Self::Class) {
|
fn class_init(klass: &mut Self::Class) {
|
||||||
AudioSourceEntry::ensure_type();
|
InputStreamEntry::ensure_type();
|
||||||
|
SinkEntry::ensure_type();
|
||||||
ListEntry::ensure_type();
|
ListEntry::ensure_type();
|
||||||
klass.bind_template();
|
klass.bind_template();
|
||||||
}
|
}
|
||||||
|
@ -53,19 +57,19 @@ impl ObjectSubclass for AudioBox {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl BoxImpl for AudioBox {}
|
impl BoxImpl for SinkBox {}
|
||||||
|
|
||||||
impl ObjectImpl for AudioBox {
|
impl ObjectImpl for SinkBox {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
let obj = self.obj();
|
let obj = self.obj();
|
||||||
obj.setupCallbacks();
|
obj.setupCallbacks();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ListBoxRowImpl for AudioBox {}
|
impl ListBoxRowImpl for SinkBox {}
|
||||||
|
|
||||||
impl WidgetImpl for AudioBox {}
|
impl WidgetImpl for SinkBox {}
|
||||||
|
|
||||||
impl WindowImpl for AudioBox {}
|
impl WindowImpl for SinkBox {}
|
||||||
|
|
||||||
impl ApplicationWindowImpl for AudioBox {}
|
impl ApplicationWindowImpl for SinkBox {}
|
133
src/components/output/sinkEntry.rs
Normal file
133
src/components/output/sinkEntry.rs
Normal file
|
@ -0,0 +1,133 @@
|
||||||
|
use std::sync::Arc;
|
||||||
|
use std::thread;
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
|
use adw::glib;
|
||||||
|
use adw::glib::Object;
|
||||||
|
use adw::prelude::{ButtonExt, CheckButtonExt, RangeExt};
|
||||||
|
use dbus::blocking::Connection;
|
||||||
|
use dbus::Error;
|
||||||
|
use glib::subclass::types::ObjectSubclassIsExt;
|
||||||
|
use glib::{clone, Propagation};
|
||||||
|
use gtk::CheckButton;
|
||||||
|
use ReSet_Lib::audio::audio::Sink;
|
||||||
|
|
||||||
|
use super::sinkEntryImpl;
|
||||||
|
|
||||||
|
glib::wrapper! {
|
||||||
|
pub struct SinkEntry(ObjectSubclass<sinkEntryImpl::SinkEntry>)
|
||||||
|
@extends gtk::Box, gtk::Widget,
|
||||||
|
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl SinkEntry {
|
||||||
|
pub fn new(is_default: bool, check_group: Arc<CheckButton>, stream: Sink) -> Self {
|
||||||
|
let obj: Self = Object::builder().build();
|
||||||
|
// TODO use event callback for progress bar -> this is the "im speaking" indicator
|
||||||
|
// TODO map dropdown
|
||||||
|
{
|
||||||
|
let imp = obj.imp();
|
||||||
|
imp.resetSinkName.set_text(stream.name.clone().as_str());
|
||||||
|
let name = Arc::new(stream.name.clone());
|
||||||
|
let volume = stream.volume.first().unwrap_or_else(|| &(0 as u32));
|
||||||
|
let fraction = (*volume as f64 / 655.36).round();
|
||||||
|
let percentage = (fraction).to_string() + "%";
|
||||||
|
imp.resetVolumePercentage.set_text(&percentage);
|
||||||
|
imp.resetVolumeSlider.set_value(*volume as f64);
|
||||||
|
imp.stream.replace(stream);
|
||||||
|
imp.resetVolumeSlider.connect_change_value(
|
||||||
|
clone!(@weak imp => @default-return Propagation::Stop, move |_, _, value| {
|
||||||
|
let fraction = (value / 655.36).round();
|
||||||
|
println!("{fraction}");
|
||||||
|
let percentage = (fraction).to_string() + "%";
|
||||||
|
imp.resetVolumePercentage.set_text(&percentage);
|
||||||
|
let sink = imp.stream.borrow();
|
||||||
|
let index = sink.index;
|
||||||
|
let channels = sink.channels;
|
||||||
|
set_sink_volume(value, index, channels);
|
||||||
|
Propagation::Proceed
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
imp.resetSelectedSink.set_group(Some(&*check_group));
|
||||||
|
// check_group.set_group(Some(&*imp.resetSelectedSink));
|
||||||
|
if is_default {
|
||||||
|
imp.resetSelectedSink.set_active(true);
|
||||||
|
} else {
|
||||||
|
imp.resetSelectedSink.set_active(false);
|
||||||
|
}
|
||||||
|
imp.resetSelectedSink.connect_toggled(move |button| {
|
||||||
|
if button.is_active() {
|
||||||
|
set_default_sink(name.clone());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
imp.resetSinkMute
|
||||||
|
.connect_clicked(clone!(@weak imp => move |_| {
|
||||||
|
let stream = imp.stream.clone();
|
||||||
|
let mut stream = stream.borrow_mut();
|
||||||
|
stream.muted = !stream.muted;
|
||||||
|
let muted = stream.muted;
|
||||||
|
let index = stream.index;
|
||||||
|
if muted {
|
||||||
|
imp.resetSinkMute
|
||||||
|
.set_icon_name("audio-volume-muted-symbolic");
|
||||||
|
} else {
|
||||||
|
imp.resetSinkMute
|
||||||
|
.set_icon_name("audio-volume-high-symbolic");
|
||||||
|
}
|
||||||
|
toggle_sink_mute(index, muted);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
obj
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_sink_volume(value: f64, index: u32, channels: u16) -> bool {
|
||||||
|
let conn = Connection::new_session().unwrap();
|
||||||
|
let proxy = conn.with_proxy(
|
||||||
|
"org.xetibo.ReSet",
|
||||||
|
"/org/xetibo/ReSet",
|
||||||
|
Duration::from_millis(1000),
|
||||||
|
);
|
||||||
|
let res: Result<(bool,), Error> = proxy.method_call(
|
||||||
|
"org.xetibo.ReSet",
|
||||||
|
"SetSinkVolume",
|
||||||
|
(index, channels, value as u32),
|
||||||
|
);
|
||||||
|
if res.is_err() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
res.unwrap().0
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn toggle_sink_mute(index: u32, muted: bool) -> bool {
|
||||||
|
let conn = Connection::new_session().unwrap();
|
||||||
|
let proxy = conn.with_proxy(
|
||||||
|
"org.xetibo.ReSet",
|
||||||
|
"/org/xetibo/ReSet",
|
||||||
|
Duration::from_millis(1000),
|
||||||
|
);
|
||||||
|
let res: Result<(bool,), Error> =
|
||||||
|
proxy.method_call("org.xetibo.ReSet", "SetSinkMute", (index, muted));
|
||||||
|
if res.is_err() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
res.unwrap().0
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_default_sink(name: Arc<String>) {
|
||||||
|
thread::spawn(move || {
|
||||||
|
dbg!(name.clone());
|
||||||
|
let conn = Connection::new_session().unwrap();
|
||||||
|
let proxy = conn.with_proxy(
|
||||||
|
"org.xetibo.ReSet",
|
||||||
|
"/org/xetibo/ReSet",
|
||||||
|
Duration::from_millis(1000),
|
||||||
|
);
|
||||||
|
let res: Result<(bool,), Error> =
|
||||||
|
proxy.method_call("org.xetibo.ReSet", "SetDefaultSink", (name.as_str(),));
|
||||||
|
if res.is_err() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// handle change
|
||||||
|
});
|
||||||
|
}
|
47
src/components/output/sinkEntryImpl.rs
Normal file
47
src/components/output/sinkEntryImpl.rs
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
use std::cell::RefCell;
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
use crate::components::output::sinkEntry;
|
||||||
|
use gtk::subclass::prelude::*;
|
||||||
|
use gtk::{glib, Button, CompositeTemplate, DropDown, Label, ProgressBar, Scale, CheckButton};
|
||||||
|
use ReSet_Lib::audio::audio::Sink;
|
||||||
|
|
||||||
|
#[allow(non_snake_case)]
|
||||||
|
#[derive(Default, CompositeTemplate)]
|
||||||
|
#[template(resource = "/org/Xetibo/ReSet/resetSinkEntry.ui")]
|
||||||
|
pub struct SinkEntry {
|
||||||
|
#[template_child]
|
||||||
|
pub resetSinkName: TemplateChild<Label>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetSelectedSink: TemplateChild<CheckButton>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetSinkMute: TemplateChild<Button>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetVolumeSlider: TemplateChild<Scale>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetVolumePercentage: TemplateChild<Label>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetVolumeMeter: TemplateChild<ProgressBar>,
|
||||||
|
pub stream: Arc<RefCell<Sink>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[glib::object_subclass]
|
||||||
|
impl ObjectSubclass for SinkEntry {
|
||||||
|
const NAME: &'static str = "resetSinkEntry";
|
||||||
|
type Type = sinkEntry::SinkEntry;
|
||||||
|
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 SinkEntry {}
|
||||||
|
|
||||||
|
impl ObjectImpl for SinkEntry {}
|
||||||
|
|
||||||
|
impl WidgetImpl for SinkEntry {}
|
|
@ -5,8 +5,8 @@ use std::sync::Arc;
|
||||||
use crate::components::base::settingBox::SettingBox;
|
use crate::components::base::settingBox::SettingBox;
|
||||||
use crate::components::base::utils::Listeners;
|
use crate::components::base::utils::Listeners;
|
||||||
use crate::components::bluetooth::bluetoothBox::BluetoothBox;
|
use crate::components::bluetooth::bluetoothBox::BluetoothBox;
|
||||||
use crate::components::input::sourceBox::SourceBox;
|
use crate::components::input::sourceBox::{SourceBox, populate_outputstreams, populate_sources};
|
||||||
use crate::components::output::audioBox::{populate_streams, AudioBox, populate_sinks};
|
use crate::components::output::sinkBox::{SinkBox, populate_inputstreams, populate_sinks};
|
||||||
use crate::components::wifi::wifiBox::{scanForWifi, show_stored_connections, WifiBox};
|
use crate::components::wifi::wifiBox::{scanForWifi, show_stored_connections, WifiBox};
|
||||||
use gtk::prelude::WidgetExt;
|
use gtk::prelude::WidgetExt;
|
||||||
use gtk::{FlowBox, Frame, Label};
|
use gtk::{FlowBox, Frame, Label};
|
||||||
|
@ -63,11 +63,14 @@ pub const HANDLE_AUDIO_CLICK: fn(Arc<Listeners>, FlowBox) =
|
||||||
listeners.stop_network_listener();
|
listeners.stop_network_listener();
|
||||||
listeners.bluetooth_listener.store(false, Ordering::SeqCst);
|
listeners.bluetooth_listener.store(false, Ordering::SeqCst);
|
||||||
listeners.pulse_listener.store(true, Ordering::SeqCst);
|
listeners.pulse_listener.store(true, Ordering::SeqCst);
|
||||||
let audioOutput = Arc::new(AudioBox::new());
|
let audioOutput = Arc::new(SinkBox::new());
|
||||||
populate_streams(listeners.clone(), audioOutput.clone());
|
populate_inputstreams(listeners.clone(), audioOutput.clone());
|
||||||
populate_sinks(audioOutput.clone());
|
populate_sinks(audioOutput.clone());
|
||||||
let audioFrame = wrapInFrame(SettingBox::new(&*audioOutput));
|
let audioFrame = wrapInFrame(SettingBox::new(&*audioOutput));
|
||||||
let sourceFrame = wrapInFrame(SettingBox::new(&SourceBox::new()));
|
let audioInput = Arc::new(SourceBox::new());
|
||||||
|
populate_outputstreams(listeners.clone(), audioInput.clone());
|
||||||
|
populate_sources(audioInput.clone());
|
||||||
|
let sourceFrame = wrapInFrame(SettingBox::new(&*audioInput));
|
||||||
resetMain.remove_all();
|
resetMain.remove_all();
|
||||||
resetMain.insert(&audioFrame, -1);
|
resetMain.insert(&audioFrame, -1);
|
||||||
resetMain.insert(&sourceFrame, -1);
|
resetMain.insert(&sourceFrame, -1);
|
||||||
|
@ -79,8 +82,8 @@ pub const HANDLE_VOLUME_CLICK: fn(Arc<Listeners>, FlowBox) =
|
||||||
listeners.stop_network_listener();
|
listeners.stop_network_listener();
|
||||||
listeners.bluetooth_listener.store(false, Ordering::SeqCst);
|
listeners.bluetooth_listener.store(false, Ordering::SeqCst);
|
||||||
listeners.pulse_listener.store(false, Ordering::SeqCst);
|
listeners.pulse_listener.store(false, Ordering::SeqCst);
|
||||||
let audioOutput = Arc::new(AudioBox::new());
|
let audioOutput = Arc::new(SinkBox::new());
|
||||||
populate_streams(listeners.clone(), audioOutput.clone());
|
populate_inputstreams(listeners.clone(), audioOutput.clone());
|
||||||
populate_sinks(audioOutput.clone());
|
populate_sinks(audioOutput.clone());
|
||||||
let audioFrame = wrapInFrame(SettingBox::new(&*audioOutput));
|
let audioFrame = wrapInFrame(SettingBox::new(&*audioOutput));
|
||||||
resetMain.remove_all();
|
resetMain.remove_all();
|
||||||
|
@ -93,7 +96,10 @@ pub const HANDLE_MICROPHONE_CLICK: fn(Arc<Listeners>, FlowBox) =
|
||||||
listeners.stop_network_listener();
|
listeners.stop_network_listener();
|
||||||
listeners.bluetooth_listener.store(false, Ordering::SeqCst);
|
listeners.bluetooth_listener.store(false, Ordering::SeqCst);
|
||||||
listeners.pulse_listener.store(false, Ordering::SeqCst);
|
listeners.pulse_listener.store(false, Ordering::SeqCst);
|
||||||
let sourceFrame = wrapInFrame(SettingBox::new(&SourceBox::new()));
|
let audioInput = Arc::new(SourceBox::new());
|
||||||
|
populate_outputstreams(listeners.clone(), audioInput.clone());
|
||||||
|
populate_sources(audioInput.clone());
|
||||||
|
let sourceFrame = wrapInFrame(SettingBox::new(&*audioInput));
|
||||||
resetMain.remove_all();
|
resetMain.remove_all();
|
||||||
resetMain.insert(&sourceFrame, -1);
|
resetMain.insert(&sourceFrame, -1);
|
||||||
resetMain.set_max_children_per_line(1);
|
resetMain.set_max_children_per_line(1);
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<interface>
|
<interface>
|
||||||
<requires lib="gtk" version="4.12"/>
|
<requires lib="gtk" version="4.12"/>
|
||||||
<requires lib="libadwaita" version="1.4"/>
|
<requires lib="libadwaita" version="1.4"/>
|
||||||
<template class="resetMicrophone" parent="GtkBox">
|
<template class="resetAudioInput" parent="GtkBox">
|
||||||
<property name="orientation">vertical</property>
|
<property name="orientation">vertical</property>
|
||||||
<property name="valign">start</property>
|
<property name="valign">start</property>
|
||||||
<child>
|
<child>
|
||||||
|
@ -63,7 +63,7 @@
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkBox" id="resetDefaultSource">
|
<object class="GtkBox">
|
||||||
<property name="margin-bottom">10</property>
|
<property name="margin-bottom">10</property>
|
||||||
<property name="margin-end">5</property>
|
<property name="margin-end">5</property>
|
||||||
<property name="margin-start">5</property>
|
<property name="margin-start">5</property>
|
||||||
|
@ -84,8 +84,9 @@
|
||||||
<object class="GtkScale" id="resetVolumeSlider">
|
<object class="GtkScale" id="resetVolumeSlider">
|
||||||
<property name="adjustment">
|
<property name="adjustment">
|
||||||
<object class="GtkAdjustment">
|
<object class="GtkAdjustment">
|
||||||
<property name="page-increment">5.0</property>
|
<property name="page-increment">2005.4016</property>
|
||||||
<property name="upper">100.0</property>
|
<property name="step-increment">2005.4016</property>
|
||||||
|
<property name="upper">100270.08</property>
|
||||||
</object>
|
</object>
|
||||||
</property>
|
</property>
|
||||||
<property name="hexpand">True</property>
|
<property name="hexpand">True</property>
|
||||||
|
@ -122,12 +123,6 @@
|
||||||
<property name="label">Input Streams</property>
|
<property name="label">Input Streams</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
|
||||||
<object class="resetInputStreamEntry"/>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="resetInputStreamEntry"/>
|
|
||||||
</child>
|
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
|
@ -150,7 +145,7 @@
|
||||||
<property name="show-separators">True</property>
|
<property name="show-separators">True</property>
|
||||||
<property name="valign">start</property>
|
<property name="valign">start</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="resetListBoxRow" id="resetInputStreamButton">
|
<object class="resetListBoxRow" id="resetOutputStreamButton">
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkBox">
|
<object class="GtkBox">
|
||||||
<property name="height-request">40</property>
|
<property name="height-request">40</property>
|
||||||
|
@ -175,7 +170,7 @@
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkBox" id="resetSinks">
|
<object class="GtkBox" id="resetSources">
|
||||||
<property name="margin-end">5</property>
|
<property name="margin-end">5</property>
|
||||||
<property name="margin-start">5</property>
|
<property name="margin-start">5</property>
|
||||||
<property name="margin-top">10</property>
|
<property name="margin-top">10</property>
|
||||||
|
@ -186,12 +181,6 @@
|
||||||
<property name="label">Input Devices</property>
|
<property name="label">Input Devices</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
|
||||||
<object class="resetInputStreamEntry"/>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="resetInputStreamEntry"/>
|
|
||||||
</child>
|
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
|
@ -3,7 +3,7 @@
|
||||||
<interface>
|
<interface>
|
||||||
<requires lib="gtk" version="4.12"/>
|
<requires lib="gtk" version="4.12"/>
|
||||||
<requires lib="libadwaita" version="1.4"/>
|
<requires lib="libadwaita" version="1.4"/>
|
||||||
<template class="resetAudio" parent="GtkBox">
|
<template class="resetAudioOutput" parent="GtkBox">
|
||||||
<property name="orientation">vertical</property>
|
<property name="orientation">vertical</property>
|
||||||
<property name="valign">start</property>
|
<property name="valign">start</property>
|
||||||
<child>
|
<child>
|
||||||
|
@ -43,7 +43,7 @@
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkDropDown" id="resetOutputDevice">
|
<object class="GtkDropDown" id="resetInputDevice">
|
||||||
<property name="halign">end</property>
|
<property name="halign">end</property>
|
||||||
<property name="hexpand">True</property>
|
<property name="hexpand">True</property>
|
||||||
<property name="valign">center</property>
|
<property name="valign">center</property>
|
||||||
|
@ -84,8 +84,9 @@
|
||||||
<object class="GtkScale" id="resetVolumeSlider">
|
<object class="GtkScale" id="resetVolumeSlider">
|
||||||
<property name="adjustment">
|
<property name="adjustment">
|
||||||
<object class="GtkAdjustment">
|
<object class="GtkAdjustment">
|
||||||
<property name="page-increment">5.0</property>
|
<property name="page-increment">2005.4016</property>
|
||||||
<property name="upper">100.0</property>
|
<property name="step-increment">2005.4016</property>
|
||||||
|
<property name="upper">100270.08</property>
|
||||||
</object>
|
</object>
|
||||||
</property>
|
</property>
|
||||||
<property name="hexpand">True</property>
|
<property name="hexpand">True</property>
|
||||||
|
@ -113,7 +114,7 @@
|
||||||
<object class="GtkSeparator"/>
|
<object class="GtkSeparator"/>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkBox" id="resetOutputStreams">
|
<object class="GtkBox" id="resetInputStreams">
|
||||||
<property name="margin-top">10</property>
|
<property name="margin-top">10</property>
|
||||||
<property name="orientation">vertical</property>
|
<property name="orientation">vertical</property>
|
||||||
<child>
|
<child>
|
||||||
|
@ -144,7 +145,7 @@
|
||||||
<property name="show-separators">True</property>
|
<property name="show-separators">True</property>
|
||||||
<property name="valign">start</property>
|
<property name="valign">start</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="resetListBoxRow" id="resetOutputStreamButton">
|
<object class="resetListBoxRow" id="resetInputStreamButton">
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkBox">
|
<object class="GtkBox">
|
||||||
<property name="height-request">40</property>
|
<property name="height-request">40</property>
|
|
@ -12,13 +12,14 @@
|
||||||
<object class="GtkBox">
|
<object class="GtkBox">
|
||||||
<property name="margin-bottom">5</property>
|
<property name="margin-bottom">5</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkLabel" id="resetSourceName">
|
<object class="GtkLabel" id="resetSinkName">
|
||||||
<property name="label">text</property>
|
<property name="label">text</property>
|
||||||
<property name="margin-start">5</property>
|
<property name="margin-start">5</property>
|
||||||
|
<property name="wrap">True</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkDropDown" id="resetSelectedSource">
|
<object class="GtkDropDown" id="resetSelectedSink">
|
||||||
<property name="halign">end</property>
|
<property name="halign">end</property>
|
||||||
<property name="hexpand">True</property>
|
<property name="hexpand">True</property>
|
||||||
<property name="margin-end">5</property>
|
<property name="margin-end">5</property>
|
||||||
|
@ -31,8 +32,8 @@
|
||||||
<property name="margin-bottom">5</property>
|
<property name="margin-bottom">5</property>
|
||||||
<property name="margin-top">5</property>
|
<property name="margin-top">5</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkButton" id="resetSourceMute">
|
<object class="GtkButton" id="resetSinkMute">
|
||||||
<property name="icon-name">audio-input-microphone-symbolic</property>
|
<property name="icon-name">audio-volume-high-symbolic</property>
|
||||||
<property name="margin-end">5</property>
|
<property name="margin-end">5</property>
|
||||||
<property name="valign">center</property>
|
<property name="valign">center</property>
|
||||||
</object>
|
</object>
|
||||||
|
@ -41,8 +42,9 @@
|
||||||
<object class="GtkScale" id="resetVolumeSlider">
|
<object class="GtkScale" id="resetVolumeSlider">
|
||||||
<property name="adjustment">
|
<property name="adjustment">
|
||||||
<object class="GtkAdjustment">
|
<object class="GtkAdjustment">
|
||||||
<property name="page-increment">5.0</property>
|
<property name="page-increment">2005.4016</property>
|
||||||
<property name="upper">100.0</property>
|
<property name="step-increment">2005.4016</property>
|
||||||
|
<property name="upper">100270.08</property>
|
||||||
</object>
|
</object>
|
||||||
</property>
|
</property>
|
||||||
<property name="hexpand">True</property>
|
<property name="hexpand">True</property>
|
||||||
|
|
|
@ -15,10 +15,11 @@
|
||||||
<object class="GtkLabel" id="resetSourceName">
|
<object class="GtkLabel" id="resetSourceName">
|
||||||
<property name="label">text</property>
|
<property name="label">text</property>
|
||||||
<property name="margin-start">5</property>
|
<property name="margin-start">5</property>
|
||||||
|
<property name="wrap">True</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkDropDown" id="resetSelectedSink">
|
<object class="GtkDropDown" id="resetSelectedSource">
|
||||||
<property name="halign">end</property>
|
<property name="halign">end</property>
|
||||||
<property name="hexpand">True</property>
|
<property name="hexpand">True</property>
|
||||||
<property name="margin-end">5</property>
|
<property name="margin-end">5</property>
|
||||||
|
@ -32,7 +33,7 @@
|
||||||
<property name="margin-top">5</property>
|
<property name="margin-top">5</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkButton" id="resetSourceMute">
|
<object class="GtkButton" id="resetSourceMute">
|
||||||
<property name="icon-name">audio-volume-high-symbolic</property>
|
<property name="icon-name">audio-input-microphone-symbolic</property>
|
||||||
<property name="margin-end">5</property>
|
<property name="margin-end">5</property>
|
||||||
<property name="valign">center</property>
|
<property name="valign">center</property>
|
||||||
</object>
|
</object>
|
||||||
|
@ -41,8 +42,9 @@
|
||||||
<object class="GtkScale" id="resetVolumeSlider">
|
<object class="GtkScale" id="resetVolumeSlider">
|
||||||
<property name="adjustment">
|
<property name="adjustment">
|
||||||
<object class="GtkAdjustment">
|
<object class="GtkAdjustment">
|
||||||
<property name="page-increment">5.0</property>
|
<property name="page-increment">2005.4016</property>
|
||||||
<property name="upper">100.0</property>
|
<property name="step-increment">2005.4016</property>
|
||||||
|
<property name="upper">100270.08</property>
|
||||||
</object>
|
</object>
|
||||||
</property>
|
</property>
|
||||||
<property name="hexpand">True</property>
|
<property name="hexpand">True</property>
|
||||||
|
|
|
@ -2,22 +2,27 @@
|
||||||
<!-- Created with Cambalache 0.17.0 -->
|
<!-- Created with Cambalache 0.17.0 -->
|
||||||
<interface>
|
<interface>
|
||||||
<requires lib="gtk" version="4.12"/>
|
<requires lib="gtk" version="4.12"/>
|
||||||
<template class="resetMicEntry" parent="GtkBox">
|
<template class="resetSinkEntry" parent="GtkBox">
|
||||||
|
<property name="margin-bottom">5</property>
|
||||||
<property name="margin-end">5</property>
|
<property name="margin-end">5</property>
|
||||||
<property name="margin-start">5</property>
|
<property name="margin-start">5</property>
|
||||||
|
<property name="margin-top">5</property>
|
||||||
<property name="orientation">vertical</property>
|
<property name="orientation">vertical</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkBox">
|
<object class="GtkBox">
|
||||||
<property name="margin-bottom">5</property>
|
<property name="margin-bottom">5</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkImage" id="resetMicIcon">
|
<object class="GtkLabel" id="resetSinkName">
|
||||||
<property name="icon-name">audio-input-microphone-symbolic</property>
|
<property name="label">text</property>
|
||||||
<property name="margin-end">5</property>
|
<property name="margin-start">5</property>
|
||||||
|
<property name="wrap">True</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkLabel" id="resetMicName">
|
<object class="GtkCheckButton" id="resetSelectedSink">
|
||||||
<property name="label">Input Volume</property>
|
<property name="halign">end</property>
|
||||||
|
<property name="hexpand">True</property>
|
||||||
|
<property name="hexpand-set">True</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
|
@ -27,18 +32,19 @@
|
||||||
<property name="margin-bottom">5</property>
|
<property name="margin-bottom">5</property>
|
||||||
<property name="margin-top">5</property>
|
<property name="margin-top">5</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkButton" id="resetMicMute">
|
<object class="GtkButton" id="resetSinkMute">
|
||||||
<property name="icon-name">audio-input-microphone-symbolic</property>
|
<property name="icon-name">audio-volume-high-symbolic</property>
|
||||||
<property name="margin-end">5</property>
|
<property name="margin-end">5</property>
|
||||||
<property name="valign">center</property>
|
<property name="valign">center</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkScale" id="resetMicSlider">
|
<object class="GtkScale" id="resetVolumeSlider">
|
||||||
<property name="adjustment">
|
<property name="adjustment">
|
||||||
<object class="GtkAdjustment">
|
<object class="GtkAdjustment">
|
||||||
<property name="page-increment">5.0</property>
|
<property name="page-increment">2005.4016</property>
|
||||||
<property name="upper">100.0</property>
|
<property name="step-increment">2005.4016</property>
|
||||||
|
<property name="upper">100270.08</property>
|
||||||
</object>
|
</object>
|
||||||
</property>
|
</property>
|
||||||
<property name="hexpand">True</property>
|
<property name="hexpand">True</property>
|
||||||
|
@ -47,7 +53,7 @@
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkLabel" id="resetMicPercentage">
|
<object class="GtkLabel" id="resetVolumePercentage">
|
||||||
<property name="label">100%</property>
|
<property name="label">100%</property>
|
||||||
<property name="lines">1</property>
|
<property name="lines">1</property>
|
||||||
<property name="width-request">40</property>
|
<property name="width-request">40</property>
|
||||||
|
@ -56,7 +62,9 @@
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkProgressBar" id="resetMicMeter"/>
|
<object class="GtkProgressBar" id="resetVolumeMeter">
|
||||||
|
<property name="margin-top">5</property>
|
||||||
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</template>
|
</template>
|
||||||
</interface>
|
</interface>
|
70
src/resources/resetSourceEntry.ui
Normal file
70
src/resources/resetSourceEntry.ui
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
|
<!-- Created with Cambalache 0.17.0 -->
|
||||||
|
<interface>
|
||||||
|
<requires lib="gtk" version="4.12"/>
|
||||||
|
<template class="resetSourceEntry" 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="resetSourceName">
|
||||||
|
<property name="label">text</property>
|
||||||
|
<property name="margin-start">5</property>
|
||||||
|
<property name="wrap">True</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCheckButton" id="resetSelectedSource">
|
||||||
|
<property name="halign">end</property>
|
||||||
|
<property name="hexpand">True</property>
|
||||||
|
<property name="hexpand-set">True</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="margin-bottom">5</property>
|
||||||
|
<property name="margin-top">5</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkButton" id="resetSourceMute">
|
||||||
|
<property name="icon-name">microphone-sensitivity-high-symbolic</property>
|
||||||
|
<property name="margin-end">5</property>
|
||||||
|
<property name="valign">center</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkScale" id="resetVolumeSlider">
|
||||||
|
<property name="adjustment">
|
||||||
|
<object class="GtkAdjustment">
|
||||||
|
<property name="page-increment">2005.4016</property>
|
||||||
|
<property name="step-increment">2005.4016</property>
|
||||||
|
<property name="upper">100270.08</property>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
<property name="hexpand">True</property>
|
||||||
|
<property name="valign">center</property>
|
||||||
|
<property name="value-pos">bottom</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="resetVolumePercentage">
|
||||||
|
<property name="label">100%</property>
|
||||||
|
<property name="lines">1</property>
|
||||||
|
<property name="width-request">40</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkProgressBar" id="resetVolumeMeter">
|
||||||
|
<property name="margin-top">5</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</template>
|
||||||
|
</interface>
|
|
@ -6,16 +6,18 @@
|
||||||
(4,7,None,"resetWiFi.ui",None,None,None,None,None,None,None),
|
(4,7,None,"resetWiFi.ui",None,None,None,None,None,None,None),
|
||||||
(5,2,None,"resetWifiEntry.ui",None,None,None,None,None,None,None),
|
(5,2,None,"resetWifiEntry.ui",None,None,None,None,None,None,None),
|
||||||
(6,1,None,"resetSidebarEntry.ui",None,None,None,None,None,None,None),
|
(6,1,None,"resetSidebarEntry.ui",None,None,None,None,None,None,None),
|
||||||
(7,1,None,"resetOutputStreamEntry.ui",None,None,None,None,None,None,None),
|
(7,1,None,"resetInputStreamEntry.ui",None,None,None,None,None,None,None),
|
||||||
(8,1,None,"resetAudio.ui",None,None,None,None,None,None,None),
|
(8,1,None,"resetAudioOutput.ui",None,None,None,None,None,None,None),
|
||||||
(10,1,None,"resetBluetooth.ui",None,None,None,None,None,None,None),
|
(10,1,None,"resetBluetooth.ui",None,None,None,None,None,None,None),
|
||||||
(11,2,None,"resetBluetoothEntry.ui",None,None,None,None,None,None,None),
|
(11,2,None,"resetBluetoothEntry.ui",None,None,None,None,None,None,None),
|
||||||
(12,11,None,"resetMicrophone.ui",None,None,None,None,None,None,None),
|
(12,11,None,"resetAudioInput.ui",None,None,None,None,None,None,None),
|
||||||
(13,11,None,"resetInputStreamEntry.ui",None,None,None,None,None,None,None),
|
(13,11,None,"resetOutputStreamEntry.ui",None,None,None,None,None,None,None),
|
||||||
(14,3,None,"resetSettingBox.ui",None,None,None,None,None,None,None),
|
(14,3,None,"resetSettingBox.ui",None,None,None,None,None,None,None),
|
||||||
(15,1,None,"resetListBoxRow.ui",None,None,None,None,None,None,None),
|
(15,1,None,"resetListBoxRow.ui",None,None,None,None,None,None,None),
|
||||||
(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),
|
||||||
|
(19,1,None,"resetSourceEntry.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>"),
|
||||||
|
@ -91,17 +93,17 @@
|
||||||
(6,2,"GtkBox",None,1,None,None,None,-1,None),
|
(6,2,"GtkBox",None,1,None,None,None,-1,None),
|
||||||
(6,6,"GtkImage","resetSidebarImage",2,None,None,None,None,None),
|
(6,6,"GtkImage","resetSidebarImage",2,None,None,None,None,None),
|
||||||
(6,7,"GtkLabel","resetSidebarLabel",2,None,None,None,1,None),
|
(6,7,"GtkLabel","resetSidebarLabel",2,None,None,None,1,None),
|
||||||
(7,1,"GtkBox","resetOutputStreamEntry",None,None,None,None,-1,None),
|
(7,1,"GtkBox","resetInputStreamEntry",None,None,None,None,-1,None),
|
||||||
(7,4,"GtkProgressBar","resetVolumeMeter",1,None,None,None,2,None),
|
(7,4,"GtkProgressBar","resetVolumeMeter",1,None,None,None,2,None),
|
||||||
(7,5,"GtkBox",None,1,None,None,None,None,None),
|
(7,5,"GtkBox",None,1,None,None,None,None,None),
|
||||||
(7,6,"GtkLabel","resetSourceName",5,None,None,None,None,None),
|
(7,6,"GtkLabel","resetSinkName",5,None,None,None,None,None),
|
||||||
(7,8,"GtkBox",None,1,None,None,None,1,None),
|
(7,8,"GtkBox",None,1,None,None,None,1,None),
|
||||||
(7,9,"GtkScale","resetVolumeSlider",8,None,None,None,1,None),
|
(7,9,"GtkScale","resetVolumeSlider",8,None,None,None,1,None),
|
||||||
(7,10,"GtkAdjustment",None,9,None,None,None,None,None),
|
(7,10,"GtkAdjustment",None,9,None,None,None,None,None),
|
||||||
(7,11,"GtkButton","resetSourceMute",8,None,None,None,None,None),
|
(7,11,"GtkButton","resetSinkMute",8,None,None,None,None,None),
|
||||||
(7,12,"GtkLabel","resetVolumePercentage",8,None,None,None,2,None),
|
(7,12,"GtkLabel","resetVolumePercentage",8,None,None,None,2,None),
|
||||||
(7,13,"GtkDropDown","resetSelectedSink",5,None,None,None,1,None),
|
(7,13,"GtkDropDown","resetSelectedSink",5,None,None,None,1,None),
|
||||||
(8,1,"GtkBox","resetAudio",None,None,None,None,None,None),
|
(8,1,"GtkBox","resetAudioOutput",None,None,None,None,None,None),
|
||||||
(8,53,"GtkLabel",None,1,None,None,None,None,None),
|
(8,53,"GtkLabel",None,1,None,None,None,None,None),
|
||||||
(8,54,"AdwNavigationView",None,1,None,None,None,1,None),
|
(8,54,"AdwNavigationView",None,1,None,None,None,1,None),
|
||||||
(8,55,"AdwNavigationPage",None,54,None,None,None,None,None),
|
(8,55,"AdwNavigationPage",None,54,None,None,None,None,None),
|
||||||
|
@ -112,10 +114,10 @@
|
||||||
(8,74,"resetListBoxRow","resetSinksRow",73,None,None,None,None,None),
|
(8,74,"resetListBoxRow","resetSinksRow",73,None,None,None,None,None),
|
||||||
(8,75,"GtkBox",None,74,None,None,None,None,None),
|
(8,75,"GtkBox",None,74,None,None,None,None,None),
|
||||||
(8,76,"GtkLabel",None,75,None,None,None,None,None),
|
(8,76,"GtkLabel",None,75,None,None,None,None,None),
|
||||||
(8,77,"GtkDropDown","resetOutputDevice",75,None,None,None,1,None),
|
(8,77,"GtkDropDown","resetInputDevice",75,None,None,None,1,None),
|
||||||
(8,78,"GtkImage",None,75,None,None,None,2,None),
|
(8,78,"GtkImage",None,75,None,None,None,2,None),
|
||||||
(8,81,"GtkLabel",None,72,None,None,None,1,None),
|
(8,81,"GtkLabel",None,72,None,None,None,1,None),
|
||||||
(8,85,"GtkBox","resetOutputStreams",56,None,None,None,4,None),
|
(8,85,"GtkBox","resetInputStreams",56,None,None,None,4,None),
|
||||||
(8,86,"GtkLabel",None,85,None,None,None,None,None),
|
(8,86,"GtkLabel",None,85,None,None,None,None,None),
|
||||||
(8,89,"GtkBox","resetSinks",72,None,None,None,3,None),
|
(8,89,"GtkBox","resetSinks",72,None,None,None,3,None),
|
||||||
(8,90,"GtkLabel",None,89,None,None,None,None,None),
|
(8,90,"GtkLabel",None,89,None,None,None,None,None),
|
||||||
|
@ -123,15 +125,15 @@
|
||||||
(8,97,"GtkBox",None,93,None,None,None,None,None),
|
(8,97,"GtkBox",None,93,None,None,None,None,None),
|
||||||
(8,98,"GtkButton","resetSinkMute",97,None,None,None,None,None),
|
(8,98,"GtkButton","resetSinkMute",97,None,None,None,None,None),
|
||||||
(8,99,"GtkScale","resetVolumeSlider",97,None,None,None,1,None),
|
(8,99,"GtkScale","resetVolumeSlider",97,None,None,None,1,None),
|
||||||
(8,100,"GtkAdjustment",None,99,None,None,None,None,None),
|
|
||||||
(8,101,"GtkLabel","resetVolumePercentage",97,None,None,None,2,None),
|
(8,101,"GtkLabel","resetVolumePercentage",97,None,None,None,2,None),
|
||||||
(8,102,"GtkProgressBar","resetVolumeMeter",93,None,None,None,1,None),
|
(8,102,"GtkProgressBar","resetVolumeMeter",93,None,None,None,1,None),
|
||||||
(8,103,"GtkSeparator",None,56,None,None,None,3,None),
|
(8,103,"GtkSeparator",None,56,None,None,None,3,None),
|
||||||
(8,109,"GtkListBox",None,72,None,None,None,None,None),
|
(8,109,"GtkListBox",None,72,None,None,None,None,None),
|
||||||
(8,110,"resetListBoxRow","resetOutputStreamButton",109,None,None,None,None,None),
|
(8,110,"resetListBoxRow","resetInputStreamButton",109,None,None,None,None,None),
|
||||||
(8,111,"GtkBox",None,110,None,None,None,None,None),
|
(8,111,"GtkBox",None,110,None,None,None,None,None),
|
||||||
(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),
|
||||||
(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,7 +172,7 @@
|
||||||
(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,4,"GtkLabel","resetBluetoothLabel",2,None,None,None,1,None),
|
||||||
(11,5,"GtkButton","resetBluetoothButton",2,None,None,None,2,None),
|
(11,5,"GtkButton","resetBluetoothButton",2,None,None,None,2,None),
|
||||||
(12,11,"GtkBox","resetMicrophone",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),
|
||||||
(12,14,"AdwNavigationPage",None,13,None,None,None,None,None),
|
(12,14,"AdwNavigationPage",None,13,None,None,None,None,None),
|
||||||
|
@ -181,39 +183,35 @@
|
||||||
(12,19,"GtkLabel",None,18,None,None,None,None,None),
|
(12,19,"GtkLabel",None,18,None,None,None,None,None),
|
||||||
(12,20,"GtkDropDown","resetSourceDropdown",18,None,None,None,1,None),
|
(12,20,"GtkDropDown","resetSourceDropdown",18,None,None,None,1,None),
|
||||||
(12,21,"GtkImage",None,18,None,None,None,2,None),
|
(12,21,"GtkImage",None,18,None,None,None,2,None),
|
||||||
(12,22,"GtkBox","resetDefaultSource",15,None,None,None,1,None),
|
(12,22,"GtkBox",None,15,None,None,None,1,None),
|
||||||
(12,23,"GtkBox",None,22,None,None,None,None,None),
|
(12,23,"GtkBox",None,22,None,None,None,None,None),
|
||||||
(12,24,"GtkButton","resetSourceMute",23,None,None,None,None,None),
|
(12,24,"GtkButton","resetSourceMute",23,None,None,None,None,None),
|
||||||
(12,25,"GtkScale","resetVolumeSlider",23,None,None,None,1,None),
|
(12,25,"GtkScale","resetVolumeSlider",23,None,None,None,1,None),
|
||||||
(12,26,"GtkAdjustment",None,25,None,None,None,None,None),
|
|
||||||
(12,27,"GtkLabel","resetVolumePercentage",23,None,None,None,2,None),
|
(12,27,"GtkLabel","resetVolumePercentage",23,None,None,None,2,None),
|
||||||
(12,28,"GtkProgressBar","resetVolumeMeter",22,None,None,None,1,None),
|
(12,28,"GtkProgressBar","resetVolumeMeter",22,None,None,None,1,None),
|
||||||
(12,29,"GtkSeparator",None,15,None,None,None,2,None),
|
(12,29,"GtkSeparator",None,15,None,None,None,2,None),
|
||||||
(12,30,"GtkBox","resetOutputStreams",15,None,None,None,3,None),
|
(12,30,"GtkBox","resetOutputStreams",15,None,None,None,3,None),
|
||||||
(12,31,"GtkLabel",None,30,None,None,None,None,None),
|
(12,31,"GtkLabel",None,30,None,None,None,None,None),
|
||||||
(12,34,"AdwNavigationPage",None,13,None,None,None,1,None),
|
(12,34,"AdwNavigationPage",None,13,None,None,None,1,None),
|
||||||
(12,40,"resetInputStreamEntry",None,30,None,None,None,1,None),
|
|
||||||
(12,41,"resetInputStreamEntry",None,30,None,None,None,2,None),
|
|
||||||
(12,42,"GtkBox",None,34,None,None,None,None,None),
|
(12,42,"GtkBox",None,34,None,None,None,None,None),
|
||||||
(12,43,"GtkListBox",None,42,None,None,None,1,None),
|
(12,43,"GtkListBox",None,42,None,None,None,1,None),
|
||||||
(12,44,"resetListBoxRow","resetInputStreamButton",43,None,None,None,None,None),
|
(12,44,"resetListBoxRow","resetOutputStreamButton",43,None,None,None,None,None),
|
||||||
(12,45,"GtkBox",None,44,None,None,None,None,None),
|
(12,45,"GtkBox",None,44,None,None,None,None,None),
|
||||||
(12,46,"GtkLabel",None,45,None,None,None,None,None),
|
(12,46,"GtkLabel",None,45,None,None,None,None,None),
|
||||||
(12,47,"GtkImage",None,45,None,None,None,1,None),
|
(12,47,"GtkImage",None,45,None,None,None,1,None),
|
||||||
(12,49,"GtkBox","resetSinks",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,"resetInputStreamEntry",None,49,None,None,None,1,None),
|
(12,51,"GtkAdjustment",None,25,None,None,None,-1,None),
|
||||||
(12,52,"resetInputStreamEntry",None,49,None,None,None,2,None),
|
(13,11,"GtkBox","resetOutputStreamEntry",None,None,None,None,None,None),
|
||||||
(13,11,"GtkBox","resetInputStreamEntry",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),
|
||||||
(13,14,"GtkDropDown","resetSelectedSource",12,None,None,None,1,None),
|
(13,14,"GtkDropDown","resetSelectedSource",12,None,None,None,1,None),
|
||||||
(13,15,"GtkBox",None,11,None,None,None,1,None),
|
(13,15,"GtkBox",None,11,None,None,None,1,None),
|
||||||
(13,16,"GtkButton","resetSourceMute",15,None,None,None,None,None),
|
(13,16,"GtkButton","resetSourceMute",15,None,None,None,None,None),
|
||||||
(13,17,"GtkScale","resetVolumeSlider",15,None,None,None,1,None),
|
(13,17,"GtkScale","resetVolumeSlider",15,None,None,None,1,None),
|
||||||
(13,18,"GtkAdjustment",None,17,None,None,None,None,None),
|
|
||||||
(13,19,"GtkLabel","resetVolumePercentage",15,None,None,None,2,None),
|
(13,19,"GtkLabel","resetVolumePercentage",15,None,None,None,2,None),
|
||||||
(13,20,"GtkProgressBar","resetVolumeMeter",11,None,None,None,2,None),
|
(13,20,"GtkProgressBar","resetVolumeMeter",11,None,None,None,2,None),
|
||||||
|
(13,21,"GtkAdjustment",None,17,None,None,None,-1,None),
|
||||||
(14,3,"GtkBox","resetSettingBox",None,None,None,None,-1,None),
|
(14,3,"GtkBox","resetSettingBox",None,None,None,None,-1,None),
|
||||||
(15,1,"GtkListBoxRow","resetListBoxRow",None,None,None,None,None,None),
|
(15,1,"GtkListBoxRow","resetListBoxRow",None,None,None,None,None,None),
|
||||||
(16,6,"GtkPopover","resetPopup",None,None,None,None,-1,None),
|
(16,6,"GtkPopover","resetPopup",None,None,None,None,-1,None),
|
||||||
|
@ -225,7 +223,27 @@
|
||||||
(17,1,"GtkBox","resetSavedWifiEntry",None,None,None,None,-1,None),
|
(17,1,"GtkBox","resetSavedWifiEntry",None,None,None,None,-1,None),
|
||||||
(17,2,"GtkLabel","resetSavedWifiLabel",1,None,None,None,None,None),
|
(17,2,"GtkLabel","resetSavedWifiLabel",1,None,None,None,None,None),
|
||||||
(17,3,"GtkButton","resetEditSavedWifiButton",1,None,None,None,1,None),
|
(17,3,"GtkButton","resetEditSavedWifiButton",1,None,None,None,1,None),
|
||||||
(17,4,"GtkButton","resetDeleteSavedWifiButton",1,None,None,None,2,None)
|
(17,4,"GtkButton","resetDeleteSavedWifiButton",1,None,None,None,2,None),
|
||||||
|
(18,1,"GtkBox","resetSinkEntry",None,None,None,None,None,None),
|
||||||
|
(18,2,"GtkBox",None,1,None,None,None,None,None),
|
||||||
|
(18,3,"GtkLabel","resetSinkName",2,None,None,None,None,None),
|
||||||
|
(18,5,"GtkBox",None,1,None,None,None,1,None),
|
||||||
|
(18,6,"GtkButton","resetSinkMute",5,None,None,None,None,None),
|
||||||
|
(18,7,"GtkScale","resetVolumeSlider",5,None,None,None,1,None),
|
||||||
|
(18,9,"GtkLabel","resetVolumePercentage",5,None,None,None,2,None),
|
||||||
|
(18,10,"GtkProgressBar","resetVolumeMeter",1,None,None,None,2,None),
|
||||||
|
(18,11,"GtkCheckButton","resetSelectedSink",2,None,None,None,1,None),
|
||||||
|
(18,12,"GtkAdjustment",None,7,None,None,None,-1,None),
|
||||||
|
(19,1,"GtkBox","resetSourceEntry",None,None,None,None,None,None),
|
||||||
|
(19,2,"GtkBox",None,1,None,None,None,None,None),
|
||||||
|
(19,3,"GtkLabel","resetSourceName",2,None,None,None,None,None),
|
||||||
|
(19,4,"GtkCheckButton","resetSelectedSource",2,None,None,None,1,None),
|
||||||
|
(19,5,"GtkBox",None,1,None,None,None,1,None),
|
||||||
|
(19,6,"GtkButton","resetSourceMute",5,None,None,None,None,None),
|
||||||
|
(19,7,"GtkScale","resetVolumeSlider",5,None,None,None,1,None),
|
||||||
|
(19,9,"GtkLabel","resetVolumePercentage",5,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)
|
||||||
</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),
|
||||||
|
@ -412,6 +430,7 @@
|
||||||
(7,4,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
|
(7,4,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
|
||||||
(7,5,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
|
(7,5,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
|
||||||
(7,6,"GtkLabel","label","text",None,None,None,None,None,None,None,None,None),
|
(7,6,"GtkLabel","label","text",None,None,None,None,None,None,None,None,None),
|
||||||
|
(7,6,"GtkLabel","wrap","True",None,None,None,None,None,None,None,None,None),
|
||||||
(7,6,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
|
(7,6,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
|
||||||
(7,8,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
|
(7,8,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
|
||||||
(7,8,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
|
(7,8,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
@ -419,8 +438,9 @@
|
||||||
(7,9,"GtkScale","value-pos","bottom",None,None,None,None,None,None,None,None,None),
|
(7,9,"GtkScale","value-pos","bottom",None,None,None,None,None,None,None,None,None),
|
||||||
(7,9,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
(7,9,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
||||||
(7,9,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
|
(7,9,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
|
||||||
(7,10,"GtkAdjustment","page-increment","5.0",None,None,None,None,None,None,None,None,None),
|
(7,10,"GtkAdjustment","page-increment","2005.4016",None,None,None,None,None,None,None,None,None),
|
||||||
(7,10,"GtkAdjustment","upper","100.0",None,None,None,None,None,None,None,None,None),
|
(7,10,"GtkAdjustment","step-increment","2005.4016",None,None,None,None,None,None,None,None,None),
|
||||||
|
(7,10,"GtkAdjustment","upper","100270.08",None,None,None,None,None,None,None,None,None),
|
||||||
(7,11,"GtkButton","icon-name","audio-volume-high-symbolic",None,None,None,None,None,None,None,None,None),
|
(7,11,"GtkButton","icon-name","audio-volume-high-symbolic",None,None,None,None,None,None,None,None,None),
|
||||||
(7,11,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
(7,11,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
||||||
(7,11,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
|
(7,11,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
|
||||||
|
@ -476,12 +496,10 @@
|
||||||
(8,98,"GtkButton","icon-name","audio-volume-high-symbolic",None,None,None,None,None,None,None,None,None),
|
(8,98,"GtkButton","icon-name","audio-volume-high-symbolic",None,None,None,None,None,None,None,None,None),
|
||||||
(8,98,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
(8,98,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
||||||
(8,98,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
|
(8,98,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
|
||||||
(8,99,"GtkRange","adjustment",None,None,None,None,None,100,None,None,None,None),
|
(8,99,"GtkRange","adjustment",None,None,None,None,None,115,None,None,None,None),
|
||||||
(8,99,"GtkScale","value-pos","bottom",None,None,None,None,None,None,None,None,None),
|
(8,99,"GtkScale","value-pos","bottom",None,None,None,None,None,None,None,None,None),
|
||||||
(8,99,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
(8,99,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
||||||
(8,99,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
|
(8,99,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
|
||||||
(8,100,"GtkAdjustment","page-increment","5.0",None,None,None,None,None,None,None,None,None),
|
|
||||||
(8,100,"GtkAdjustment","upper","100.0",None,None,None,None,None,None,None,None,None),
|
|
||||||
(8,101,"GtkLabel","label","100%",None,None,None,None,None,None,None,None,None),
|
(8,101,"GtkLabel","label","100%",None,None,None,None,None,None,None,None,None),
|
||||||
(8,101,"GtkLabel","lines","1",None,None,None,None,None,None,None,None,None),
|
(8,101,"GtkLabel","lines","1",None,None,None,None,None,None,None,None,None),
|
||||||
(8,101,"GtkWidget","width-request","40",None,None,None,None,None,None,None,None,None),
|
(8,101,"GtkWidget","width-request","40",None,None,None,None,None,None,None,None,None),
|
||||||
|
@ -500,6 +518,9 @@
|
||||||
(8,113,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
|
(8,113,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
|
||||||
(8,113,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
(8,113,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
||||||
(8,113,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
(8,113,"GtkWidget","margin-end","5",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","upper","100270.08",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),
|
||||||
|
@ -625,12 +646,10 @@
|
||||||
(12,24,"GtkButton","icon-name","audio-input-microphone-symbolic",None,None,None,None,None,None,None,None,None),
|
(12,24,"GtkButton","icon-name","audio-input-microphone-symbolic",None,None,None,None,None,None,None,None,None),
|
||||||
(12,24,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
(12,24,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
||||||
(12,24,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
|
(12,24,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
|
||||||
(12,25,"GtkRange","adjustment",None,None,None,None,None,26,None,None,None,None),
|
(12,25,"GtkRange","adjustment",None,None,None,None,None,51,None,None,None,None),
|
||||||
(12,25,"GtkScale","value-pos","bottom",None,None,None,None,None,None,None,None,None),
|
(12,25,"GtkScale","value-pos","bottom",None,None,None,None,None,None,None,None,None),
|
||||||
(12,25,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
(12,25,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
||||||
(12,25,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
|
(12,25,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
|
||||||
(12,26,"GtkAdjustment","page-increment","5.0",None,None,None,None,None,None,None,None,None),
|
|
||||||
(12,26,"GtkAdjustment","upper","100.0",None,None,None,None,None,None,None,None,None),
|
|
||||||
(12,27,"GtkLabel","label","100%",None,None,None,None,None,None,None,None,None),
|
(12,27,"GtkLabel","label","100%",None,None,None,None,None,None,None,None,None),
|
||||||
(12,27,"GtkLabel","lines","1",None,None,None,None,None,None,None,None,None),
|
(12,27,"GtkLabel","lines","1",None,None,None,None,None,None,None,None,None),
|
||||||
(12,27,"GtkWidget","width-request","40",None,None,None,None,None,None,None,None,None),
|
(12,27,"GtkWidget","width-request","40",None,None,None,None,None,None,None,None,None),
|
||||||
|
@ -661,6 +680,9 @@
|
||||||
(12,49,"GtkWidget","margin-top","10",None,None,None,None,None,None,None,None,None),
|
(12,49,"GtkWidget","margin-top","10",None,None,None,None,None,None,None,None,None),
|
||||||
(12,50,"GtkLabel","label","Input Devices",None,None,None,None,None,None,None,None,None),
|
(12,50,"GtkLabel","label","Input Devices",None,None,None,None,None,None,None,None,None),
|
||||||
(12,50,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
|
(12,50,"GtkWidget","halign","start",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","upper","100270.08",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),
|
||||||
|
@ -668,6 +690,7 @@
|
||||||
(13,11,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
|
(13,11,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
|
||||||
(13,12,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
|
(13,12,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
|
||||||
(13,13,"GtkLabel","label","text",None,None,None,None,None,None,None,None,None),
|
(13,13,"GtkLabel","label","text",None,None,None,None,None,None,None,None,None),
|
||||||
|
(13,13,"GtkLabel","wrap","True",None,None,None,None,None,None,None,None,None),
|
||||||
(13,13,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
|
(13,13,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
|
||||||
(13,14,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
|
(13,14,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
|
||||||
(13,14,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
(13,14,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
||||||
|
@ -677,16 +700,17 @@
|
||||||
(13,16,"GtkButton","icon-name","audio-input-microphone-symbolic",None,None,None,None,None,None,None,None,None),
|
(13,16,"GtkButton","icon-name","audio-input-microphone-symbolic",None,None,None,None,None,None,None,None,None),
|
||||||
(13,16,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
(13,16,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
||||||
(13,16,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
|
(13,16,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
|
||||||
(13,17,"GtkRange","adjustment",None,None,None,None,None,18,None,None,None,None),
|
(13,17,"GtkRange","adjustment",None,None,None,None,None,21,None,None,None,None),
|
||||||
(13,17,"GtkScale","value-pos","bottom",None,None,None,None,None,None,None,None,None),
|
(13,17,"GtkScale","value-pos","bottom",None,None,None,None,None,None,None,None,None),
|
||||||
(13,17,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
(13,17,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
||||||
(13,17,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
|
(13,17,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
|
||||||
(13,18,"GtkAdjustment","page-increment","5.0",None,None,None,None,None,None,None,None,None),
|
|
||||||
(13,18,"GtkAdjustment","upper","100.0",None,None,None,None,None,None,None,None,None),
|
|
||||||
(13,19,"GtkLabel","label","100%",None,None,None,None,None,None,None,None,None),
|
(13,19,"GtkLabel","label","100%",None,None,None,None,None,None,None,None,None),
|
||||||
(13,19,"GtkLabel","lines","1",None,None,None,None,None,None,None,None,None),
|
(13,19,"GtkLabel","lines","1",None,None,None,None,None,None,None,None,None),
|
||||||
(13,19,"GtkWidget","width-request","40",None,None,None,None,None,None,None,None,None),
|
(13,19,"GtkWidget","width-request","40",None,None,None,None,None,None,None,None,None),
|
||||||
(13,20,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
|
(13,20,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(13,21,"GtkAdjustment","page-increment","2005.4016",None,None,None,None,None,None,None,None,None),
|
||||||
|
(13,21,"GtkAdjustment","step-increment","2005.4016",None,None,None,None,None,None,None,None,None),
|
||||||
|
(13,21,"GtkAdjustment","upper","100270.08",None,None,None,None,None,None,None,None,None),
|
||||||
(14,3,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
|
(14,3,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
|
||||||
(14,3,"GtkWidget","halign","center",None,None,None,None,None,None,None,None,None),
|
(14,3,"GtkWidget","halign","center",None,None,None,None,None,None,None,None,None),
|
||||||
(14,3,"GtkWidget","width-request","500",None,None,None,None,None,None,None,None,None),
|
(14,3,"GtkWidget","width-request","500",None,None,None,None,None,None,None,None,None),
|
||||||
|
@ -714,7 +738,63 @@
|
||||||
(17,3,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
|
(17,3,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
|
||||||
(17,3,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
(17,3,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
||||||
(17,4,"GtkButton","has-frame","False",None,None,None,None,None,None,None,None,None),
|
(17,4,"GtkButton","has-frame","False",None,None,None,None,None,None,None,None,None),
|
||||||
(17,4,"GtkButton","icon-name","user-trash-symbolic",None,None,None,None,None,None,None,None,None)
|
(17,4,"GtkButton","icon-name","user-trash-symbolic",None,None,None,None,None,None,None,None,None),
|
||||||
|
(18,1,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
|
||||||
|
(18,1,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(18,1,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(18,1,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(18,1,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(18,2,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(18,3,"GtkLabel","label","text",None,None,None,None,None,None,None,None,None),
|
||||||
|
(18,3,"GtkLabel","wrap","True",None,None,None,None,None,None,None,None,None),
|
||||||
|
(18,3,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(18,5,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(18,5,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(18,6,"GtkButton","icon-name","audio-volume-high-symbolic",None,None,None,None,None,None,None,None,None),
|
||||||
|
(18,6,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(18,6,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
|
||||||
|
(18,7,"GtkRange","adjustment",None,None,None,None,None,12,None,None,None,None),
|
||||||
|
(18,7,"GtkScale","value-pos","bottom",None,None,None,None,None,None,None,None,None),
|
||||||
|
(18,7,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
||||||
|
(18,7,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
|
||||||
|
(18,9,"GtkLabel","label","100%",None,None,None,None,None,None,None,None,None),
|
||||||
|
(18,9,"GtkLabel","lines","1",None,None,None,None,None,None,None,None,None),
|
||||||
|
(18,9,"GtkWidget","width-request","40",None,None,None,None,None,None,None,None,None),
|
||||||
|
(18,10,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(18,11,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
|
||||||
|
(18,11,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
||||||
|
(18,11,"GtkWidget","hexpand-set","True",None,None,None,None,None,None,None,None,None),
|
||||||
|
(18,12,"GtkAdjustment","page-increment","2005.4016",None,None,None,None,None,None,None,None,None),
|
||||||
|
(18,12,"GtkAdjustment","step-increment","2005.4016",None,None,None,None,None,None,None,None,None),
|
||||||
|
(18,12,"GtkAdjustment","upper","100270.08",None,None,None,None,None,None,None,None,None),
|
||||||
|
(19,1,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
|
||||||
|
(19,1,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(19,1,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(19,1,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(19,1,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(19,2,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(19,3,"GtkLabel","label","text",None,None,None,None,None,None,None,None,None),
|
||||||
|
(19,3,"GtkLabel","wrap","True",None,None,None,None,None,None,None,None,None),
|
||||||
|
(19,3,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(19,4,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
|
||||||
|
(19,4,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
||||||
|
(19,4,"GtkWidget","hexpand-set","True",None,None,None,None,None,None,None,None,None),
|
||||||
|
(19,5,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(19,5,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(19,6,"GtkButton","icon-name","microphone-sensitivity-high-symbolic",None,None,None,None,None,None,None,None,None),
|
||||||
|
(19,6,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(19,6,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
|
||||||
|
(19,7,"GtkRange","adjustment",None,None,None,None,None,12,None,None,None,None),
|
||||||
|
(19,7,"GtkScale","value-pos","bottom",None,None,None,None,None,None,None,None,None),
|
||||||
|
(19,7,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
||||||
|
(19,7,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
|
||||||
|
(19,9,"GtkLabel","label","100%",None,None,None,None,None,None,None,None,None),
|
||||||
|
(19,9,"GtkLabel","lines","1",None,None,None,None,None,None,None,None,None),
|
||||||
|
(19,9,"GtkWidget","width-request","40",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","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)
|
||||||
</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),
|
||||||
|
|
|
@ -10,10 +10,12 @@
|
||||||
<file compressed="true" preprocess="xml-stripblanks">resetSavedWifiEntry.ui</file>
|
<file compressed="true" preprocess="xml-stripblanks">resetSavedWifiEntry.ui</file>
|
||||||
<file compressed="true" preprocess="xml-stripblanks">resetBluetooth.ui</file>
|
<file compressed="true" preprocess="xml-stripblanks">resetBluetooth.ui</file>
|
||||||
<file compressed="true" preprocess="xml-stripblanks">resetBluetoothEntry.ui</file>
|
<file compressed="true" preprocess="xml-stripblanks">resetBluetoothEntry.ui</file>
|
||||||
<file compressed="true" preprocess="xml-stripblanks">resetAudio.ui</file>
|
<file compressed="true" preprocess="xml-stripblanks">resetAudioOutput.ui</file>
|
||||||
<file compressed="true" preprocess="xml-stripblanks">resetOutputStreamEntry.ui</file>
|
<file compressed="true" preprocess="xml-stripblanks">resetOutputStreamEntry.ui</file>
|
||||||
<file compressed="true" preprocess="xml-stripblanks">resetMicrophone.ui</file>
|
<file compressed="true" preprocess="xml-stripblanks">resetAudioInput.ui</file>
|
||||||
<file compressed="true" preprocess="xml-stripblanks">resetInputStreamEntry.ui</file>
|
<file compressed="true" preprocess="xml-stripblanks">resetInputStreamEntry.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">resetPopup.ui</file>
|
<file compressed="true" preprocess="xml-stripblanks">resetPopup.ui</file>
|
||||||
</gresource>
|
</gresource>
|
||||||
</gresources>
|
</gresources>
|
||||||
|
|
Loading…
Reference in a new issue