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

tokio-i3ipc

为 i3 和 tokio 提供绑定,允许异步应用程序通过其 IPC 接口与 i3 通信。包含 futures 实现,并提供方便的函数以与 i3 一起工作。

11 个重大版本发布

0.16.0 2022年12月31日
0.15.0 2022年7月5日
0.14.0 2021年12月10日
0.13.0 2021年11月4日
0.5.0 2019年4月21日

#2 in #window-event

Download history 23/week @ 2024-04-22 47/week @ 2024-04-29 66/week @ 2024-05-06 46/week @ 2024-05-13 41/week @ 2024-05-20 37/week @ 2024-05-27 36/week @ 2024-06-03 32/week @ 2024-06-10 52/week @ 2024-06-17 41/week @ 2024-06-24 25/week @ 2024-07-01 11/week @ 2024-07-08 50/week @ 2024-07-15 26/week @ 2024-07-22 167/week @ 2024-07-29 55/week @ 2024-08-05

299 每月下载量
用于 6 crates

MIT 许可证

49KB
935 代码行

tokio-i3ipc

现在支持 tokio 1.0! 使用版本 0.12.0 及以上版本的 tokio

Build Status Crate API

此crate提供了在 tokio 中与 i3 的 IPC 协议一起工作的类型和函数。它重新导出crate i3ipc-types,因为它也用于代码的同步版本。

我预计最常见的使用情况将是订阅某些事件并监听

use std::io;
use tokio::stream::StreamExt;
use tokio_i3ipc::{
    event::{Event, Subscribe},
    I3,
};

#[tokio::main(flavor = "current_thread")]
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 Some(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(())
}

另一个例子,从 i3 获取所有工作空间

use std::io;
use tokio_i3ipc::{reply, I3};

#[tokio::main(flavor = "current_thread")]]
async fn main() -> io::Result<()> {
    let mut i3 = I3::connect().await?;
    // this type can be inferred, here is written explicitly:
    let worksp: reply::Workspaces = i3.get_workspaces().await?;
    println!("{:#?}", worksp);

    Ok(())
}

或者,你可以使用相同的方法自己编写任何 get_*

use std::io;
use tokio_i3ipc::{msg, reply, MsgResponse, I3};

#[tokio::main(flavor = "current_thread")]
async fn main() -> io::Result<()> {
    let mut i3 = I3::connect().await?;
    // send msg RunCommand with a payload
    let payload = "some_command";
    i3.send_msg_body(msg::Msg::RunCommand, payload).await?;
    let resp: MsgResponse<Vec<reply::Success>> = i3.read_msg().await?;
    Ok(())
}

send_msg,将处理写入 i3。 read_msg 将处理读取。

向 i3 发送消息

要向 i3 发送消息,I3 上有多个方便的方法。

use std::io;
use tokio_i3ipc::{reply, I3};

#[tokio::main(flavor = "current_thread")]]
async fn main() -> io::Result<()> {
    let mut i3 = I3::connect().await?;
    // this type can be inferred, here is written explicitly:
    let outputs = i3.get_outputs().await?;
    println!("{:#?}", worksp);

    Ok(())
}

"现实世界"示例

我有一个使用 tokio-i3ipc 的 i3 窗口日志应用程序的分支(https://github.com/leshow/i3-tracker-rs/)。该跟踪器订阅窗口事件并记录在每个节点上花费的时间。

依赖项

~4–13MB
~134K SLoC