使用 Openbox 作为基底打造你自己的 Linux 桌面环境
2020-09-10

这篇文章会教你如何使用 Openbox 作为基底打造你自己的 Linux 桌面环境。

很久没有写过这类教程了,如果发现文章中的问题或不足,可以在评论中告诉我😁

开始之前

Openbox 是什么?

对于能够找到这篇文章的你,这应该不是你想问的问题吧...

Openbox 是一个 WM(Window Manager/窗口管理器)用来显示并管理每个 GUI 程序的窗口。 经常被人们提到的 Gnome、KDE 之类的东西是 DE(Desktop Environment/桌面环境)。一个 DE 通常会包括一个 DM(Display Manager/显示管理器,通常用于用户登录并启动桌面环境)、一个 WM(用于显示窗口)、一个 compositor(或许可以翻译为“合成器”?用于渲染特效、透明效果等)和一大堆附加组件(如窗口列表、dock 栏、托盘)。 理论上讲,各个 DE 中的每个部分都可以被替换掉,例如用 LightDM 替换掉 Gnome 自带的 DM:GDM,或用 openbox 替换掉 XFCE 自带的 WM:xfwm。

为什么不用已有的桌面环境?

原因如下:

自己动手拼凑桌面环境就不会有这些问题。你喜欢 LXDE 的 Panel、Xfce 的终端、Gnome 的截图工具?没有任何问题,你可以你自己喜欢的所有组件放在一起。这就是不使用已有桌面环境的最大优点。

你的桌面环境是什么样的并不重要,重要的是它是否能让你用得顺手,符合你的习惯,提升你的效率。

为什么选用 Openbox?

Openbox 可以说是一个较为“传统”的窗口管理器。它并不支持 wayland,只能运行在传统的 X11 上,但这也保证了它的稳定性,并且对 N 卡有更好的支持。 另外,Openbox 在交互上偏向于使用鼠标。虽然你可以按照你的喜好设置一大堆快捷键,但如果你对键盘操作特别钟情,或是讨厌操作鼠标,可能 i3(X11)、sway(wayland)类的桌面更适合你。

相较于重量级的 DE,如 Gnome、KDE,Openbox 极其轻量,并且基本不存在什么依赖。 对于其他轻量级 WM,openbox 可以说是配置起来最简单的,并且有几乎是最完备的生态和社区。

目标与准则

这篇文章会以我的桌面环境的配置为例,详细地介绍如何拼凑一个桌面环境。我会详细介绍我自己的方案,但也会给出其它方案,你可以按照自己的喜好来选择。就算WM相同,两个人的桌面也可以从外观和使用上完全不同。

我自己的准则:

再次强调,你不需要完全照搬我的配置,我也不推荐你这么做,毕竟只有尝试过更多方案才能选择出最适合你的。这正是 Linux 的精髓。

配置过程

在这里,假设你的系统是 Arch(其他系统也大同小异,只不过可能需要手动编译一些组件),且系统中还没有安装桌面环境与 X Window System。

下面列出的程序全部都是没有过时或停止开发/支持并且依赖也没有过时的。

基础软件包:X Window System、Display Manager 和 Openbox

首先需要的是处在最底层的 X Window System。一般来说只需要 xorg-server 包和它的依赖。 另外,这里还需要安装你的显卡对应的 xf86-video 包,如 xf86-video-intel。如果你的机器同时有核显与独显,最好暂时只安装核显的包。

你还需要一个 DM 来启动 Openbox,我用的是 LightDM,当然还有其它选择,如 LXDM。顺便一提,如果你准备使用 LXDM 的话,要注意它有 GTK2 与 GTK3 两个版本,一般来说选择 GTK3 版本的比较好。 如果你和我一样选择了 LightDM,那么你还需要一个 Greeter 用来在 GUI 下登录。这里有很多选择,可以参考 Wiki 中的 Greeter 一节。我使用的是默认的 lightdm-gtk-greeter,主要原因是它可以使用与桌面环境相同的 GTK 主题来保持界面风格的一致。

当然,不用 DM 也是完全可以的。利用 Xinit 你可以在终端中启动 X Window System,并且可以通过切 tty 来实现多用户。

最后,别忘了安装 Openbox。这里最好顺便装上 xterm,因为刚刚安装好的 Openbox 的应用菜单默认是硬编码的,常用的终端只有 xterm 在菜单中,后面将你喜欢的 GUI 终端添加到 Openbox 应用菜单后你可以直接将 xterm 卸装掉。不装 xterm 也没有任何问题,只不过稍微麻烦一点,最初几步中你需要切换到其它 tty 来执行命令。

将你的 DM 设置为自启后,重启电脑,不出意外的话重启后你会进入 DM 的登录界面。登录后,你便可以进入 Openbox。

使桌面环境“可用”

进入一个未经配置的 Openbox,你只会看到黑色的背景,没有任何其它东西,鼠标右键会显示应用菜单。

这时你的桌面系统还远远达不到“可用”,至少还需要窗口列表和系统托盘。

窗口列表与系统托盘

这里有几种不同方案:

方案一:使用一个 Dock 栏和一个系统托盘

这种情况下,你没有窗口列表来显示已打开的窗口,所以需要一个可以显示并重新打开最小化后的窗口的 Dock 栏,这里列出 2 个可选项:

窗口列表实现了,但你还需要一个系统托盘,可以选择 Stalonetray,或 trayer-srg,或 taffybar

方案二:使用一个 Panel

这是我选择的方案。

Panel 一般会包含窗口列表、工作区切换器、系统托盘之类的东西。通常来说,有一个 Panel 已经足够让你的桌面环境“可用”了。 下面列出几个可选的 Panel:

方案三:使用一个 Panel 和一个 Dock 栏

通常 Panel 也可以作为 Dock 栏使用,但如果你很想再揉进去一个独立的 Dock 也没有问题。

决定是否将桌面作为一个目录

要不要在桌面上堆放文件?

需要在桌面上堆放文件

如果你喜欢平时把一些文件和目录直接放在桌面上以便操作,就遵照这个部分进行。 下面列出几种选择让你能够在桌面放置文件和目录:

一般来说,用户的“桌面”文件夹在 ~/Desktop,但修改起来也不难。我就是直接将我的 home 目录作为桌面目录的。

不需要在桌面上堆放文件

如果你为了为了整洁的外观或是其它原因不准备在桌面上放置文件,在这一步你最好开始编辑 Openbox 的右键菜单与壁纸。

编辑 Openbox 的右键菜单

ArchWiki 中有很详细的介绍,可以直接参照这里

设置壁纸

在桌面模式下运行的 PCManFM、xfdesktop 和 ROX 都支持设置壁纸,但在不用它们的情况下,Nitrogen 可以用来设置壁纸。

让程序自启动

只需要在 ~/.config/openbox/autostart~/.xprofile 加入需要自动执行的命令。两个文件的区别在于,~/.xprofile 中的命令是在 X Server 启动时执行的,而 ~/.config/openbox/autostart 中的内容是在 Openbox 启动后才执行的,一般来说两者区别不大。

一个例子:

xfdesktop &
xfce4-panel &
nm-applet &
optimus-manager-qt &
pasystray &
blueman-applet &
xfce4-power-manager &
fcitx5 &

“设置”程序

Openbox 有自己的设置程序 ObConf,需要单独安装。

lxappearance 可以用来设置 GTK 主题等一些选项,虽说从名字里看它是 LXDE 的组件,但它完全可以独立运行。推荐安装它的GTK3版本。

如果你的电脑同时有核显和独显,Arch 系可以用optimus-manager配合 GUI 前端 optimus-manager-qt 切换显卡,体验极佳。

一些重要的程序

到这里,你的 Openbox 已经达到“可用”状态了,但还需要一些如文件管理器、终端之类的程序。

文件管理器

有很多选择,之前提到的 PCManFM、Thunar 都是很不错的轻量级文件管理器,而且在网上随便查查就能找到不少其它的选择。

注意,大多数文件管理器会通过 gvfs 实现回收站和自动挂载可移动设备的功能,并且可能需要通过一个 daemon 进程监听。

我选择的是 Thunar。

终端

之前我们一直临时在用 xterm 作为终端。有很多更好的终端,我自己在用的是 Sakura,非常简洁轻量。xfce4-terminalTermite 也是不错的选择。

文本编辑器

同样有很多选择。单纯作为文本编辑器,mousepad 很不错。如果你喜欢 Windows 上 Notepad++ 的体验,notepadqq 几乎一模一样,只是现版本的行首缩进貌似有些 bug。 我用的是 Gvim,这个就不用多解释了。

用来锁定、退出、关机和重启的面板

我用的是 Oblogout

系统托盘中的东西

这里列出我使用的组件:

定义键盘快捷键

Openbox的键盘快捷键可以通过编辑 ~/.config/openbox/rc.xml 修改,当然也有 GUI 前端可以修改快捷键,但是我觉得没有必要,因为 rc.xml 修改起来非常简单。

可以参考 Arch Wiki 中 Openbox 词条的 Keybinds 章节进行配置。

下面列出我的 rc.xml 中的 <keyboard> 段,其中包含一些有用的小组件,下文会提到:

<keyboard>
    <!-- Oblogout 面板 -->
    <keybind key="C-A-Delete">
        <action name="Execute">
            <command>oblogout</command>
        </action>
    </keybind>

    <!-- 窗口与工作区相关 -->
    <keybind key="W-a">
        <action name="ToggleShowDesktop"/>
    </keybind>
    <keybind key="A-Left">
        <action name="PreviousWindow"/>
    </keybind>
    <keybind key="A-Right">
        <action name="NextWindow"/>
    </keybind>
    <keybind key="C-Left">
        <action name="DesktopLeft">
            <dialog>no</dialog>
            <wrap>no</wrap>
        </action>
    </keybind>
    <keybind key="C-Right">
        <action name="DesktopRight">
            <dialog>no</dialog>
            <wrap>no</wrap>
        </action>
    </keybind>
    <keybind key="C-A-Left">
        <action name="SendToDesktopLeft">
            <dialog>no</dialog>
            <wrap>no</wrap>
        </action>
    </keybind>
    <keybind key="C-A-Right">
        <action name="SendToDesktopRight">
            <dialog>no</dialog>
            <wrap>no</wrap>
        </action>
    </keybind>

    <!-- 用 pactl 控制音量 -->
    <keybind key="XF86AudioMute">
        <action name="Execute">
            <command>pactl set-sink-mute 0 toggle</command>
        </action>
    </keybind>
    <keybind key="XF86AudioRaiseVolume">
        <action name="Execute">
            <command>pactl set-sink-volume @DEFAULT_SINK@ +5%</command>
        </action>
    </keybind>
    <keybind key="XF86AudioLowerVolume">
        <action name="Execute">
            <command>pactl set-sink-volume @DEFAULT_SINK@ -5%</command>
        </action>
    </keybind>

    <!-- 用 playerctl 控制上一曲、下一曲、播放与暂停 -->
    <keybind key="XF86AudioPrev">
        <action name="Execute">
            <command>playerctl next</command>
        </action>
    </keybind>
    <keybind key="XF86AudioPlay">
        <action name="Execute">
            <command>playerctl play-pause</command>
        </action>
    </keybind>
    <keybind key="XF86AudioNext">
        <action name="Execute">
            <command>playerctl previous</command>
        </action>
    </keybind>

    <!-- 用 escrotum 截图 -->
    <keybind key="Print">
        <action name="Execute">
            <command>escrotum -C</command>
        </action>
    </keybind>
    <keybind key="C-Print">
        <action name="Execute">
            <command>escrotum -Cs</command>
        </action>
    </keybind>
    <keybind key="S-Print">
        <action name="Execute">
            <command>escrotum</command>
        </action>
    </keybind>
    <keybind key="C-S-Print">
        <action name="Execute">
            <command>escrotum -s</command>
        </action>
    </keybind>
</keyboard>

一些好用的程序与小工具

关于 compositor

首先你需要问问自己,你是否真的需要 compositor? 诚然,compositor 可以装饰窗口、实现透明效果,Compiz 这样重量级的 compositor 甚至可以实现很多炫酷的特效。但这值得吗?这些效果无法带来实质上的效率提升。compositor 在后台会占用很多 GPU 资源从而导致帧率的下降,如果你是游戏玩家的话这尤为关键:在我的电脑上,开启 compositor 后 CS:GO 的帧率会下降接近四分之一。 另外,没有正确配置的 compositor 可能会导致令人很不舒服的画面撕裂等问题。

如果你一定要使用 compositor,我推荐以下两个:

对触控板的调校

可以参考我的另一篇文章《对 Linux 下触控板按键、加速和手势的优化(libinput)》

写作初衷

去年我买了一台游戏本作为主力 PC,当时觉得,既然是游戏本,那用 Windows 应该是理所当然的,就把我的整个工作环境迁移到了 Windows 上。用了大概半年,我彻底受够了 Windows:催命般的 Windows Update、相当于没有的包管理...最恶心的还是注册表,这东西简直就是人类科技的倒退。

今年一月,我切换到了最近大红大紫的 Manjaro,具体版本是 Manjaro XFCE Edition Minimal。 这一用就是半年,我最终还是决定换掉它,原因就是:它注重“傻瓜化”。但我不是傻瓜啊...Manjaro 为了达到“开箱即用”的状态集成了太多没用的组件,就算是 Minimal 版本也是如此。例如,yay 已经够好了,然而 Manjaro 还是要再带一个 pamac,虽然说 pamac 的重点在于它的 GUI,但市面上 pacman 和 AUR Helper 的 GUI 已经很多了,使用体验不错的也有不少。另外,不知为何,Manjaro 经常会在更新时搞坏一些东西,默认的 theme 就在某次大版本更新时坏掉过,导致很多 GTK 程序变得辣眼睛;Optimus Manager 也在某次更新过后出过问题,需要重启 2 次 DE 才能成功切换显卡。每次处理这类问题都十分麻烦耗时,这也是庞大臃肿系统桌面环境的通病。 我对 Manjaro 的最终印象是:适合小白与非常懒的用户(连手动配置一次环境都懒得做的那类人),且由于 Manjaro 基于 Arch,有 AUR 这样一个方便的软件包来源,几乎没有手动编译软件的需要。

最终我还是换回了 Arch,自己动手拼凑了桌面环境。 感觉在中文互联网上关于自己拼凑 Linux 桌面环境的文章少之又少,于是便有了写这篇文章的想法。在鸽了 N 个星期后,终于写完并发布了这篇文章。