From 16094de2cf5e4d504bdb3e3e801a196cb8748928 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Wed, 29 Dec 2021 22:44:10 -0800 Subject: [PATCH] Instantiate Duration on deserialization --- Cargo.lock | 116 +++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/config/key_action.rs | 12 ++-- src/event_handler.rs | 6 +- 4 files changed, 127 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c3a106c..b62a83a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -119,6 +119,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", + "serde", + "winapi", +] + [[package]] name = "concurrent-queue" version = "1.2.2" @@ -128,6 +141,41 @@ dependencies = [ "cache-padded", ] +[[package]] +name = "darling" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0d720b8683f8dd83c65155f0530560cba68cd2bf395f6513a483caee57ff7f4" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a340f241d2ceed1deb47ae36c4144b2707ec7dd0b649f894cb39bb595986324" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72c41b3b7352feb3211a0d743dc5700a4e3b60f51bd2b368892d1e0f9a95f44b" +dependencies = [ + "darling_core", + "quote", + "syn", +] + [[package]] name = "derivative" version = "2.2.0" @@ -215,6 +263,12 @@ dependencies = [ "instant", ] +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + [[package]] name = "funty" version = "1.2.0" @@ -361,6 +415,12 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "indexmap" version = "1.7.0" @@ -483,6 +543,25 @@ dependencies = [ "memoffset", ] +[[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 = "object" version = "0.27.1" @@ -601,6 +680,12 @@ version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" +[[package]] +name = "rustversion" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f" + [[package]] name = "ryu" version = "1.0.9" @@ -655,6 +740,30 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_with" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad6056b4cb69b6e43e3a0f055def223380baecc99da683884f205bf347f7c4b3" +dependencies = [ + "chrono", + "rustversion", + "serde", + "serde_with_macros", +] + +[[package]] +name = "serde_with_macros" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12e47be9471c72889ebafb5e14d5ff930d89ae7a67bbdb5f8abb564f845a927e" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "serde_yaml" version = "0.8.23" @@ -689,6 +798,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "swayipc" version = "2.7.2" @@ -863,6 +978,7 @@ dependencies = [ "nix 0.23.1", "serde", "serde_json", + "serde_with", "serde_yaml", "swayipc", "x11", diff --git a/Cargo.toml b/Cargo.toml index dff74ae..3306de3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,6 +17,7 @@ log = "0.4.14" nix = "0.23.1" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" +serde_with = { version = "1.11", features = ["chrono"] } serde_yaml = "0.8" swayipc = "2.7.2" x11_rs = { package = "x11", version = "2.19.1", features = ["xlib"] } diff --git a/src/config/key_action.rs b/src/config/key_action.rs index 96ed6f9..0968222 100644 --- a/src/config/key_action.rs +++ b/src/config/key_action.rs @@ -1,6 +1,8 @@ use crate::config::key::deserialize_key; use evdev::Key; use serde::Deserialize; +use serde_with::{serde_as, DurationMilliSeconds}; +use std::time::Duration; // Values in `modmap.remap` #[derive(Clone, Debug, Deserialize)] @@ -11,16 +13,18 @@ pub enum KeyAction { MultiPurposeKey(MultiPurposeKey), } +#[serde_as] #[derive(Clone, Debug, Deserialize)] pub struct MultiPurposeKey { #[serde(deserialize_with = "deserialize_key")] pub held: Key, #[serde(deserialize_with = "deserialize_key")] pub alone: Key, - #[serde(default = "default_alone_timeout_millis")] - pub alone_timeout_millis: u64, + #[serde_as(as = "DurationMilliSeconds")] + #[serde(default = "default_alone_timeout", rename = "alone_timeout_millis")] + pub alone_timeout: Duration, } -fn default_alone_timeout_millis() -> u64 { - 1000 +fn default_alone_timeout() -> Duration { + Duration::from_millis(1000) } diff --git a/src/event_handler.rs b/src/event_handler.rs index 8d9e608..7def18d 100644 --- a/src/event_handler.rs +++ b/src/event_handler.rs @@ -10,7 +10,7 @@ use lazy_static::lazy_static; use log::debug; use std::collections::HashMap; use std::error::Error; -use std::time::{Duration, Instant}; +use std::time::Instant; pub struct EventHandler { device: VirtualDevice, @@ -92,9 +92,7 @@ impl EventHandler { MultiPurposeKeyState { held: multi_purpose_key.held, alone: multi_purpose_key.alone, - alone_timeout_at: Some( - Instant::now() + Duration::from_millis(multi_purpose_key.alone_timeout_millis), - ), + alone_timeout_at: Some(Instant::now() + multi_purpose_key.alone_timeout), }, ); return vec![]; // delay the press