1 个不稳定版本
0.1.0 | 2022年6月24日 |
---|
#1077 在 GUI
515KB
11K SLoC
从 (penrose) 分支而来https://github.com/sminez/penrose
lib.rs
:
Penrose:构建您自己的堆叠窗口管理器的库
Penrose 启发于类似的项目,如 dwm、xmonad 和 qtile,这些项目允许您通过代码配置窗口管理器并编译到您的系统。它与 xmonad
最相似,因为它更像是构建窗口管理器的库(为您处理底层细节),而不是您直接编辑和修补的精简窗口管理器(如 dwm
)。Penrose 力求在实现上尽可能简单,以便更容易理解窗口管理器的内部结构。鉴于所涉及的性质,这并不总是可能的,但已努力使源代码可读,并且相对较少使用魔法。
使用 Penrose
Penrose 本身不是一个可以构建、安装和运行的二进制应用程序。您需要编写自己的 main.rs 作为 Rust 二进制 crate,使用 Penrose 设置、配置和运行您自己的窗口管理器,完全符合您的需求。简而言之,您 需要 编写一些代码,并且您 需要 在一定程度上了解 Rust。
对于学习 Rust 本身,在 rust-lang.org 上有一些出色的官方 指南,如果您坚持使用 penrose crate 提供的现成功能,在深入研究 Penrose 之前,通过 该书籍 应该足够开始。
在 GitHub 上,您可以找到设置和配置 penrose 作为窗口管理器的最新 示例,从最简化的最小化到自定义扩展和钩子。
入门
在最简单的层面上,您需要创建一个新的二进制 crate 来构建您的窗口管理器,并将 penrose 添加为项目依赖项
$ cargo new --bin my_penrose_config
作为最低要求,你需要在你的 main.rs 文件中包含以下内容
- 键绑定(通常使用 gen_keybindings 宏设置)
- 一个用于处理与 X 服务器通信的 XConn 实例
- 一个包含 Penrose 顶层配置其余部分的 Config 实例。例如工作空间名称、布局函数以及间隙和边框的设置。
有了这些,你将能够创建一个 WindowManager 并在构建和安装你的二进制文件后启动 Penrose。建议你设置一个日志处理器,以便更容易地调试配置问题。(如果你不确定从哪里开始,simplelog 是一个不错的选择。)
示例
#[macro_use]
extern crate penrose;
use penrose::{
core::helpers::index_selectors,
logging_error_handler,
xcb::new_xcb_backed_window_manager,
Backward, Config, Forward, Less, More, WindowManager
};
fn main() -> penrose::Result<()> {
let key_bindings = gen_keybindings! {
"M-j" => run_internal!(cycle_client, Forward);
"M-k" => run_internal!(cycle_client, Backward);
"M-S-j" => run_internal!(drag_client, Forward);
"M-S-k" => run_internal!(drag_client, Backward);
"M-S-q" => run_internal!(kill_client);
"M-Tab" => run_internal!(toggle_workspace);
"M-grave" => run_internal!(cycle_layout, Forward);
"M-S-grave" => run_internal!(cycle_layout, Backward);
"M-A-Up" => run_internal!(update_max_main, More);
"M-A-Down" => run_internal!(update_max_main, Less);
"M-A-Right" => run_internal!(update_main_ratio, More);
"M-A-Left" => run_internal!(update_main_ratio, Less);
"M-semicolon" => run_external!("dmenu_run");
"M-Return" => run_external!("alacritty");
"M-A-Escape" => run_internal!(exit);
map: { "1", "2", "3", "4", "5", "6", "7", "8", "9" } to index_selectors(9) => {
"M-{}" => focus_workspace (REF);
"M-S-{}" => client_to_workspace (REF);
};
};
let mut wm = new_xcb_backed_window_manager(
Config::default(),
vec![],
logging_error_handler()
)?;
wm.grab_keys_and_run(key_bindings, map!{})
}
深入 API
为了添加更多功能和灵活性,你可以开始添加诸如 Hooks、状态栏以及作为键绑定一部分运行的自定义动作等。你需要阅读包含 Penrose 作为窗口管理器的所有核心功能的 core
模块的文档。之后,draw
模块包含用于渲染状态栏和控件等的实用工具,contrib
模块有简单的钩子、扩展和键绑定动作的示例,而 xcb
模块包含通过 XCB api 与 X 服务器交互的引用 trait 实现。
注意:为了使用 Penrose 的 xcb 实现,你需要安装依赖的 C 库(即 xcb、Cairo 和 Pango)。
依赖
~4.5–6MB
~127K SLoC