summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Gesang <phg@phi-gamma.net>2021-12-08 19:55:20 +0100
committerPhilipp Gesang <phg@phi-gamma.net>2021-12-08 19:49:22 +0100
commit2bb98ae1f837f4d09f282886b5d6d184e8726207 (patch)
treef76624793c62a3c47ef21d9ffc08c90696d1fd03
parent480435ff68a910eabc011e44f5a63b43536a4d02 (diff)
downloadvtcol-2bb98ae1f837f4d09f282886b5d6d184e8726207.tar.gz
add KDGETLED subcommand to vtcol-bin
Actually we add both subcommand and sub-subcommand. Example: [*] 15:52:40 phg@acheron vtcol $ vtcol leds get Caps: false, Num: true, Scroll: false
-rw-r--r--src/lib.rs28
-rw-r--r--src/vtcol.rs60
2 files changed, 86 insertions, 2 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 681177c..2ef43e8 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -165,7 +165,7 @@ pub struct KbLedState(u8);
impl KbLedState
{
- fn new(cap: bool, num: bool, scr: bool) -> Self
+ pub fn new(cap: bool, num: bool, scr: bool) -> Self
{
let mut state = 0u8;
@@ -175,6 +175,32 @@ impl KbLedState
Self(state)
}
+
+ #[inline]
+ pub fn get(con: &Console) -> io::Result<Self> { ioctl::kdgetled(con) }
+
+ #[inline]
+ pub fn cap(&self) -> bool { (self.0 & 0x4) != 0 }
+
+ #[inline]
+ pub fn num(&self) -> bool { (self.0 & 0x2) != 0 }
+
+ #[inline]
+ pub fn scr(&self) -> bool { (self.0 & 0x1) != 0 }
+}
+
+impl fmt::Display for KbLedState
+{
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result
+ {
+ write!(
+ f,
+ "caps: {}, num: {}, scroll: {}",
+ self.cap(),
+ self.num(),
+ self.scr()
+ )
+ }
}
impl From<libc::c_char> for KbLedState
diff --git a/src/vtcol.rs b/src/vtcol.rs
index c879641..99846be 100644
--- a/src/vtcol.rs
+++ b/src/vtcol.rs
@@ -1,6 +1,6 @@
pub mod lib;
-use vtcol::{Console, Fade, Palette, Scheme};
+use vtcol::{Console, Fade, KbLedState, Palette, Scheme};
use anyhow::{anyhow, Result};
use std::{io::{self, BufWriter},
@@ -21,6 +21,13 @@ macro_rules! vrb {
/* struct Job -- Runtime parameters.
*/
#[derive(Debug)]
+enum LedJob
+{
+ Get(bool),
+ Set,
+}
+
+#[derive(Debug)]
enum Job
{
/** List available schemes. */
@@ -35,6 +42,8 @@ enum Job
Toggle(Scheme, Scheme),
/** Fade from current scheme to another. */
Fade(Option<Scheme>, Scheme, Duration, u8, bool),
+ /** Keyboard LED ops. */
+ Leds(LedJob),
}
impl<'a> Job
@@ -170,6 +179,22 @@ impl<'a> Job
.takes_value(true),
),
)
+ .subcommand(
+ SubCommand::with_name("leds")
+ .about("operations regarding keyboard LEDs")
+ .subcommand(
+ SubCommand::with_name("get")
+ .about("get keyboard LED state")
+ .arg(
+ Arg::with_name("u8")
+ .value_name("NAME")
+ .short("8")
+ .long("u8")
+ .help("output raw state as integer")
+ .takes_value(false),
+ ),
+ ),
+ )
.arg(
Arg::with_name("verbose")
.short("v")
@@ -262,6 +287,20 @@ impl<'a> Job
)),
}
},
+ ("leds", Some(subm)) =>
+ match subm.subcommand() {
+ ("get", Some(subm)) => {
+ let raw = subm.is_present("u8");
+ Ok(Self::Leds(LedJob::Get(raw)))
+ },
+ (junk, _) =>
+ Err(anyhow!(
+ "invalid sub-subcommand to leds: [{}]; try ``{} \
+ leds --help``",
+ junk,
+ clap::crate_name!()
+ )),
+ },
(junk, _) =>
Err(anyhow!(
"invalid subcommand [{}]; try ``{} --help``",
@@ -328,6 +367,8 @@ impl<'a> Job
Self::Toggle(one, two) => Self::toggle_scheme(one, two)?,
Self::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!(),
}
Ok(())
@@ -403,6 +444,23 @@ impl<'a> Job
fade.commence(&fd)?;
Ok(())
}
+
+ /** Get the keyboard led state. */
+ fn get_leds(raw: bool) -> Result<()>
+ {
+ let fd = Console::current()?;
+ vrb!("console fd: {}", fd);
+
+ let leds = KbLedState::get(&fd)?;
+
+ if raw {
+ println!("{}", u8::from(leds));
+ } else {
+ println!("{}", leds);
+ }
+
+ Ok(())
+ }
} /* [impl Job] */
fn main() -> Result<()>