A tiling window manager based on binary space partitioning
描述
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度。 状态 Y 中 4 的平铺矩形等于状态 X 中 2 的平铺矩形。 接着,以 4 作为插入点插入 5 导致状态 Z。 “螺旋”自动方案生成以顺时针(如果是父节点的第一个孩子)或逆时针(如果是第二个孩子)旋转的窗口螺旋。
支持的协议与标准
- 随机显示与重定向(RandR)及 Xinerama 协议。
- 一套符合扩展窗口管理提示(EWMH)及 ICCM 规范的子集。
社区互动
渴望与其他 bspwm 用户交流或是需要帮助?欢迎加入:
- 在 r/bspwm 的 Reddit 讨论版面。
- 连接至
irc.libera.chat上的#bspwmIRC 频道(由 Emanuele Torre / IRC 用户名 emanuele6 维护)。 - 或者访问位于 https://matrix.to/#/#bspwm:matrix.org 的 Matrix 聊天室。