使用 DWM 快速运行

作者:Mike Diehl

如果这个世界有任何公正可言,我的车道上应该停着两辆车。一辆是 1977 年的法拉利 308 GTS。另一辆是午夜蓝色的宝马 M3 敞篷车,配备所有便利设施。我想要真皮座椅和电动一切。当我在宝马车里时,我不想手动摇下车窗;我想按下一个按钮,让一个小妖精出来帮我摇下车窗。我只想把车指向我要去的方向,让它自动驾驶到那里。没错,有时候男人就想享受一下被呵护的感觉。

还有一些时候,我只想开快车,快到我没时间摇下车窗,小妖精也会害怕得不敢解开安全带。在法拉利里,我肯定会感觉到路上的每一颗小石子,而且我会花大部分周末时间修理汽车,试图榨取出每一丝马力。当我开车时,我想思考是否应该从 3 档降到 2 档,甚至降到 1 档。而且我想完全了解这辆车的里里外外。

好吧,如果你对所有这些汽车话题不感兴趣,你可能想知道这与 Linux 有什么关系。在我的日常工作中,我使用 K 桌面环境 (KDE)。你可以把 KDE 想象成我之前提到的宝马。作为用户,你几乎永远不必深入了解底层。而且似乎有一个按钮或对话框可以执行你可能想到的任何功能或配置更改。如果你不知道要运行的程序的名称,通常会有一个图标或菜单项供你点击。像宝马一样,KDE 并不以快速或轻量级而闻名,但它非常舒适。

动态窗口管理器 (DWM) 仅用 2140 行 C 代码编写,绝对称得上轻量级。它没有任何菜单,也没有图标。你也不能使用对话框来更改屏幕颜色。你真的必须深入了解底层才能进行配置更改,我们稍后会讨论这个问题。大多数时候,你甚至不会使用鼠标。一旦你学会了如何“驾驶” DWM,你就可以在其中快速运行。

同样,安装 DWM 也非常容易。只需从 dwm.suckless.org 下载 tarball 并解压内容。然后在结果目录中运行 make。结果是一个单独的可执行文件 dwm。如果你然后运行 make install,make 将安装一个 man page 并在 /usr/local 中安装 dwm 可执行文件。为了测试,我只是从我的主目录运行了 dwm。

我不得不承认我对 DWM 的第一印象并不好。在我终止了正在运行的 KDE 环境并启动 DWM 后,我几乎立刻面对的是一个简单的灰色屏幕,顶部有一些数字。没有菜单,我有点迷茫。所以我决定回去阅读详细的手册。

在阅读了手册和 DWM 网站上的教程后,我发现 可以调出一个 x-terminal。终于找到一些我熟悉的东西了!当我启动更多 x-terminals 时,DWM 将它们推到屏幕右侧的堆栈中。只需几个快速的按键,我就可以翻阅“堆叠”的窗口并将它们置于顶层。几分钟后,我意识到训练我的手指在多个窗口之间导航,而无需拿起鼠标是非常容易的。

DWM 根据两种模式之一布局程序窗口:平铺、浮动和单窗模式。用户可以使用 、 和 分别在这些模式之间切换。平铺模式是默认模式,其行为正如我之前描述的那样。在浮动模式下,可以使用鼠标在屏幕上拖动窗口,其行为与在其他窗口环境中非常相似。在单窗模式下,主窗口占据整个屏幕且无法操作。对我来说,这似乎是设置 kiosk 机的非常简单的方法。只需将 DWM 置于单窗模式并删除将其置于不同模式的按键序列。

DWM 中的窗口通过为其分配一个或多个标签来组织。然后用户可以选择在每个虚拟屏幕中显示哪些标签。这种机制实际上比我在 KDE 中使用的更灵活,因为它允许给定的窗口出现在任意数量的虚拟屏幕中。我对这种机制还不是很习惯,但我认为一旦我习惯了就会喜欢它。

当我第一次读到对 DWM 的配置更改是通过修改源代码并重新编译来完成时,我简直不敢相信我读到的内容,但它并没有听起来那么糟糕。源代码包含在两个文件中:dwm.c,你不应该修改它,以及 config.h,你可以在其中进行更改。通过更改 config.h,你可以更改配色方案、标签名称、神奇的键盘和鼠标分配等等。config.h 文件只有 100 行注释相当完善的代码,所以让我们快速浏览一下。

从第 5 行开始,我们有外观设置。例如,我们可以通过修改以下语句来设置窗口边框的颜色

static const char normbordercolor[] = "#cccccc";

我们甚至可以更改用于框架窗口的像素数(默认为 1)以及状态栏出现的位置。

我们可以在第 16 行预定义我们要用于组织窗口的标签名称。默认情况下,标签名称只是数字 1 到 9。

static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };

我们可以将这些重新定义为“email”、“reference”、“work”、“play”或任何对我们有意义的名称。

config.h 文件的下一部分我认为可以添加更多注释。这是规则部分。默认情况下是这样的

static const Rule rules[] = {
        /* class      instance    title       tags mask     isfloating   monitor */
        { "Gimp",     NULL,       NULL,       0,            True,        -1 },
        { "Firefox",  NULL,       NULL,       1 << 8,       False,       -1 },
};

从这里,我了解到 DWM 可以不同地处理不同的应用程序,但这里的文档有点缺乏。

接下来,我们看到一些布局配置选项,但我将跳到键盘和鼠标命令部分,从中我提取了一些亮点。

/* commands */ 
static const char *termcmd[]  = { "uxterm", NULL };                                                                                                             

在这里我们看到开发人员描述了启动 uxterm 程序所涉及的内容。还定义了其他命令,用户当然可以根据需要扩展此列表。这些定义在下一节中使用,我们在其中为按键分配功能。

在本节中,我们可以确定当我们按下各种按键组合时会发生什么。MODKEY 常量在其他地方已被定义为 Alt 键。看一看

static Key keys[] = {
/* modifier            key          function     argument*/      
{ MODKEY|ShiftMask,    XK_Return,   spawn,       {.v = termcmd } },                                                                                        
{ MODKEY,              XK_t,        setlayout,   {.v =&layouts[0]} },
{ MODKEY,              XK_f,        setlayout,   {.v = &layouts[1]} },
{ MODKEY,              XK_m,        setlayout,   {.v = &layouts[2]} },
};

第一个条目只是说,当用户按下按键序列 时,DWM 应该生成一个 x-terminal。从这里,很容易看出如何定义一个热键序列来启动我们最喜欢的 Web 浏览器。最后,我已经展示了如何定义窗口布局(平铺、浮动和单窗)模式的按键序列。例如,如果我们想创建一个 kiosk 机,我们只需在此处删除其他选项。

鼠标序列的定义方式类似。

在 DWM 的 config.h 文件中可以找到惊人的配置量。但回到汽车的比喻,我只是想打开引擎盖,向你展示火花塞在哪里以及如何检查机油。

我认为最终,如果你想要一个功能齐全、设施完善的窗口管理器,DWM 可能不适合你。另一方面,如果你想要一些轻便快速的东西,并且喜欢摆弄,我肯定会看看 DWM。

加载 Disqus 评论