2017-06-26 21:52:21 +00:00
|
|
|
extern crate flexi_logger;
|
|
|
|
#[macro_use]
|
|
|
|
extern crate log;
|
|
|
|
|
2017-06-27 13:56:33 +00:00
|
|
|
#[macro_use]
|
|
|
|
extern crate error_chain;
|
|
|
|
|
2017-06-26 07:08:37 +00:00
|
|
|
extern crate gtk;
|
2017-06-26 21:52:21 +00:00
|
|
|
extern crate gtk_sys;
|
2017-06-26 07:08:37 +00:00
|
|
|
extern crate gdk;
|
2017-06-26 15:56:09 +00:00
|
|
|
extern crate gdk_sys;
|
2017-06-26 07:08:37 +00:00
|
|
|
extern crate alsa;
|
|
|
|
|
|
|
|
// use std::ops::Deref;
|
|
|
|
|
|
|
|
// use std::boxed::Box;
|
|
|
|
// use std::rc::Rc;
|
|
|
|
// use std::sync::Arc;
|
|
|
|
|
|
|
|
use gtk::prelude::*;
|
|
|
|
|
|
|
|
|
2017-06-26 15:56:09 +00:00
|
|
|
use gdk_sys::GDK_KEY_Escape;
|
|
|
|
|
2017-06-27 13:56:33 +00:00
|
|
|
#[macro_use]
|
|
|
|
mod errors;
|
2017-06-26 15:56:09 +00:00
|
|
|
|
2017-06-26 07:08:37 +00:00
|
|
|
mod audio;
|
2017-06-26 15:56:09 +00:00
|
|
|
mod gui;
|
2017-06-27 13:56:33 +00:00
|
|
|
mod debug;
|
2017-06-26 07:08:37 +00:00
|
|
|
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
gtk::init().unwrap();
|
|
|
|
|
2017-06-26 21:52:21 +00:00
|
|
|
flexi_logger::LogOptions::new()
|
|
|
|
.log_to_file(false)
|
|
|
|
// ... your configuration options go here ...
|
|
|
|
.init(Some("info".to_string()))
|
|
|
|
.unwrap_or_else(|e| panic!("Logger initialization failed with {}", e));
|
|
|
|
|
2017-06-26 07:08:37 +00:00
|
|
|
let tray_icon = gtk::StatusIcon::new_from_icon_name("pnmixer");
|
|
|
|
|
|
|
|
let glade_src = include_str!("../data/ui/popup-window-vertical.glade");
|
|
|
|
let builder_popup = gtk::Builder::new_from_string(glade_src);
|
|
|
|
|
2017-06-26 15:56:09 +00:00
|
|
|
{
|
2017-06-27 13:56:33 +00:00
|
|
|
let popup_window: gtk::Window =
|
|
|
|
builder_popup.get_object("popup_window").unwrap();
|
|
|
|
let vol_scale: gtk::Scale =
|
|
|
|
builder_popup.get_object("vol_scale").unwrap();
|
2017-06-26 21:52:21 +00:00
|
|
|
|
|
|
|
tray_icon.connect_activate(move |_| if popup_window.get_visible() {
|
2017-06-27 13:56:33 +00:00
|
|
|
popup_window.hide();
|
|
|
|
} else {
|
|
|
|
popup_window.show_now();
|
|
|
|
vol_scale.grab_focus();
|
|
|
|
gui::grab_devices(&popup_window);
|
|
|
|
});
|
2017-06-26 15:56:09 +00:00
|
|
|
}
|
|
|
|
{
|
2017-06-27 13:56:33 +00:00
|
|
|
let popup_window: gtk::Window =
|
|
|
|
builder_popup.get_object("popup_window").unwrap();
|
|
|
|
let vol_scale_adj: gtk::Adjustment =
|
|
|
|
builder_popup.get_object("vol_scale_adj").unwrap();
|
2017-06-26 15:56:09 +00:00
|
|
|
popup_window.connect_show(move |_| {
|
|
|
|
let alsa_card = audio::get_default_alsa_card();
|
2017-06-27 13:56:33 +00:00
|
|
|
let mixer = try_w!(audio::get_mixer(alsa_card));
|
|
|
|
let selem = try_w!(audio::get_selem_by_name(
|
|
|
|
&mixer,
|
|
|
|
String::from("Master"),
|
|
|
|
));
|
|
|
|
let cur_vol = try_w!(audio::get_vol(selem));
|
|
|
|
gui::set_slider(&vol_scale_adj, cur_vol);
|
2017-06-26 15:56:09 +00:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
2017-06-27 13:56:33 +00:00
|
|
|
let popup_window: gtk::Window =
|
|
|
|
builder_popup.get_object("popup_window").unwrap();
|
2017-06-26 15:56:09 +00:00
|
|
|
popup_window.connect_event(move |w, e| {
|
|
|
|
match gdk::Event::get_event_type(e) {
|
|
|
|
gdk::EventType::GrabBroken => w.hide(),
|
|
|
|
gdk::EventType::KeyPress => {
|
|
|
|
let key: gdk::EventKey = e.clone().downcast().unwrap();
|
|
|
|
if key.get_keyval() == (GDK_KEY_Escape as u32) {
|
|
|
|
w.hide();
|
|
|
|
}
|
2017-06-26 21:52:21 +00:00
|
|
|
}
|
2017-06-26 15:56:09 +00:00
|
|
|
gdk::EventType::ButtonPress => {
|
2017-06-27 13:56:33 +00:00
|
|
|
let device = try_wr!(
|
|
|
|
gtk::get_current_event_device().ok_or(
|
|
|
|
"No current event device!",
|
|
|
|
),
|
|
|
|
Inhibit(false)
|
|
|
|
);
|
2017-06-26 21:52:21 +00:00
|
|
|
let (window, _, _) =
|
|
|
|
gdk::DeviceExt::get_window_at_position(&device);
|
|
|
|
if window.is_none() {
|
|
|
|
w.hide();
|
|
|
|
}
|
|
|
|
}
|
2017-06-26 15:56:09 +00:00
|
|
|
_ => (),
|
2017-06-26 07:08:37 +00:00
|
|
|
}
|
|
|
|
|
2017-06-26 15:56:09 +00:00
|
|
|
return Inhibit(false);
|
|
|
|
});
|
|
|
|
}
|
2017-06-26 07:08:37 +00:00
|
|
|
|
|
|
|
tray_icon.set_visible(true);
|
|
|
|
|
|
|
|
gtk::main();
|
|
|
|
}
|