bspwm:高效平铺窗口管理器,以二叉树管理窗口,支持多种插入模式与自定义配置

A tiling window manager based on binary space partitioning

分支2Tags26
当前项目代码仓暂无内容

描述

bspwm 是一个平铺窗口管理器,它将窗口表示为一个完全二叉树的叶子。

它仅响应 X 事件以及通过专用套接字接收的消息。

bspc 是一个向 bspwm 的套接字写入消息的程序。

bspwm 不处理任何键盘或指针输入:需要第三方程序(如 sxhkd),以将键盘和指针事件转换为调用 bspc

概述的架构如下:

        进程               套接字
sxhkd  -------->  bspc  <------>  bspwm

配置

默认配置文件是 $XDG_CONFIG_HOME/bspwm/bspwmrc,这只是一个shell脚本,用于调用 bspc

该脚本会传递一个参数,指示它是重启后执行($1 -gt 0)还是未重启时执行($1 -eq 0)。

键盘和指针绑定是通过 sxhkd 定义的。

示例配置文件可以在 examples 目录中找到。

显示器、桌面与窗口

bspwm 管理着一系列显示器的列表。

显示器仅仅是包含桌面的矩形区域。

桌面是指向一棵树的指针。

每个显示器一次只显示一个桌面的树结构(即其聚焦的桌面)。

树是由显示器的矩形区域分割成更小矩形区域的分区。

树中的每个节点要么没有子节点,要么有两个子节点。

每个内部节点负责将矩形分成两半。

分割由两个参数定义:类型(水平或垂直)和比例(满足 0 < r < 1 的实数)。

每个叶节点恰好持有一个窗口。

插入模式

bspwm 接收到新窗口时,它使用为指定插入点(一个叶节点)指定的插入模式将其插入到窗口树中。

插入模式告诉 bspwm 应如何改变树以便在给定的插入点插入新窗口。

默认情况下,插入点是焦点窗口,并且其插入模式为“自动”。

手动模式

用户可以通过向 bspwm 发送 node -p|--presel-dir DIR 消息来指定下一个新窗口应该出现在插入点的哪个区域。

DIR 参数允许指定插入点应该如何分裂(横向或纵向)以及新窗口应该是新内部节点的第一个还是第二个子节点(插入点将成为它的“兄弟”节点)。

这样做之后,插入点进入“手动”模式。

考虑以下场景:

            a                          a                          a
           / \                        / \                        / \
          1   b         --->         c   b         --->         c   b
          ^  / \                    / \ / \                    / \ / \
            2   3                  4  1 2  3                  d  1 2  3
                                   ^                         / \
                                                            5   4
                                                            ^

在状态 X 中,插入点是 1。 发送到 bspwm 的消息是:node -p north。 然后添加新窗口:4,导致状态 Y:新内部节点 c 成为 a 的第一个子节点。 最后发送另一个消息:node -p west 并添加窗口 5。 预选分割的比例(最终成为新内部节点分割的比例)可以通过 node -o|--presel-ratio 消息更改。

自动模式

与“手动”模式相反,“自动”模式不需要用户的任何选择。新窗口如何插入取决于自动方案的值和初始极性设置。

最长边方案

当自动方案的值为 longest_side 时,窗口将被附加,就像在手动模式下一样,但分割方向基于平铺矩形的尺寸和初始极性设置。

考虑以下场景,其中初始极性设置为 second_child

             1                          a                          a
             ^                         / \                        / \
                         --->         1   2         --->         1   b
                                          ^                         / \
                                                                   2   3
                                                                       ^

在状态 X 下,添加了一个新窗口。 因为 1 较宽,所以按照垂直方向分割,而 2 被添加为 a 的第二个孩子,根据初始极性。 这导致状态 Y,我们在此插入窗口 3。由于 2 很高,因此它被水平分割,3 再次作为 b 的第二个孩子添加。

替换方案

当自动方案的值为 alternate 时,窗口的附加方式如同处于手动模式,但是分割方向基于插入点父节点的分割类型和初始极性。如果父节点水平分割,则插入点将垂直分割;反之亦然。

螺旋方案

当自动方案的值为 spiral 时,窗口将会“占据”插入点的空间。 让我们通过以下情景详细了解:

             a                          a                          a
            / \                        / \                        / \
           1   b         --->         1   c         --->         1   d
              / \                        / \                        / \
             2   3                      4   b                      5   c
             ^                          ^  / \                     ^  / \
                                          3   2                      b   4
                                                                    / \
                                                                   3   2

在状态 X 中,插入点 2 处于自动模式。 当我们添加新窗口 4 时,根为 b 的整个树被重新附加为新内部节点 c 的第二个孩子。 b 的分割参数(类型:水平,比例:½)被复制到 c,而 b 顺时针旋转90度。 状态 Y4 的平铺矩形等于状态 X2 的平铺矩形。 接着,以 4 作为插入点插入 5 导致状态 Z。 “螺旋”自动方案生成以顺时针(如果是父节点的第一个孩子)或逆时针(如果是第二个孩子)旋转的窗口螺旋。

支持的协议与标准

  • 随机显示与重定向(RandR)及 Xinerama 协议。
  • 一套符合扩展窗口管理提示(EWMH)及 ICCM 规范的子集。

社区互动

渴望与其他 bspwm 用户交流或是需要帮助?欢迎加入:

项目介绍

基于二进制空间分割的平铺窗口管理器【此简介由AI生成】

定制我的领域
1268.31 K441访问 GitHub