#i3 #ipc #json #protocols #serde #serde-json #window-event

i3_ipc

For communicating with i3 over it's IPC interface synchronously

11 breaking releases

0.16.0 Dec 31, 2022
0.15.0 Jul 5, 2022
0.14.0 Dec 10, 2021
0.13.0 Nov 4, 2021
0.5.0 Apr 21, 2019

#9 in #window-event

Download history 1/week @ 2024-02-05 3/week @ 2024-02-12 24/week @ 2024-02-19 48/week @ 2024-02-26 12/week @ 2024-03-04 38/week @ 2024-03-11 17/week @ 2024-03-18 61/week @ 2024-04-01

118 downloads per month
Used in 3 crates

MIT license

41KB
884 lines

i3-ipc (synchronous)

Crate API

A synchronous i3 IPC library. For async see tokio-i3ipc.

Subscribe

Subscribing to events is easy:

use i3_ipc::{
    event::{Event, Subscribe},
    I3Stream,
};
use std::io;

fn main() -> io::Result<()> {
    let mut i3 = I3Stream::conn_sub(&[Subscribe::Window, Subscribe::Workspace])?;
    for e in i3.listen() {
        match e? {
            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(())
}

Get

Getting information is equally easy, use any get_* method or run_command to send a message to i3:

use i3_ipc::{Connect, I3};
use std::io;

fn main() -> io::Result<()> {
    let mut i3 = I3::connect()?;
    let workspaces = i3.get_workspaces()?;
    println!("{:?}", workspaces);
    Ok(())
}

Dependencies

~0.7–1.4MB
~33K SLoC