平铺式窗口管理器比较
外观
本文提供了对最受欢迎的平铺 窗口管理器(相对于浮动窗口管理器)的公正对比。
比较表
下表列出了最受欢迎的平铺窗口管理器及其显著特性,为读者提供快速概览。
| 窗口管理器 | 编写语言 | 配置方式 | 管理风格 | 系统托盘支持 | 即时重载 | 信息栏 | 合成器 | 默认布局 | 像素使用/边框 | 外部控制 | 库 | 多(n)显示器行为 | 兼容 ICCCM/EWMH | 维护 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Awesome | C | Lua | 动态式 | 内置 | 是 | 内置,支持图像和文本 | 外部 | max, nh-stack (及反向), nv-stack (及反向), free | 可变边框,可选 h-tab 标题 | dbus (如果启用) | XCB | n-tags (工作区)。默认启用 9 个。示例 | 是 | 活跃 |
| bspwm | C | 任意 | 混合 | 无 | 是 | 可将内部状态写入 FIFO | 外部 | v-split, h-split | 可变边框 | 通过 bspc |
XCB | 显示器持有桌面 | 是 | 活跃 |
| dwm | C | C (重新编译) | 动态式 | 可选补丁 | 可选 | 内置,读取根窗口名称 | 外部 | v-stack, max | 通过 dwmfifo | Xlib | n 个区域,每个区域固定 9 个工作区 | 否 | 活跃 | |
| FrankenWM | C | C (重新编译) | 动态式 | 无 | 否 | 否,将信息输出到 stdout,可由外部监控器或面板(dzen2, conky 等)轻松解析和显示 | 外部 | v-stack (及反向), h-stack (及反向), dual-v/h-stack, grid, fibonacci (vh-stack), rows, columns, max, free | 可变边框 | XCB | 否 | 活跃 | ||
| herbstluftwm | C++ | 任意 | 手动 | 无 | 是 | 外部 | vertical, horizontal, grid, max, tabbed | 1 像素边框 | 通过 herbstclient 执行命令 |
Xlib | n 个区域,任何区域可见 9 个工作区 | 是 | 活跃 | |
| i3 | C | 文本 | 手动 | i3bar | 是 (布局得以保留) | 文本管道传输至 i3bar (可使用 i3status/conky 等) |
外部 | tree, v-split, h-split, stacked, tabbed, max, 可无限嵌套 | 无, 1 像素或 2 像素, 可选标题栏, 可隐藏边缘边框 | 通过 ipc 执行命令 (或使用 ipc 的 i3-msg) | XCB | n 个区域 | 是 | 活跃 |
| LeftWM | Rust | RON (用户设置) / 任意 (主题) | 动态式 | 无 | 是 | 是,通过主题系统提供多种选项 | 外部 | v-stack, columns, rows | 根据主题可变 | 支持 _NET_ACTIVE_WINDOW 并向命名管道发送命令 |
Xlib | 工作区和显示器不绑定。一个显示器对应多个工作区,或一个工作区对应多个显示器 | 是 | 活跃 |
| Notion | C, Lua | Lua, 兼容 Ion3 配置 | 手动 | trayion, stalonetray | 是 | 可配置 | ? | h-tab, max | 可配置边框和标题栏/标签页 | EWMH, 任意可访问丰富内部 API 的 Lua 脚本 | Xlib | 每个显示器 n 个工作区。支持拓扑结构的即时更改 | 活跃 | |
| qtile | Python | Python | 动态式 | 是 | 是 | 是 | 外部 | tree, v-split, h-split, stacked, tabbed, max | 无边框,但可自定义 | 钩子 (Hooks), 服务器模式 | XCB | 活跃 | ||
| Ratpoison | C | 文本 | 手动 | 无 | 是 | 是 | 外部 | max | Xlib | 否 | 活跃 | |||
| Snapwm | C | 可重载文本 | 动态式 | 无 | 是 | 内置,读取根窗口名称 | 外部 | nVertical, Fullscreen, nHorizontal, Grid, Center Stacking | 可变边框, 无标题 | Xlib | 桌面数量在显示器之间均匀分布 | 活跃 | ||
| Spectrwm | C | 文本 | 动态式 | 无 | 是 | 内置,读取用户脚本 | 否 | nv-stack, nh-stack, max | 1 像素边框, 无标题 | XCB | n 个区域, 任何区域可见 10 个工作区 | 否 | 活跃 | |
| Stumpwm | Common Lisp | Common Lisp | 手动 | StumpTray | 是 | 是 | 外部 | max | SLIME 服务器 ("Swank") | CLX (Xlib 等效) | 否 | 活跃 | ||
| xmonad | Haskell | Haskell | 动态式 | 无 | 是 | 否 | 是,配合 xmonad-contrib 和外部管理器 | nv-stack, nh-stack, max | 可变边框, 无标题 | 通过 XMonad-Hooks-ServerMode | Xlib | n 个区域,任何区域可见 9 个工作区 | 是 / 通过 XMonad-Hooks-EwmhDesktops | 活跃 |
提示 外部控制也可以通过像 xdotool 这样模拟击键的程序来实现。
管理风格
动态管理强调窗口布局的自动化管理,以追求速度和简单。手动管理则强调对手动调整布局和尺寸的掌控,虽然可以实现更精确的控制,但代价是需要花更多时间在移动和调整窗口大小上。
布局
许多平铺 WM 中出现了几种常见的布局类型,尽管术语略有不同。
- max: 一个窗口全屏显示(带或不带状态栏、标题和边框)。又称:monocle (dwm, monsterwm)。
- h-stack: 主区域在上半部分,其他窗口在下半部分水平堆叠。主区域可调整大小。可能会上下颠倒 (wmfs)。又称:bottom stack (dwm), bstack(monsterwm)。
- v-stack: 主区域在左半部分,其他窗口在右半部分垂直堆叠。主区域可调整大小。可能会左右颠倒 (wmfs)。又称:tile (dwm, monsterwm)。
- nh-stack: 允许主区域有 >=1 个窗口的 h-stack。又称:nbstack (dwm)
- nv-stack: 允许主区域有 >=1 个窗口的 v-stack。又称:ntile (dwm)
- mirror-h: 带有主区域上下两端堆叠的 nh-stack
- mirror-v: 带有主区域左右两端堆叠的 nv-stack
- h-tab: 一个窗口全屏显示,所有窗口标题水平显示(类似浏览器标签页)
- v-tab: 一个窗口全屏显示,所有窗口标题垂直显示。又称:stack (wmii)。
- h-split: 通过快捷键将当前窗口水平分割,为另一个窗口创建空间
- v-split: 通过快捷键将当前窗口垂直分割,为另一个窗口创建空间
- columns: 手动布局风格,将窗口视为属于垂直列
- rows: 手动布局风格,将窗口视为属于水平行
- grid: 基于规则的 NxM 网格的窗口位置和大小。可以是自动的(如 wmfs, monsterwm)或手动的(如 Subtle)。
按键绑定
平铺窗口管理器通常设计为完全使用键盘或键盘与鼠标结合使用。这是为了提高速度(伸手移动鼠标较慢)和易用性。合理的快捷键绑定对于实现快速高效的工作流至关重要。某些默认集比其他集更好,但通常用户可以根据需要重新绑定按键。
参见
- 平铺 Wayland 合成器列表
- 可扩展窗口管理器对比 对比了可以通过脚本“扩展”的窗口管理器,如 xmonad 和 Sawfish。