From 99c3480323f2df0c1cd455e2e03e832c1196050a Mon Sep 17 00:00:00 2001 From: Andreas Grois Date: Wed, 7 Apr 2021 21:29:02 +0200 Subject: First semi-working implementation. --- clock/.cargo/config | 2 ++ clock/.gitignore | 4 +++ clock/Cargo.toml | 16 ++++++++++ clock/src/lib.rs | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 109 insertions(+) create mode 100644 clock/.cargo/config create mode 100644 clock/.gitignore create mode 100644 clock/Cargo.toml create mode 100644 clock/src/lib.rs (limited to 'clock') diff --git a/clock/.cargo/config b/clock/.cargo/config new file mode 100644 index 0000000..d046680 --- /dev/null +++ b/clock/.cargo/config @@ -0,0 +1,2 @@ +[build] +rustflags = ["-C", "prefer-dynamic"] diff --git a/clock/.gitignore b/clock/.gitignore new file mode 100644 index 0000000..db08ac5 --- /dev/null +++ b/clock/.gitignore @@ -0,0 +1,4 @@ +/target +Cargo.lock +*~ +*.swp diff --git a/clock/Cargo.toml b/clock/Cargo.toml new file mode 100644 index 0000000..2215005 --- /dev/null +++ b/clock/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "swaystatus-clock" +version = "0.1.0" +authors = ["Andreas Grois "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +swaystatus-plugin = { path = '../swaystatus-plugin', version = '*'} +serde = { version = "1.0", features = ["derive"] } +erased-serde = "0.3" +chrono = { version = "0.4", features = ["serde"] } + +[lib] +crate-type = ["dylib"] diff --git a/clock/src/lib.rs b/clock/src/lib.rs new file mode 100644 index 0000000..b3ad0e8 --- /dev/null +++ b/clock/src/lib.rs @@ -0,0 +1,87 @@ +use serde::{Serialize, Deserialize}; +use swaystatus_plugin::*; +use std::sync::mpsc::*; + +pub struct ClockPlugin; +pub struct ClockRunnable<'c> { + config : &'c ClockConfig, + from_main : Receiver, + to_main : Box +} + +impl<'c> SwayStatusModuleRunnable for ClockRunnable<'c> { + fn run(&self) { + for i in 0..4 { + println!("Sending Error {}",i); + self.to_main.send_update(Err(PluginError::PrintToStdErr(format!("Hello {}", i)))).unwrap(); + std::thread::sleep(std::time::Duration::from_secs(2)); + } + } +} + +#[derive(Serialize, Deserialize)] +#[serde(rename_all = "PascalCase",default)] +struct ClockConfig { + format : String, + refresh_rate : f32 +} + +impl Default for ClockConfig { + fn default() -> Self { + ClockConfig { + format : String::from("%R"), + refresh_rate : 1.0 + } + } +} + +impl SwayStatusModuleInstance for ClockConfig { + fn make_runnable<'p>(&'p self, to_main : Box) -> (Box, Box) { + let (sender_from_main, from_main) = channel(); + let runnable = ClockRunnable { + config : &self, + from_main, + to_main + }; + let s = SenderForMain(sender_from_main); + (Box::new(runnable), Box::new(s)) + } +} + +impl SwayStatusModule for ClockPlugin { + fn get_name(&self) -> &str { + "ClockPlugin" + } + fn deserialize_config<'de>(&self, deserializer : &mut (dyn erased_serde::Deserializer + 'de)) -> Result, erased_serde::Error> { + let result : ClockConfig = erased_serde::deserialize(deserializer)?; + Ok(Box::new(result)) + } + fn get_default_config(&self) -> Box { + let config = ClockConfig::default(); + Box::new(config) + } +} + +impl ClockPlugin { + fn new() -> ClockPlugin { + ClockPlugin + } +} + +enum MessagesFromMain { + Quit, + Refresh +} + +struct SenderForMain(Sender); + +impl MsgMainToModule for SenderForMain { + fn send_quit(&self) -> Result<(),()> { + self.0.send(MessagesFromMain::Quit).map_err(|_| ()) + } + fn send_refresh(&self) -> Result<(),()> { + self.0.send(MessagesFromMain::Refresh).map_err(|_| ()) + } +} + +declare_swaystatus_module!(ClockPlugin, ClockPlugin::new); -- cgit v1.2.3