summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPhilipp Gesang <phg@phi-gamma.net>2021-12-12 00:42:47 +0100
committerPhilipp Gesang <phg@phi-gamma.net>2021-12-12 00:42:52 +0100
commit951df26618973a74d8c68a80634f965c23ba0734 (patch)
treef7198bec0e5eb6da8606b0f74c475fbfc9bfd53d /src
parent7426d6278f640d1b0c541586013329f9132a7a5f (diff)
downloadvtcol-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.rs28
-rw-r--r--src/vtcol.rs39
2 files changed, 61 insertions, 6 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 2ef43e8..6193277 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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<()>