#窗口管理器 #penrose #xcb #forked #dwm #github #power

libawm

为 awm 提供动力的库 - 从 penrose 分支而来

1 个不稳定版本

0.1.0 2022年6月24日

#1077GUI

MIT 许可证

515KB
11K SLoC

从 (penrose) 分支而来https://github.com/sminez/penrose


lib.rs:

Penrose:构建您自己的堆叠窗口管理器的库

Penrose 启发于类似的项目,如 dwmxmonadqtile,这些项目允许您通过代码配置窗口管理器并编译到您的系统。它与 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