pnmixer-rust/src/main.rs

114 lines
3.1 KiB
Rust
Raw Normal View History

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();
}