diff --git a/Cargo.lock b/Cargo.lock index a8b189ee..a7170278 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -108,6 +108,19 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +dependencies = [ + "libc", + "num-integer", + "num-traits", + "time", + "winapi", +] + [[package]] name = "concurrent-queue" version = "1.2.2" @@ -122,6 +135,7 @@ name = "cosmic-panel" version = "0.1.0" dependencies = [ "cascade", + "chrono", "gdk4-x11", "gtk4", "toml", @@ -658,6 +672,25 @@ dependencies = [ "void", ] +[[package]] +name = "num-integer" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +dependencies = [ + "autocfg", +] + [[package]] name = "once_cell" version = "1.8.0" @@ -967,6 +1000,17 @@ dependencies = [ "syn", ] +[[package]] +name = "time" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +dependencies = [ + "libc", + "wasi", + "winapi", +] + [[package]] name = "toml" version = "0.5.8" @@ -1018,6 +1062,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + [[package]] name = "wepoll-ffi" version = "0.1.2" diff --git a/Cargo.toml b/Cargo.toml index 79e5862f..f9373351 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,7 @@ edition = "2018" [dependencies] cascade = "1" +chrono = "0.4" gdk4-x11 = "0.2" gtk4 = "0.2" toml = "0.5" diff --git a/src/main.rs b/src/main.rs index e071161f..cd866df7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,6 +5,8 @@ mod x; fn main() { gtk4::init().unwrap(); + let main_context = glib::MainContext::default(); + let _acquire_guard = main_context.acquire().unwrap(); let display = gdk::Display::default().unwrap(); let monitors = display.monitors().unwrap(); diff --git a/src/window.rs b/src/window.rs index fb7ec907..d0afa2e1 100644 --- a/src/window.rs +++ b/src/window.rs @@ -5,6 +5,16 @@ use gtk4::{gdk, glib, prelude::*}; use crate::x; pub fn window(monitor: gdk::Monitor) -> gtk4::Window { + let time_button = cascade! { + gtk4::MenuButton::new(); + ..set_popover(Some(&cascade! { + gtk4::Popover::new(); + ..set_child(Some(&cascade! { + gtk4::Calendar::new(); + })); + })); + }; + let box_ = cascade! { gtk4::CenterBox::new(); ..set_start_widget(Some(&cascade! { @@ -12,16 +22,7 @@ pub fn window(monitor: gdk::Monitor) -> gtk4::Window { ..append(>k4::Button::with_label("Workspaces")); ..append(>k4::Button::with_label("Applications")); })); - ..set_center_widget(Some(&cascade! { - gtk4::MenuButton::new(); - ..set_label("Jan 1 00:00 AM"); - ..set_popover(Some(&cascade! { - gtk4::Popover::new(); - ..set_child(Some(&cascade! { - gtk4::Calendar::new(); - })); - })); - })); + ..set_center_widget(Some(&time_button)); }; let window = cascade! { @@ -31,6 +32,23 @@ pub fn window(monitor: gdk::Monitor) -> gtk4::Window { ..show(); }; + fn update_time(time_button: >k4::MenuButton) { + // TODO: Locale-based formatting? + let time = chrono::Local::now(); + time_button.set_label(&time.format("%b %-d %-I:%M %p").to_string()); + // time.format("%B %-d %Y") + } + + // TODO: better way to do this? + glib::timeout_add_seconds_local( + 1, + clone!(@weak time_button => @default-return glib::Continue(false), move || { + update_time(&time_button); + glib::Continue(true) + }), + ); + update_time(&time_button); + fn monitor_geometry_changed(window: >k4::Window, monitor: &gdk::Monitor) { let geometry = monitor.geometry(); window.set_size_request(geometry.width, 0);