use std::sync::Arc;
use super::*;
use notify_rust::{Hint, Notification, Urgency};
use arboard::{self, ClearExtLinux, GetExtLinux, SetExtLinux};
pub struct Desktop;
impl Module for Desktop {
fn load(&self, state: &mut State) -> Result<(), LuaError> {
let module = state.lua.create_table()?;
module.set(
"notify",
state.lua.create_function(
|_,
(summary, body, icon, urgent): (
String,
Option<String>,
Option<String>,
Option<bool>,
)| {
let mut n = Notification::new();
n.summary(&summary);
n.body(&body.unwrap_or(String::new()));
n.appname("autosway");
if let Some(true) = urgent {
n.hint(Hint::Urgency(Urgency::Critical));
}
if let Some(icon) = icon {
n.icon(&icon);
}
match n.show() {
Ok(_handle) => {}
Err(e) => return Err(LuaError::external(Arc::new(e))),
}
Ok(())
},
)?,
)?;
module.set(
"get_clipboard",
state.lua.create_function(|_, _: ()| Clipboard::new())?,
)?;
create_module(&state.lua, "autosway.desktop", module)?;
Ok(())
}
}
pub struct Clipboard(arboard::Clipboard);
impl Clipboard {
pub fn new() -> LuaResult<Self> {
match arboard::Clipboard::new() {
Ok(c) => Ok(Self(c)),
Err(e) => Err(LuaError::external(Arc::new(e))),
}
}
}
impl LuaUserData for Clipboard {
fn add_methods<M: LuaUserDataMethods<Self>>(methods: &mut M) {
use arboard::LinuxClipboardKind;
const CT: LinuxClipboardKind = LinuxClipboardKind::Clipboard;
methods.add_method_mut("clear", |_, this, _: ()| {
match this.0.clear_with().clipboard(CT) {
Ok(_) => Ok(()),
Err(e) => Err(LuaError::external(Arc::new(e))),
}
});
methods.add_method_mut("get_text", |_, this, _: ()| {
match this.0.get().clipboard(CT).text() {
Ok(text) => Ok(text),
Err(e) => Err(LuaError::external(Arc::new(e))),
}
});
methods.add_method_mut("set_text", |_, this, text: String| {
match this.0.set().clipboard(CT).text(text) {
Ok(_) => Ok(()),
Err(e) => Err(LuaError::external(Arc::new(e))),
}
});
methods.add_method_mut(
"set_html",
|_, this, (html, alt): (String, Option<String>)| match this
.0
.set()
.clipboard(CT)
.html(html, alt)
{
Ok(_) => Ok(()),
Err(e) => Err(LuaError::external(Arc::new(e))),
},
);
}
}