feat: indicate locked/latched state with capslock led

This commit is contained in:
Himadri Bhattacharjee
2026-01-10 11:41:55 +05:30
parent d7a2cff639
commit 21ca4b999a
2 changed files with 21 additions and 11 deletions

14
Cargo.lock generated
View File

@@ -52,7 +52,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
[[package]]
name = "kwargs"
name = "libc"
version = "0.2.180"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc"
[[package]]
name = "lollipop"
version = "0.1.0"
dependencies = [
"evdev",
@@ -60,12 +66,6 @@ dependencies = [
"tokio",
]
[[package]]
name = "libc"
version = "0.2.180"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc"
[[package]]
name = "mio"
version = "1.1.1"

View File

@@ -1,4 +1,4 @@
use evdev::{Device, InputEvent, KeyEvent};
use evdev::{Device, InputEvent, KeyEvent, LedCode, LedEvent};
use std::collections::BTreeMap;
use std::fmt::Debug;
use std::time::{Duration, SystemTime};
@@ -83,6 +83,14 @@ impl InternalState {
Some(events)
}
fn led_state(&self) -> i32 {
if self.map.values().any(|v| !matches!(v, KeyState::None)) {
i32::MAX
} else {
0
}
}
}
fn pick_device() -> Option<Device> {
@@ -94,11 +102,11 @@ fn pick_device() -> Option<Device> {
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let Some(mut d) = pick_device() else {
let (Some(mut d), Some(mut led_sink)) = (pick_device(), pick_device()) else {
return Ok(());
};
while !d.is_grabbed() {
println!("trying to grab");
// println!("trying to grab");
let _ = d.grab();
}
@@ -133,9 +141,11 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
match events.next_event().await?.destructure() {
evdev::EventSummary::Key(key_event, key_code, pressed) => {
if let Some(events) = state.morph(key_code, pressed, key_event.timestamp()) {
println!("{state:#?}");
// println!("{state:#?}");
device.emit(&events)?;
};
led_sink.send_events(&[*LedEvent::new(LedCode::LED_CAPSL, state.led_state())])?;
}
_ => {}
}