diff --git a/Cargo.lock b/Cargo.lock index d860cf8..986093f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -124,6 +124,26 @@ dependencies = [ "adler32", ] +[[package]] +name = "dirs" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + [[package]] name = "dlib" version = "0.5.0" @@ -178,6 +198,17 @@ dependencies = [ "ttf-parser", ] +[[package]] +name = "getrandom" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + [[package]] name = "gif" version = "0.11.3" @@ -384,6 +415,26 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ae028b272a6e99d9f8260ceefa3caa09300a8d6c8d2b2001316474bc52122e9" +[[package]] +name = "redox_syscall" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom", + "redox_syscall", + "thiserror", +] + [[package]] name = "resvg" version = "0.22.0" @@ -451,6 +502,26 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" +[[package]] +name = "serde" +version = "1.0.137" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.137" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "simplecss" version = "0.2.1" @@ -522,6 +593,37 @@ dependencies = [ "siphasher", ] +[[package]] +name = "syn" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a07e33e919ebcd69113d5be0e4d70c5707004ff45188910106854f38b960df4a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "thiserror" +version = "1.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "time" version = "0.1.44" @@ -547,6 +649,15 @@ dependencies = [ "safe_arch", ] +[[package]] +name = "toml" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +dependencies = [ + "serde", +] + [[package]] name = "ttf-parser" version = "0.15.0" @@ -735,11 +846,14 @@ version = "0.1.0" dependencies = [ "chrono", "resvg", + "serde", "smithay-client-toolkit", "suncalc", "svg", "tiny-skia", + "toml", "usvg", + "xdg", ] [[package]] @@ -751,6 +865,15 @@ dependencies = [ "nom", ] +[[package]] +name = "xdg" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4583db5cbd4c4c0303df2d15af80f0539db703fa1c68802d4cbbd2dd0f88f6" +dependencies = [ + "dirs", +] + [[package]] name = "xml-rs" version = "0.8.4" diff --git a/Cargo.toml b/Cargo.toml index 868a14f..7b5e05c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,3 +11,6 @@ usvg = "0.22" tiny-skia = "0.6" resvg = "0.22" suncalc = "0.4" +toml = "0.5" +serde = { version = "1.0", features = ["derive"] } +xdg = "2.4" \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index ab9ef2c..8024ef8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,7 @@ extern crate smithay_client_toolkit as sctk; use std::fmt; +use std::fs; use std::time::SystemTime; use chrono::prelude::{Local, Utc}; @@ -9,6 +10,7 @@ use chrono::Timelike; use sctk::reexports::client::protocol::{wl_shm, wl_surface}; use sctk::shm::AutoMemPool; use sctk::window::{Event as WEvent, FallbackFrame}; +use serde::Deserialize; use svg::node::element::path::Data as PathData; use svg::node::element::{ Circle, Definitions, Group, Line, Path, Rectangle, Style, Text, TextPath, @@ -23,9 +25,6 @@ const HOUR_NAMES: [&str; 24] = [ "Blossom", "Ladybug", "Geese", "Dust", "Peach", "Fog", "Acorn", "Gourd", "Soup", "Crow", "Mushroom", "Thunder", "Frost", "Lantern", ]; -// TODO: Make these configurable -const LATITUDE: f64 = 47.655235; -const LONGITUDE: f64 = 19.2868815; enum Season { Spring, @@ -49,6 +48,18 @@ impl fmt::Display for Season { } } +#[derive(Deserialize)] +struct Config { + latitude: f64, + longitude: f64, +} + +#[derive(Deserialize)] +#[serde(rename_all = "kebab-case")] +struct CompleteConfig { + seasonal_clock: Config, +} + fn seconds_to_degrees(seconds: i32) -> f32 { seconds as f32 * 360.0 / 86400.0 } @@ -245,7 +256,7 @@ fn get_moon_path(image_width: u32, radius: f32, moon_phase: f64) -> Path { Path::new().set("class", "moon").set("d", path_data) } -fn gen_svg() -> Document { +fn gen_svg(config: &Config) -> Document { let local_timestamp = Local::now(); let utc_hour = local_timestamp.with_timezone(&Utc).time().hour(); let local_hour = local_timestamp.time().hour(); @@ -265,7 +276,7 @@ fn gen_svg() -> Document { let moon_radius = image_width as f32 * 0.071428571; let moon_phase = moon_illumination.phase * 28.0; - let sun_times = suncalc::get_times(unixtime, LATITUDE, LONGITUDE, None); + let sun_times = suncalc::get_times(unixtime, config.latitude, config.longitude, None); let noon = Utc .timestamp_millis(sun_times.solar_noon.0) .time() @@ -594,6 +605,13 @@ fn gen_svg() -> Document { } fn main() { + let xdg_dirs = xdg::BaseDirectories::new().unwrap(); + let config_path = xdg_dirs + .place_config_file("seasonal-clock.toml") + .expect("cannot create configuration directory"); + let data = fs::read_to_string(config_path).expect("Unable to read file"); + let config: CompleteConfig = toml::from_str(&data).unwrap(); + let (env, display, mut queue) = sctk::new_default_environment!(SeasonalClock, desktop) .expect("Unable to connect to a Wayland compositor"); @@ -636,7 +654,13 @@ fn main() { let mut dimensions = (700, 700); if !env.get_shell().unwrap().needs_configure() { - redraw(&mut pool, window.surface(), dimensions).expect("Failed to draw"); + redraw( + &mut pool, + window.surface(), + dimensions, + &config.seasonal_clock, + ) + .expect("Failed to draw"); window.refresh() } @@ -684,7 +708,13 @@ fn main() { if need_redraw { need_redraw = false; - redraw(&mut pool, window.surface(), dimensions).expect("Failed to draw") + redraw( + &mut pool, + window.surface(), + dimensions, + &config.seasonal_clock, + ) + .expect("Failed to draw") } if let Err(e) = display.flush() { @@ -714,8 +744,9 @@ fn redraw( pool: &mut AutoMemPool, surface: &wl_surface::WlSurface, (buf_x, buf_y): (u32, u32), + config: &Config, ) -> Result<(), ::std::io::Error> { - let document = gen_svg(); + let document = gen_svg(config); let bytes = document.to_string(); let mut opt = usvg::Options::default();