diff options
author | Philipp Gesang <phg@phi-gamma.net> | 2021-12-12 00:42:47 +0100 |
---|---|---|
committer | Philipp Gesang <phg@phi-gamma.net> | 2021-12-12 00:42:52 +0100 |
commit | 951df26618973a74d8c68a80634f965c23ba0734 (patch) | |
tree | f7198bec0e5eb6da8606b0f74c475fbfc9bfd53d /src | |
parent | 7426d6278f640d1b0c541586013329f9132a7a5f (diff) | |
download | vtcol-951df26618973a74d8c68a80634f965c23ba0734.tar.gz |
bin: implement “leds set” subcommand
Currently only supports setting the raw state from an integer
value:
$ vtcol leds set -8 2
Diffstat (limited to 'src')
-rw-r--r-- | src/lib.rs | 28 | ||||
-rw-r--r-- | src/vtcol.rs | 39 |
2 files changed, 61 insertions, 6 deletions
@@ -160,7 +160,7 @@ pub mod ioctl } } -#[derive(Debug)] +#[derive(Clone, Copy, Debug)] pub struct KbLedState(u8); impl KbLedState @@ -180,6 +180,12 @@ impl KbLedState pub fn get(con: &Console) -> io::Result<Self> { ioctl::kdgetled(con) } #[inline] + pub fn set(&self, con: &Console) -> io::Result<()> + { + ioctl::kdsetled(con, Some(*self)) + } + + #[inline] pub fn cap(&self) -> bool { (self.0 & 0x4) != 0 } #[inline] @@ -221,6 +227,26 @@ impl From<KbLedState> for u8 fn from(state: KbLedState) -> Self { state.0 } } +impl TryFrom<u8> for KbLedState +{ + type Error = io::Error; + + fn try_from(val: u8) -> io::Result<Self> + { + if val <= 0b111 { + Ok(Self(val)) + } else { + Err(io::Error::new( + io::ErrorKind::Other, + format!( + "invalid raw led value: {:#b}; must not exceed 3 b", + val + ), + )) + } + } +} + #[cfg(test)] mod kb_led_state { diff --git a/src/vtcol.rs b/src/vtcol.rs index e9f9c2b..2fdec10 100644 --- a/src/vtcol.rs +++ b/src/vtcol.rs @@ -24,7 +24,7 @@ enum LedJob /** Get keyboard LED state. */ Get(bool), /** Set keyboard LED state. */ - Set, + Set(KbLedState), } #[derive(Debug)] @@ -212,15 +212,27 @@ impl<'a> Job .about("operations regarding keyboard LEDs") .subcommand( SubCommand::with_name("get") - .about("get keyboard LED state") + .about("get LED state") .arg( Arg::with_name("u8") - .value_name("NAME") .short("8") .long("u8") .help("output raw state as integer") .takes_value(false), ), + ) + .subcommand( + SubCommand::with_name("set") + .about("set LED state") + .arg( + Arg::with_name("u8") + .short("8") + .long("u8") + .help("provide desired state as integer") + .takes_value(true) + .required(true) + .value_name("STATE"), + ), ), ); @@ -336,6 +348,11 @@ impl<'a> Job let raw = subm.is_present("u8"); Ok(Self::Leds(LedJob::Get(raw))) }, + ("set", Some(subm)) => { + let st: u8 = subm.value_of("u8").unwrap().parse()?; + let st = KbLedState::try_from(st)?; + Ok(Self::Leds(LedJob::Set(st))) + }, (junk, _) => Err(anyhow!( "invalid sub-subcommand to leds: [{}]; try ``{} \ @@ -413,7 +430,7 @@ impl<'a> Job Self::Colors(ColorJob::Fade(from, to, ms, hz, clear)) => Self::fade(from, to, ms, hz, clear)?, Self::Leds(LedJob::Get(raw)) => Self::get_leds(raw)?, - Self::Leds(LedJob::Set) => unimplemented!(), + Self::Leds(LedJob::Set(st)) => Self::set_leds(st)?, } Ok(()) @@ -490,7 +507,7 @@ impl<'a> Job Ok(()) } - /** Get the keyboard led state. */ + /** Get the keyboard LED state. */ fn get_leds(raw: bool) -> Result<()> { let fd = Console::current()?; @@ -506,6 +523,18 @@ impl<'a> Job Ok(()) } + + /** Set the keyboard LED state. */ + fn set_leds(st: KbLedState) -> Result<()> + { + let fd = Console::current()?; + vrb!("console fd: {}", fd); + + st.set(&fd)?; + vrb!("applied"); + + Ok(()) + } } /* [impl Job] */ fn main() -> Result<()> |