#i3 #ipc #async #tokio #protocols #window-event #api-bindings

async-i3ipc

Bindings for i3 and async-std allowing async applications to communicate with i3 over it's IPC interface. Contains futures implementations and convenience functions for working with i3.

5 releases (breaking)

0.7.0 Dec 31, 2022
0.5.0 Dec 10, 2021
0.4.0 Nov 4, 2021
0.3.0 Jan 11, 2021
0.1.0 Aug 21, 2020

#1303 in Asynchronous


Used in desktopd

MIT license

46KB
922 lines

async-i3ipc

Crate API

This crate provides types and functions for working with i3's IPC protocol within async-std. It re-exports the subcrate i3ipc-types because it is also used for a synchronous version of the code.

I expect the most common use case will be to subscribe to some events and listen:

use async_i3ipc::{
    event::{Event, Subscribe},
    I3,
};
use std::io;

// prefer creating the runtime yourself and using only a single core.
// this will hardly need to have a runtime with 1 thread for each core
// on your machine
#[async_std::main]
async fn main() -> io::Result<()> {
    let mut i3 = I3::connect().await?;
    let resp = i3.subscribe([Subscribe::Window]).await?;

    println!("{:#?}", resp);
    let mut listener = i3.listen();
    while let Ok(event) = listener.next().await {
        match event {
            Event::Workspace(ev) => println!("workspace change event {:?}", ev),
            Event::Window(ev) => println!("window event {:?}", ev),
            Event::Output(ev) => println!("output event {:?}", ev),
            Event::Mode(ev) => println!("mode event {:?}", ev),
            Event::BarConfig(ev) => println!("bar config update {:?}", ev),
            Event::Binding(ev) => println!("binding event {:?}", ev),
            Event::Shutdown(ev) => println!("shutdown event {:?}", ev),
            Event::Tick(ev) => println!("tick event {:?}", ev),
        }
    }
    Ok(())
}

Dependencies

~6–17MB
~218K SLoC