srhd 0.1.0

A lightweight and performant hotkey daemon for MacOS
Documentation
use rdev::{listen, Event};

use crate::config::{Config, Mods};

pub struct HeldKeys {
    pub keys: Vec<rdev::Key>,
    pub mods: Vec<Mods>,
}

impl HeldKeys {
    fn new() -> Self {
        HeldKeys {
            keys: vec![],
            mods: vec![],
        }
    }

    fn remove(&mut self, key: rdev::Key) {
        use rdev::Key::*;
        match key {
            ControlLeft | ControlRight => self.mods.retain(|e| *e != Mods::Control),
            ShiftLeft | ShiftRight => self.mods.retain(|e| *e != Mods::Shift),
            Alt => self.mods.retain(|e| *e != Mods::Option),
            MetaLeft | MetaRight => self.mods.retain(|e| *e != Mods::Command),
            other => self.keys.retain(|e| *e != other),
        };
    }

    fn push(&mut self, key: rdev::Key) {
        use rdev::Key::*;
        match key {
            ControlLeft | ControlRight => self.mods.push(Mods::Control),
            ShiftLeft | ShiftRight => self.mods.push(Mods::Shift),
            Alt => self.mods.push(Mods::Option),
            MetaLeft | MetaRight => self.mods.push(Mods::Command),
            other => self.keys.push(other),
        };
    }
}

pub fn srhd_process() {
    let config = Config::load();
    let mut keys: HeldKeys = HeldKeys::new();

    let callback = move |event: Event| match event.event_type {
        rdev::EventType::KeyRelease(key) => {
            keys.remove(key);
        }
        rdev::EventType::KeyPress(key) => {
            keys.push(key);
            config.execute_commands(&keys);
        }
        _ => {}
    };

    if let Err(error) = listen(callback) {
        println!("Error: {:?}", error)
    }
}