16 releases (8 breaking)

0.9.0 Jan 19, 2024
0.8.3 Jul 7, 2023
0.8.2 Jan 31, 2023
0.7.1 Dec 11, 2021
0.2.0 Jun 7, 2017

#58 in GUI

Download history 3798/week @ 2023-12-06 4104/week @ 2023-12-13 2985/week @ 2023-12-20 2821/week @ 2023-12-27 4082/week @ 2024-01-03 4560/week @ 2024-01-10 4648/week @ 2024-01-17 5501/week @ 2024-01-24 5382/week @ 2024-01-31 6224/week @ 2024-02-07 6569/week @ 2024-02-14 6587/week @ 2024-02-21 5411/week @ 2024-02-28 5362/week @ 2024-03-06 5894/week @ 2024-03-13 5000/week @ 2024-03-20

22,839 downloads per month
Used in 28 crates (12 directly)

MIT license

1.5MB
14K SLoC

Rust libinput bindings

Build Status Crates.io License Docs

libinput bindings for Rust

These bindings closely follow libinput's concepts and it's original API. Please refer to the libinput documentation to understand the general structure and concepts.

Note: Due to a bug within libinput, these bindings are not compatible with libinput 1.19.0. Please use the fixed 1.19.1 version.

Usage

Add to your Cargo.toml:

input = "0.8"

Install the libinput dev dependencies:

Ubuntu:

apt-get install libinput-dev

Fedora

dnf install libinput-devel

Configure and run event loop:

use input::{Libinput, LibinputInterface};
use libc::{O_RDONLY, O_RDWR, O_WRONLY};
use std::fs::{File, OpenOptions};
use std::os::unix::{fs::OpenOptionsExt, io::OwnedFd};
use std::path::Path;

struct Interface;

impl LibinputInterface for Interface {
    fn open_restricted(&mut self, path: &Path, flags: i32) -> Result<OwnedFd, i32> {
        OpenOptions::new()
            .custom_flags(flags)
            .read((flags & O_RDONLY != 0) | (flags & O_RDWR != 0))
            .write((flags & O_WRONLY != 0) | (flags & O_RDWR != 0))
            .open(path)
            .map(|file| file.into())
            .map_err(|err| err.raw_os_error().unwrap())
    }
    fn close_restricted(&mut self, fd: OwnedFd) {
        drop(File::from(fd));
    }
}

fn main() {
    let mut input = Libinput::new_with_udev(Interface);
    input.udev_assign_seat("seat0").unwrap();
    loop {
        input.dispatch().unwrap();
        for event in &mut input {
            println!("Got event: {:?}", event);
        }
    }
}

Dependencies