在 Manjaro 中使用 dwm

从 Linux Mint 到 Manjaro

我一个 Linux Mint 用户,怎么就变成 Manjaro 用户了呢?

自从上次装完 Linux Mint 20 Xfce 以后,我的体验还是不错的,我不需要很臃肿复杂的环境,很多软件对 Ubuntu 系发行版支持确实不错,用起来也算是没什么大问题。直到前段时间手贱安装了 TwistUI,想卸载时发现很难卸载干净,所以决(zhi)定(neng)重装系统,正好时间点在 7 月份中旬,Linux Mint 21 还没有发布,于是需求变成了换个发行版。开始的时候我打算试试 NixOS,在虚拟机上体验了一会,可惜 NixOS 不是 FHS,怕自己用得不太习惯,最后选择了 Manjaro。

开始我装的是 Manjaro i3,这是我第一次尝试平铺窗口管理器,再加上我不太熟悉 Manjaro 生态(虽然好多年前用过一段时间 Arch Linux),用的不太习惯。然后我又重装了 Manjaro Xfce,让我先过渡到 Manjaro 生态。

Manjaro Xfce 使用上和 Linux Mint Xfce 区别不大,而且有 ArchWiki 帮助,基本不会遇到难解决的问题。在 Arch 系发行版下的比较独特的是 AUR,这是一个很活跃的社区驱动的软件仓库,可以找到很多官方仓库中不提供的软件(例如 Chrome 和 VSCode)或比官方仓库更激进的更新版本,所以 AUR 是 Arch 系发行版安装私有软件的主要来源。(不过 Linux 下我最喜欢的还是通过 Flatpak 安装管理软件

从 Xfce 到 dwm

在熟悉 Manjaro 后我还是想试试平铺式窗口管理器,所以接触 dwm 后我就想尝试在保留 Xfce 的情况下切换到 dwm。严格来说,Xfce 是桌面环境,dwm 只是一个窗口管理器,在 dwm 下仍然可以用 Xfce 周边软件。关于 dwm 的详细内容,建议优先参考 ArchWiki 上 dwm 页面,少走很多弯路。

patches

我装了 3 个 patch,分别是:

  • autostart:简单理解就是在 dwm 启动时调用 system("~/.dwm/autostart.sh &")
  • hide vacant tags:隐藏没有窗口的 tag
  • awesomebar:比较完整的窗口体验,支持 tag 内显示隐藏窗口,详细功能看文档,awesomebar 和 6.3 不兼容,patch 时要注意一些冲突的语义。

其他 patch 我没太关注所以才没安装。

config.h

因为 patch 会改动 config.def.h,我建议先 apply patch 再修改 config.h,项目默认没有 config.h,需要复制 config.def.h 为 config.h。

config.h 里主要是关于快捷键和外观的配置。

rules 里配置一些窗口规则,我平时会用到 Wine App,Wine App 有一个特征是 class 都是 Wine,还有 Firefox 的 PIP 窗口,窗口 instance 是 Toolkit,这两类我都配了 floating 规则,如果是 Chrome PIP 窗口,那就没办法从 class 区分,只能通过判断 name 是不是 Picture in picture

我的改动

我对 dwm 做了两个小改动,第一个是把 tag 和 view 函数组合在一起,形成一个 tagview,这样在 tag 一个窗口的同时切换到对应的 view。另一个是 dwm 启动时会启动 ssh-agent,这个多说两句。

ssh-agent 启动后需要暴露环境变量 SSH_AUTH_SOCK 才能让进程正确访问 ssh-agent,比较推荐的做法有通过 ssh-agent 启动子进程:

1
2
ssh-agent bash
echo $SSH_AUTH_SOCK

或者利用 ssh-agent -s 启动守护进程并且执行输出内容重新暴露环境变量:

1
2
eval $(ssh-agent -s)
echo $SSH_AUTH_SOCK

如果用 autostart 启动 ssh-agent 守护进程环境是没办法传递给 dwm 的,所以要么 ssh-agent dwm,要么 dwm 能在启动 ssh-agent 守护进程后处理输出内容来暴露环境变量,其实这就是 xfce4-session 启动 ssh-agent 的机制,参考 xfce4-session 的启动代码 xfsm-startup.c

我在 dwm 里借鉴了这个机制,暴露把关键环境变量同步到 dwm,目前只支持 ssh-agent,没有支持 gpg-agent。

还有一个启动 ssh-agent 的方式,可以参考 wiki Enable the keyring ssh component,但我没有验证过。

安装和启动

安装通过执行:

1
sudo make clean install

Manjaro Xfce 自带 lightdm,安装 dwm 后可以为 lightdm 添加 dwm 入口:

1
2
3
4
5
6
7
echo '[Desktop Entry]
Name=DWM Session
Comment=
Exec=dwm
Icon=
Type=Application
DesktopNames=DWM' | sudo tee /usr/share/xsessions/dwm.desktop

添加后只要退出当前会话,在 lightdm 登录界面选择 DWM 会话,然后重新登录就行了。

其他

dwm 安装后有两个推荐安装的程序,分别是 dmenu 和 slock,dmenu 的使用 dwm 已经配好了,slock 没有定制需求可以直接用 pacman -S slock 安装。

我要重点说一下 slock 锁屏后解锁方式:直接在锁屏界面输入密码按回车就能解锁(我一开始不会解锁只能靠快捷键退出整个 dwm 真的太蠢了😂)。

更新状态栏 wiki 里说的很明白了,我写了一个 dwm-status 自动去更新状态栏。

因为有 Xfce,启动浏览器和终端我都用的是 exo-open,终端用的是 alacritty,浏览器换来换去最后换到了 Firefox,截图换了 flameshot,xfce4-screenshooter 可以用,但是不能复制到剪贴板,flameshot 在需要的时候会启动一个后台进程来提供剪贴板功能,音量控制可以用 pulseaudio-ctl up/dwown。

还有就是很多人都在用的轻量托盘 trayer 和桌面通知 dunst。

结尾

dwm 的极简主义适合我这种愿意牺牲体验换取自我满足感的人,这也是我用 Linux 作为日常系统的目的~当然,我非常推荐先安装 Xfce 然后再切换到 dwm,这样会舒服一些。

manjaro-dwm-screenshot.png

最后的最后,附上我个人 dwm 相关仓库:

参考

其他参考内容基本都来自 ArchWikisuckless,这里就不列出了。