#ipc #sway #i3

ksway

用于与 sway/i3 ipc 交互的包

2 个不稳定版本

0.1.0 2019年7月28日
0.0.0 2019年7月18日

#26 in #i3


2 个包使用

MIT 许可证

29KB
447

ksway

docs.rs

此库提供了一个方便的接口,用于快速编写 i3sway 的脚本(因为它们共享一个 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 -> 完整 json
    • sway-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 方法来反序列化到 jsonserde_json 吗?

依赖关系

~7–16MB
~207K SLoC