pnmixer-rust/src/gui_callbacks.rs

128 lines
3.8 KiB
Rust
Raw Normal View History

2017-06-27 22:23:12 +00:00
extern crate gtk;
extern crate gtk_sys;
extern crate gdk;
extern crate gdk_sys;
extern crate alsa;
extern crate std;
use gtk::prelude::*;
use gdk_sys::GDK_KEY_Escape;
use gui;
use app_state::*;
use errors::*;
2017-06-28 12:55:38 +00:00
use std::cell::RefCell;
use std::rc::Rc;
2017-06-27 22:23:12 +00:00
2017-06-28 12:55:38 +00:00
pub fn init<'a>(appstate: &'a AppS, rc_acard: Rc<RefCell<AlsaCard>>) {
2017-06-27 22:23:12 +00:00
init_tray_icon(&appstate);
2017-06-28 12:55:38 +00:00
init_popup_window(&appstate, rc_acard);
2017-06-27 22:23:12 +00:00
}
fn init_tray_icon(appstate: &AppS) {
let ref tray_icon = appstate.status_icon;
let popup_window: gtk::Window =
appstate.builder_popup.get_object("popup_window").unwrap();
let vol_scale: gtk::Scale =
appstate.builder_popup.get_object("vol_scale").unwrap();
tray_icon.connect_activate(move |_| if popup_window.get_visible() {
2017-06-28 12:55:38 +00:00
popup_window.hide();
} else {
popup_window.show_now();
vol_scale.grab_focus();
try_w!(gui::grab_devices(&popup_window));
});
2017-06-27 22:23:12 +00:00
tray_icon.set_visible(true);
}
2017-06-28 12:55:38 +00:00
fn init_popup_window(appstate: &AppS, rc_acard: Rc<RefCell<AlsaCard>>) {
2017-06-27 22:23:12 +00:00
/* popup_window.connect_show */
{
let popup_window: gtk::Window =
appstate.builder_popup.get_object("popup_window").unwrap();
let vol_scale_adj: gtk::Adjustment =
appstate.builder_popup.get_object("vol_scale_adj").unwrap();
let mute_check: gtk::CheckButton =
appstate.builder_popup.get_object("mute_check").unwrap();
2017-06-28 12:55:38 +00:00
let card = rc_acard.clone();
2017-06-27 22:23:12 +00:00
popup_window.connect_show(move |_| {
2017-06-28 12:55:38 +00:00
let acard = card.borrow();
let cur_vol = try_w!(acard.vol());
2017-06-27 22:23:12 +00:00
gui::set_slider(&vol_scale_adj, cur_vol);
2017-06-28 12:55:38 +00:00
let muted = acard.get_mute();
2017-06-27 22:23:12 +00:00
update_mute_check(&mute_check, muted);
});
}
/* mute_check.connect_toggled */
{
let mute_check: gtk::CheckButton =
appstate.builder_popup.get_object("mute_check").unwrap();
2017-06-28 12:55:38 +00:00
let card = rc_acard.clone();
2017-06-27 22:23:12 +00:00
mute_check.connect_toggled(move |_| {
2017-06-28 12:55:38 +00:00
let acard = card.borrow();
let muted = try_w!(acard.get_mute());
let _ = try_w!(acard.set_mute(!muted));
2017-06-27 22:23:12 +00:00
});
}
/* popup_window.connect_event */
{
let popup_window: gtk::Window =
appstate.builder_popup.get_object("popup_window").unwrap();
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();
}
}
gdk::EventType::ButtonPress => {
let device = try_wr!(
gtk::get_current_event_device().ok_or(
"No current event device!",
),
Inhibit(false)
);
let (window, _, _) =
gdk::DeviceExt::get_window_at_position(&device);
if window.is_none() {
w.hide();
}
}
_ => (),
}
return Inhibit(false);
});
}
}
fn update_mute_check(check_button: &gtk::CheckButton, muted: Result<bool>) {
match muted {
Ok(val) => {
check_button.set_active(val);
check_button.set_tooltip_text("");
2017-06-28 12:55:38 +00:00
}
2017-06-27 22:23:12 +00:00
Err(_) => {
/* can't figure out whether channel is muted, grey out */
check_button.set_active(true);
check_button.set_sensitive(false);
check_button.set_tooltip_text("Soundcard has no mute switch");
}
}
}