2 个不稳定版本
0.1.0 | 2019年7月28日 |
---|---|
0.0.0 | 2019年7月18日 |
#26 in #i3
被 2 个包使用
29KB
447 行
ksway
此库提供了一个方便的接口,用于快速编写 i3
和 sway
的脚本(因为它们共享一个 IPC 接口 API)。如果兼容性发生变化,它将主要关注 sway
。
它还将是我日常使用的许多脚本的容器,这些脚本位于 examples/
目录下。
这些示例是学习如何使用此工具处理复杂情况的最佳资源,但这里有一些简单的示例
简短示例
connect
let mut client = Client::connect()?;
let mut client = Client::connect_to_path("/run/user/1000/sway-ipc.1000.1.sock")?;
运行命令
criteria
实现完整且更新至 2019-07-27。
use ksway::{ipc_command, command};
// These are equivalent
client.ipc(ipc_command::run("exec st"))?;
client.ipc(ipc_command::run(command::raw("exec st"))?;
client.ipc(ipc_command::run(command::exec("st"))?;
client.run(command::exec("st"))?;
// The benefit of using command is the additional methods such as .with_criteria
use ksway::criteria::*;
let cmd = command::raw("focus").with_criteria(vec![floating(), title("mpv")]);
client.run(cmd)?;
// criteria examples
let cmd = command::raw("focus").with_criteria(vec![workspace(focused())]);
let cmd = command::raw("focus").with_criteria(vec![con_id(123)])
let cmd = command::raw("focus").with_criteria(vec![con_id(focused())])
get_*
use ksway::ipc_command;
client.ipc(ipc_command::get_tree())?;
let tree_data = json::parse(str::from_utf8(&client.ipc(ipc_command::get_tree())?)?)?;
client.ipc(ipc_command::get_workspaces())?;
client.ipc(ipc_command::get_version())?;
subscribe*
use ksway::IpcEvent;
let rx = client.subscribe(vec![IpcEvent::Window, IpcEvent::Tick])?;
loop {
while let Ok((payload_type, payload)) = rx.try_recv() {
match payload_type {
IpcEvent::Window => {},
_ => {},
}
}
client.poll()?;
}
完整示例
-
examples/sway-focused-window $PATH
: 无参数时输出当前聚焦窗口的 json,但也可以指定路径进行提取,例如。sway-focused-window
-> 完整 jsonsway-focused-window window_rect width
sway-focused-window window_properties title
sway-focused-window id
-
examples/sway-focus-next $INCREMENT $EXPRESSIONS
: 聚焦与$EXPRESSIONS
匹配的下一个窗口。这里的“下一个”指的是,它将在当前聚焦窗口之后尝试找到下一个窗口(如果聚焦的窗口包含在 $EXPRESSIONS 指定的窗口集中,否则它将选择第一个窗口)。sway-focus-next1visible==true
sway-focus-next1 type==floating
sway-focus-next1visible==true type==$(sway-focused-windowtype)
sway-focus-next-1visible==true type==$(sway-focused-windowtype)
-
examples/watch-sway-windows
: 根据当前窗口运行规则。这是高度个人化和定制化以满足我的需求,且文档不是很好。
待办事项
- 在功能门下添加
serde
类型化的接口。我计划使用json_typegen
生成此接口。 - 考虑为 subscribe 添加基于未来的接口。
- 向
ksway::command::*
添加更多命令,例如resize
等。 - 记录所有示例
开放设计问题
- 我应该添加一个
ipc_json
方法来反序列化到json
或serde_json
吗?
依赖关系
~7–16MB
~207K SLoC