jay-compositor 1.14.0

The Jay compositor
use {
    crate::{
        evdev::input_event_codes::{InputEventCode, MAX_INPUT_EVENT_CODE},
        utils::{ioctl::ioctl, oserror::OsError},
    },
    uapi::{_IOC_READ, OwnedFd},
};

pub mod input_event_codes;

const EV_KEY: u32 = 0x01;

pub fn eviocgbit_key(fd: &OwnedFd) -> Result<Vec<InputEventCode>, OsError> {
    let mut buf = [0u8; (MAX_INPUT_EVENT_CODE + 1).div_ceil(u8::BITS as usize)];
    let nr = uapi::_IOC(
        _IOC_READ,
        b'E' as _,
        (0x20 + EV_KEY) as _,
        size_of_val(&buf) as _,
    );
    unsafe {
        ioctl(fd.raw(), nr, &mut buf)?;
    }
    let mut res = vec![];
    for (idx, b) in buf.into_iter().enumerate() {
        for bit in 0..u8::BITS {
            if b & (1 << bit) != 0
                && let Some(code) = InputEventCode::from_raw(idx as u32 * u8::BITS + bit)
            {
                res.push(code);
            }
        }
    }
    Ok(res)
}