11 个重大版本发布
0.16.0 | 2022年12月31日 |
---|---|
0.15.0 | 2022年7月5日 |
0.14.0 | 2021年12月10日 |
0.13.0 |
|
0.5.0 | 2019年4月21日 |
#2 in #window-event
299 每月下载量
用于 6 crates
49KB
935 代码行
tokio-i3ipc
现在支持 tokio 1.0! 使用版本 0.12.0 及以上版本的 tokio
此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