mirror of
https://github.com/Xetibo/ReSet.git
synced 2025-04-18 18:48:33 +02:00
feat: Add initial Sound Mapping
This commit is contained in:
parent
679b4f0331
commit
5999bb1b45
|
@ -1,9 +1,12 @@
|
||||||
use gtk::{CompositeTemplate, DropDown, TemplateChild, glib};
|
use std::sync::{Arc, Mutex};
|
||||||
use gtk::prelude::*;
|
|
||||||
use gtk::subclass::prelude::*;
|
|
||||||
use crate::components::base::listEntry::ListEntry;
|
use crate::components::base::listEntry::ListEntry;
|
||||||
use crate::components::input::inputStreamEntry::InputStreamEntry;
|
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::{glib, CompositeTemplate, DropDown, TemplateChild};
|
||||||
|
use ReSet_Lib::audio::audio::{OutputStream, Source};
|
||||||
|
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
#[derive(Default, CompositeTemplate)]
|
#[derive(Default, CompositeTemplate)]
|
||||||
|
@ -15,6 +18,8 @@ pub struct SourceBox {
|
||||||
pub resetSourceRow: TemplateChild<ListEntry>,
|
pub resetSourceRow: TemplateChild<ListEntry>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetInputStreamButton: TemplateChild<ListEntry>,
|
pub resetInputStreamButton: TemplateChild<ListEntry>,
|
||||||
|
pub resetSources: Arc<Mutex<Vec<Source>>>,
|
||||||
|
pub resetOutputStreams: Arc<Mutex<Vec<OutputStream>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[glib::object_subclass]
|
#[glib::object_subclass]
|
||||||
|
@ -49,4 +54,5 @@ impl WidgetImpl for SourceBox {}
|
||||||
|
|
||||||
impl WindowImpl for SourceBox {}
|
impl WindowImpl for SourceBox {}
|
||||||
|
|
||||||
impl ApplicationWindowImpl for SourceBox {}
|
impl ApplicationWindowImpl for SourceBox {}
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,21 @@
|
||||||
use adw::glib;
|
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::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::subclass::prelude::ObjectSubclassIsExt;
|
||||||
use glib::Variant;
|
use glib::Variant;
|
||||||
|
use gtk::gio;
|
||||||
use gtk::prelude::ActionableExt;
|
use gtk::prelude::ActionableExt;
|
||||||
use crate::components::output::audioBoxImpl;
|
use ReSet_Lib::audio::audio::{InputStream, Sink};
|
||||||
|
|
||||||
|
use super::audioSource::{self, AudioSourceEntry};
|
||||||
|
|
||||||
glib::wrapper! {
|
glib::wrapper! {
|
||||||
pub struct AudioBox(ObjectSubclass<audioBoxImpl::AudioBox>)
|
pub struct AudioBox(ObjectSubclass<audioBoxImpl::AudioBox>)
|
||||||
|
@ -11,6 +23,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 AudioBox {}
|
||||||
|
unsafe impl Sync for AudioBox {}
|
||||||
|
|
||||||
impl AudioBox {
|
impl AudioBox {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
Object::builder().build()
|
Object::builder().build()
|
||||||
|
@ -18,9 +33,113 @@ impl AudioBox {
|
||||||
|
|
||||||
pub fn setupCallbacks(&self) {
|
pub fn setupCallbacks(&self) {
|
||||||
let selfImp = self.imp();
|
let selfImp = self.imp();
|
||||||
selfImp.resetSinksRow.set_action_name(Some("navigation.push"));
|
selfImp
|
||||||
selfImp.resetSinksRow.set_action_target_value(Some(&Variant::from("outputDevices")));
|
.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"));
|
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,23 +1,41 @@
|
||||||
use gtk::{CompositeTemplate, DropDown, TemplateChild, glib};
|
use std::cell::RefCell;
|
||||||
use gtk::prelude::*;
|
use std::sync::{Arc, Mutex};
|
||||||
use gtk::subclass::prelude::*;
|
|
||||||
|
use crate::components::base::listEntry::ListEntry;
|
||||||
use crate::components::output::audioBox;
|
use crate::components::output::audioBox;
|
||||||
use crate::components::output::audioSource::AudioSourceEntry;
|
use crate::components::output::audioSource::AudioSourceEntry;
|
||||||
use crate::components::base::listEntry::ListEntry;
|
use gtk::subclass::prelude::*;
|
||||||
|
use gtk::{glib, Box, Button, CompositeTemplate, DropDown, Label, TemplateChild};
|
||||||
|
use gtk::{prelude::*, ProgressBar, Scale};
|
||||||
|
use ReSet_Lib::audio::audio::{InputStream, Sink};
|
||||||
|
|
||||||
#[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/resetAudio.ui")]
|
||||||
pub struct AudioBox {
|
pub struct AudioBox {
|
||||||
#[template_child]
|
|
||||||
pub resetOutputDevice: TemplateChild<DropDown>,
|
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetSinksRow: TemplateChild<ListEntry>,
|
pub resetSinksRow: TemplateChild<ListEntry>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
|
pub resetOutputDevice: TemplateChild<DropDown>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetSinkMute: TemplateChild<Button>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetVolumeSlider: TemplateChild<Scale>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetVolumePercentage: TemplateChild<Label>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetVolumeMeter: TemplateChild<ProgressBar>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetSinks: TemplateChild<Box>,
|
||||||
|
#[template_child]
|
||||||
pub resetOutputStreamButton: TemplateChild<ListEntry>,
|
pub resetOutputStreamButton: TemplateChild<ListEntry>,
|
||||||
|
#[template_child]
|
||||||
|
pub resetOutputStreams: TemplateChild<Box>,
|
||||||
|
pub resetDefaultSink: RefCell<Option<Sink>>,
|
||||||
|
pub resetSinkList: Arc<Mutex<Vec<Sink>>>,
|
||||||
|
pub resetInputStreamList: Arc<Mutex<Vec<InputStream>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#[glib::object_subclass]
|
#[glib::object_subclass]
|
||||||
impl ObjectSubclass for AudioBox {
|
impl ObjectSubclass for AudioBox {
|
||||||
const NAME: &'static str = "resetAudio";
|
const NAME: &'static str = "resetAudio";
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
|
use crate::components::output::audioSourceImpl;
|
||||||
use adw::glib;
|
use adw::glib;
|
||||||
use adw::glib::Object;
|
use adw::glib::Object;
|
||||||
use crate::components::output::audioSourceImpl;
|
use glib::subclass::types::ObjectSubclassIsExt;
|
||||||
|
|
||||||
glib::wrapper! {
|
glib::wrapper! {
|
||||||
pub struct AudioSourceEntry(ObjectSubclass<audioSourceImpl::AudioSourceEntry>)
|
pub struct AudioSourceEntry(ObjectSubclass<audioSourceImpl::AudioSourceEntry>)
|
||||||
|
@ -9,7 +10,25 @@ glib::wrapper! {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AudioSourceEntry {
|
impl AudioSourceEntry {
|
||||||
pub fn new() -> Self {
|
pub fn new(name: String, volume: Vec<u32>, muted: bool, index: u32) -> Self {
|
||||||
Object::builder().build()
|
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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
use gtk::{Button, CompositeTemplate, glib, Label, ProgressBar, Scale};
|
use std::cell::{Cell, RefCell};
|
||||||
use gtk::subclass::prelude::*;
|
|
||||||
use crate::components::output::audioSource;
|
use crate::components::output::audioSource;
|
||||||
|
use gtk::subclass::prelude::*;
|
||||||
|
use gtk::{glib, Button, CompositeTemplate, DropDown, Label, ProgressBar, Scale};
|
||||||
|
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
#[derive(Default, CompositeTemplate)]
|
#[derive(Default, CompositeTemplate)]
|
||||||
|
@ -9,6 +11,8 @@ pub struct AudioSourceEntry {
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetSourceName: TemplateChild<Label>,
|
pub resetSourceName: TemplateChild<Label>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
|
pub resetSelectedSink: TemplateChild<DropDown>,
|
||||||
|
#[template_child]
|
||||||
pub resetSourceMute: TemplateChild<Button>,
|
pub resetSourceMute: TemplateChild<Button>,
|
||||||
#[template_child]
|
#[template_child]
|
||||||
pub resetVolumeSlider: TemplateChild<Scale>,
|
pub resetVolumeSlider: TemplateChild<Scale>,
|
||||||
|
@ -16,6 +20,9 @@ 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 isMuted: Cell<bool>,
|
||||||
|
pub volume: RefCell<Vec<u32>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[glib::object_subclass]
|
#[glib::object_subclass]
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
use gtk::prelude::FrameExt;
|
use gtk::prelude::FrameExt;
|
||||||
use std::sync::Arc;
|
|
||||||
use std::sync::atomic::Ordering;
|
use std::sync::atomic::Ordering;
|
||||||
|
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;
|
||||||
use crate::components::output::audioBox::AudioBox;
|
use crate::components::output::audioBox::{populate_streams, AudioBox, 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};
|
||||||
|
@ -16,7 +16,7 @@ pub const HANDLE_CONNECTIVITY_CLICK: fn(Arc<Listeners>, FlowBox) =
|
||||||
listeners.pulse_listener.store(false, Ordering::SeqCst);
|
listeners.pulse_listener.store(false, Ordering::SeqCst);
|
||||||
let wifiBox = Arc::new(WifiBox::new());
|
let wifiBox = Arc::new(WifiBox::new());
|
||||||
show_stored_connections(wifiBox.clone());
|
show_stored_connections(wifiBox.clone());
|
||||||
scanForWifi(listeners.clone(),wifiBox.clone());
|
scanForWifi(listeners.clone(), wifiBox.clone());
|
||||||
let wifiFrame = wrapInFrame(SettingBox::new(&*wifiBox));
|
let wifiFrame = wrapInFrame(SettingBox::new(&*wifiBox));
|
||||||
let bluetoothFrame = wrapInFrame(SettingBox::new(&BluetoothBox::new()));
|
let bluetoothFrame = wrapInFrame(SettingBox::new(&BluetoothBox::new()));
|
||||||
resetMain.remove_all();
|
resetMain.remove_all();
|
||||||
|
@ -30,7 +30,7 @@ pub const HANDLE_WIFI_CLICK: fn(Arc<Listeners>, FlowBox) =
|
||||||
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 wifiBox = Arc::new(WifiBox::new());
|
let wifiBox = Arc::new(WifiBox::new());
|
||||||
scanForWifi(listeners.clone(),wifiBox.clone());
|
scanForWifi(listeners.clone(), wifiBox.clone());
|
||||||
let wifiFrame = wrapInFrame(SettingBox::new(&*wifiBox));
|
let wifiFrame = wrapInFrame(SettingBox::new(&*wifiBox));
|
||||||
resetMain.remove_all();
|
resetMain.remove_all();
|
||||||
resetMain.insert(&wifiFrame, -1);
|
resetMain.insert(&wifiFrame, -1);
|
||||||
|
@ -63,7 +63,10 @@ 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 audioFrame = wrapInFrame(SettingBox::new(&AudioBox::new()));
|
let audioOutput = Arc::new(AudioBox::new());
|
||||||
|
populate_streams(listeners.clone(), audioOutput.clone());
|
||||||
|
populate_sinks(audioOutput.clone());
|
||||||
|
let audioFrame = wrapInFrame(SettingBox::new(&*audioOutput));
|
||||||
let sourceFrame = wrapInFrame(SettingBox::new(&SourceBox::new()));
|
let sourceFrame = wrapInFrame(SettingBox::new(&SourceBox::new()));
|
||||||
resetMain.remove_all();
|
resetMain.remove_all();
|
||||||
resetMain.insert(&audioFrame, -1);
|
resetMain.insert(&audioFrame, -1);
|
||||||
|
@ -76,7 +79,10 @@ 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 audioFrame = wrapInFrame(SettingBox::new(&AudioBox::new()));
|
let audioOutput = Arc::new(AudioBox::new());
|
||||||
|
populate_streams(listeners.clone(), audioOutput.clone());
|
||||||
|
populate_sinks(audioOutput.clone());
|
||||||
|
let audioFrame = wrapInFrame(SettingBox::new(&*audioOutput));
|
||||||
resetMain.remove_all();
|
resetMain.remove_all();
|
||||||
resetMain.insert(&audioFrame, -1);
|
resetMain.insert(&audioFrame, -1);
|
||||||
resetMain.set_max_children_per_line(1);
|
resetMain.set_max_children_per_line(1);
|
||||||
|
|
|
@ -63,7 +63,7 @@
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkBox" id="resetDefaultSink">
|
<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>
|
||||||
|
@ -74,7 +74,7 @@
|
||||||
<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-volume-high-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>
|
||||||
|
@ -122,15 +122,6 @@
|
||||||
<property name="label">Output Streams</property>
|
<property name="label">Output Streams</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
|
||||||
<object class="resetOutputStreamEntry" id="resetDefaultSink_2"/>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="resetOutputStreamEntry" id="resetDefaultSink_3">
|
|
||||||
<property name="margin-bottom">5</property>
|
|
||||||
<property name="margin-top">5</property>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
|
@ -192,12 +183,6 @@
|
||||||
<property name="label">Output Devices</property>
|
<property name="label">Output Devices</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
|
||||||
<object class="resetOutputStreamEntry" id="resetDefaultSink_4"/>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="resetOutputStreamEntry" id="resetDefaultSink_5"/>
|
|
||||||
</child>
|
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
|
|
|
@ -117,15 +117,11 @@
|
||||||
(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","resetOutputStreams",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,87,"resetOutputStreamEntry","resetDefaultSink_2",85,None,None,None,1,None),
|
|
||||||
(8,88,"resetOutputStreamEntry","resetDefaultSink_3",85,None,None,None,2,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),
|
||||||
(8,91,"resetOutputStreamEntry","resetDefaultSink_4",89,None,None,None,1,None),
|
(8,93,"GtkBox",None,56,None,None,None,2,None),
|
||||||
(8,92,"resetOutputStreamEntry","resetDefaultSink_5",89,None,None,None,2,None),
|
|
||||||
(8,93,"GtkBox","resetDefaultSink",56,None,None,None,2,None),
|
|
||||||
(8,97,"GtkBox",None,93,None,None,None,None,None),
|
(8,97,"GtkBox",None,93,None,None,None,None,None),
|
||||||
(8,98,"GtkButton","resetSourceMute",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,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),
|
||||||
|
@ -464,8 +460,6 @@
|
||||||
(8,85,"GtkWidget","margin-top","10",None,None,None,None,None,None,None,None,None),
|
(8,85,"GtkWidget","margin-top","10",None,None,None,None,None,None,None,None,None),
|
||||||
(8,86,"GtkLabel","label","Output Streams",None,None,None,None,None,None,None,None,None),
|
(8,86,"GtkLabel","label","Output Streams",None,None,None,None,None,None,None,None,None),
|
||||||
(8,86,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
|
(8,86,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
|
||||||
(8,88,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
|
|
||||||
(8,88,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
|
|
||||||
(8,89,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
|
(8,89,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
|
||||||
(8,89,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
(8,89,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
||||||
(8,89,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
|
(8,89,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
|
Loading…
Reference in a new issue