Blah
This commit is contained in:
parent
45cdc5f9ca
commit
3b943131df
@ -24,6 +24,7 @@ serde_derive = "^1.0.9"
|
|||||||
toml = "^0.4.2"
|
toml = "^0.4.2"
|
||||||
which = "*"
|
which = "*"
|
||||||
xdg = "*"
|
xdg = "*"
|
||||||
|
libnotify = { path = "3rdparty/rust-libnotify" }
|
||||||
|
|
||||||
[dependencies.gtk]
|
[dependencies.gtk]
|
||||||
git = "https://github.com/gtk-rs/gtk.git"
|
git = "https://github.com/gtk-rs/gtk.git"
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
use audio::Audio;
|
use audio::Audio;
|
||||||
use errors::*;
|
use errors::*;
|
||||||
use gtk;
|
use gtk;
|
||||||
|
use notif;
|
||||||
use prefs::*;
|
use prefs::*;
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
|
use std::rc::Rc;
|
||||||
use ui_entry::Gui;
|
use ui_entry::Gui;
|
||||||
use ui_prefs_dialog::show_prefs_dialog;
|
|
||||||
use notif::*;
|
|
||||||
|
|
||||||
|
|
||||||
// TODO: notify popups
|
// TODO: notify popups
|
||||||
@ -18,7 +18,6 @@ pub struct AppS {
|
|||||||
_cant_construct: (),
|
_cant_construct: (),
|
||||||
pub gui: Gui,
|
pub gui: Gui,
|
||||||
pub audio: Audio,
|
pub audio: Audio,
|
||||||
pub notif: Notif,
|
|
||||||
pub prefs: RefCell<Prefs>,
|
pub prefs: RefCell<Prefs>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -44,13 +43,12 @@ impl AppS {
|
|||||||
.channel
|
.channel
|
||||||
.clone();
|
.clone();
|
||||||
|
|
||||||
let notif = Notif::new(&prefs.borrow());
|
// let notif = Notif::new(&prefs.borrow());
|
||||||
|
|
||||||
return AppS {
|
return AppS {
|
||||||
_cant_construct: (),
|
_cant_construct: (),
|
||||||
gui,
|
gui,
|
||||||
audio: Audio::new(Some(card_name), Some(chan_name)).unwrap(),
|
audio: Audio::new(Some(card_name), Some(chan_name)).unwrap(),
|
||||||
notif,
|
|
||||||
prefs,
|
prefs,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
use alsa;
|
use alsa;
|
||||||
use glib;
|
use glib;
|
||||||
|
use libnotify;
|
||||||
use std::convert::From;
|
use std::convert::From;
|
||||||
use std;
|
use std;
|
||||||
use toml;
|
use toml;
|
||||||
@ -11,6 +12,7 @@ error_chain! {
|
|||||||
Alsa(alsa::Error);
|
Alsa(alsa::Error);
|
||||||
IO(std::io::Error);
|
IO(std::io::Error);
|
||||||
Toml(toml::de::Error);
|
Toml(toml::de::Error);
|
||||||
|
Libnotify(libnotify::errors::Error);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
28
src/main.rs
28
src/main.rs
@ -29,6 +29,7 @@ extern crate gtk_sys;
|
|||||||
extern crate libc;
|
extern crate libc;
|
||||||
extern crate which;
|
extern crate which;
|
||||||
extern crate xdg;
|
extern crate xdg;
|
||||||
|
extern crate libnotify;
|
||||||
|
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
|
||||||
@ -41,16 +42,19 @@ mod glade_helpers;
|
|||||||
mod alsa_card;
|
mod alsa_card;
|
||||||
mod app_state;
|
mod app_state;
|
||||||
mod audio;
|
mod audio;
|
||||||
mod ui_entry;
|
|
||||||
mod ui_popup_menu;
|
|
||||||
mod ui_popup_window;
|
|
||||||
mod ui_prefs_dialog;
|
|
||||||
mod ui_tray_icon;
|
|
||||||
mod prefs;
|
mod prefs;
|
||||||
mod support_alsa;
|
mod support_alsa;
|
||||||
mod support_audio;
|
mod support_audio;
|
||||||
mod support_cmd;
|
mod support_cmd;
|
||||||
mod support_ui;
|
mod support_ui;
|
||||||
|
mod ui_entry;
|
||||||
|
mod ui_popup_menu;
|
||||||
|
mod ui_popup_window;
|
||||||
|
mod ui_prefs_dialog;
|
||||||
|
mod ui_tray_icon;
|
||||||
|
mod notif;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
use app_state::*;
|
use app_state::*;
|
||||||
|
|
||||||
@ -59,6 +63,19 @@ use app_state::*;
|
|||||||
fn main() {
|
fn main() {
|
||||||
gtk::init().unwrap();
|
gtk::init().unwrap();
|
||||||
|
|
||||||
|
libnotify::init("PNMixer-rs").unwrap();
|
||||||
|
|
||||||
|
{
|
||||||
|
// Create a new notification and show it
|
||||||
|
let n = libnotify::Notification::new("Summary", Some("Optional Body"), None)
|
||||||
|
.unwrap();
|
||||||
|
n.show().unwrap();
|
||||||
|
// You can also use the .show() convenience method on the context
|
||||||
|
n.update("I am another notification", None, None).unwrap();
|
||||||
|
n.show().unwrap();
|
||||||
|
// we are done, deinit
|
||||||
|
}
|
||||||
|
|
||||||
flexi_logger::LogOptions::new()
|
flexi_logger::LogOptions::new()
|
||||||
.log_to_file(false)
|
.log_to_file(false)
|
||||||
// ... your configuration options go here ...
|
// ... your configuration options go here ...
|
||||||
@ -70,4 +87,5 @@ fn main() {
|
|||||||
ui_entry::init(apps);
|
ui_entry::init(apps);
|
||||||
|
|
||||||
gtk::main();
|
gtk::main();
|
||||||
|
libnotify::uninit();
|
||||||
}
|
}
|
||||||
|
148
src/notif.rs
Normal file
148
src/notif.rs
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
use app_state::*;
|
||||||
|
use audio::*;
|
||||||
|
use gtk::DialogExt;
|
||||||
|
use gtk::MessageDialogExt;
|
||||||
|
use gtk::WidgetExt;
|
||||||
|
use gtk::WindowExt;
|
||||||
|
use gtk;
|
||||||
|
use gtk_sys::{GTK_DIALOG_DESTROY_WITH_PARENT, GTK_RESPONSE_YES};
|
||||||
|
use prefs::*;
|
||||||
|
use std::cell::Cell;
|
||||||
|
use std::cell::RefCell;
|
||||||
|
use std::rc::Rc;
|
||||||
|
use support_audio::*;
|
||||||
|
use support_ui::*;
|
||||||
|
use ui_popup_menu::*;
|
||||||
|
use ui_popup_window::*;
|
||||||
|
use ui_prefs_dialog::*;
|
||||||
|
use ui_tray_icon::*;
|
||||||
|
use errors::*;
|
||||||
|
|
||||||
|
use libnotify;
|
||||||
|
use std::thread;
|
||||||
|
use std::time::Duration;
|
||||||
|
use glib::Variant;
|
||||||
|
use glib::prelude::*;
|
||||||
|
|
||||||
|
|
||||||
|
pub struct Notif {
|
||||||
|
enabled: Cell<bool>,
|
||||||
|
from_popup: Cell<bool>,
|
||||||
|
from_tray: Cell<bool>,
|
||||||
|
// TODO: from hotkey
|
||||||
|
|
||||||
|
from_external: Cell<bool>,
|
||||||
|
|
||||||
|
volume_notif: libnotify::Notification,
|
||||||
|
text_notif: libnotify::Notification,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Notif {
|
||||||
|
pub fn new(prefs: &Prefs) -> Result<Self> {
|
||||||
|
let notif = Notif {
|
||||||
|
enabled: Cell::new(false),
|
||||||
|
from_popup: Cell::new(false),
|
||||||
|
from_tray: Cell::new(false),
|
||||||
|
from_external: Cell::new(false),
|
||||||
|
|
||||||
|
volume_notif: libnotify::Notification::new("", None, None).unwrap(),
|
||||||
|
text_notif: libnotify::Notification::new("", None, None).unwrap(),
|
||||||
|
};
|
||||||
|
|
||||||
|
notif.reload(prefs)?;
|
||||||
|
|
||||||
|
return Ok(notif);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn reload(&self, prefs: &Prefs) -> Result<()> {
|
||||||
|
let timeout = prefs.notify_prefs.notifcation_timeout;
|
||||||
|
|
||||||
|
self.enabled.set(prefs.notify_prefs.enable_notifications);
|
||||||
|
self.enabled.set(prefs.notify_prefs.notify_popup);
|
||||||
|
self.enabled.set(prefs.notify_prefs.notify_mouse_scroll);
|
||||||
|
self.enabled.set(prefs.notify_prefs.notify_external);
|
||||||
|
|
||||||
|
self.volume_notif
|
||||||
|
.set_notification_timeout(timeout as i32);
|
||||||
|
self.volume_notif
|
||||||
|
.set_hint("x-canonical-private-synchronous", Some("".to_variant()))?;
|
||||||
|
|
||||||
|
|
||||||
|
self.text_notif
|
||||||
|
.set_notification_timeout(timeout as i32);
|
||||||
|
self.text_notif
|
||||||
|
.set_hint("x-canonical-private-synchronous", Some("".to_variant()))?;
|
||||||
|
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn show_volume_notif(&self, audio: &Audio) -> Result<()> {
|
||||||
|
let vol = audio.vol()?;
|
||||||
|
let vol_level = audio.vol_level();
|
||||||
|
|
||||||
|
let icon = {
|
||||||
|
match vol_level {
|
||||||
|
VolLevel::Muted => "audio-volume-muted",
|
||||||
|
VolLevel::Off => "audio-volume-off",
|
||||||
|
VolLevel::Low => "audio-volume-low",
|
||||||
|
VolLevel::Medium => "audio-volume-medium",
|
||||||
|
VolLevel::High => "audio-volume-high",
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let summary = {
|
||||||
|
match vol_level {
|
||||||
|
VolLevel::Muted => String::from("Volume muted"),
|
||||||
|
_ => {
|
||||||
|
format!("{} ({})\nVolume: {}",
|
||||||
|
audio.acard.borrow().card_name()?,
|
||||||
|
audio.acard.borrow().chan_name()?,
|
||||||
|
vol)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
self.volume_notif
|
||||||
|
.update(summary.as_str(), None, Some(icon))?;
|
||||||
|
self.volume_notif
|
||||||
|
.set_hint("value", Some(vol.to_variant()))?;
|
||||||
|
self.volume_notif.show()?;
|
||||||
|
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
pub fn show_text_notif(&self, summary: &str, body: &str) -> Result<()> {
|
||||||
|
self.text_notif
|
||||||
|
.update(summary, Some(body), None)?;
|
||||||
|
self.text_notif.show()?;
|
||||||
|
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
pub fn init_notify(appstate: Rc<AppS>) {
|
||||||
|
{
|
||||||
|
/* connect handler */
|
||||||
|
let apps = appstate.clone();
|
||||||
|
let notif = try_e!(Notif::new(&apps.prefs.borrow()));
|
||||||
|
appstate.audio.connect_handler(
|
||||||
|
Box::new(move |s, u| match (s, u) {
|
||||||
|
(AudioSignal::CardDisconnected, _) => (),
|
||||||
|
(AudioSignal::CardError, _) => (),
|
||||||
|
(AudioSignal::ValuesChanged, AudioUser::TrayIcon) => {
|
||||||
|
try_w!(notif.show_volume_notif(&apps.audio))
|
||||||
|
},
|
||||||
|
_ => (),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -6,7 +6,6 @@ use gtk::WidgetExt;
|
|||||||
use gtk::WindowExt;
|
use gtk::WindowExt;
|
||||||
use gtk;
|
use gtk;
|
||||||
use gtk_sys::{GTK_DIALOG_DESTROY_WITH_PARENT, GTK_RESPONSE_YES};
|
use gtk_sys::{GTK_DIALOG_DESTROY_WITH_PARENT, GTK_RESPONSE_YES};
|
||||||
use notif::*;
|
|
||||||
use prefs::*;
|
use prefs::*;
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
@ -15,6 +14,7 @@ use ui_popup_menu::*;
|
|||||||
use ui_popup_window::*;
|
use ui_popup_window::*;
|
||||||
use ui_prefs_dialog::*;
|
use ui_prefs_dialog::*;
|
||||||
use ui_tray_icon::*;
|
use ui_tray_icon::*;
|
||||||
|
use notif::*;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -72,6 +72,7 @@ pub fn init(appstate: Rc<AppS>) {
|
|||||||
init_popup_window(appstate.clone());
|
init_popup_window(appstate.clone());
|
||||||
init_popup_menu(appstate.clone());
|
init_popup_menu(appstate.clone());
|
||||||
init_prefs_callback(appstate.clone());
|
init_prefs_callback(appstate.clone());
|
||||||
|
init_notify(appstate.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user