从零开始dwm安装配置

前言

本篇博文会带你从零开始安装配置dwm
可以看看我的dwm配置:

https://github.com/Aidens-fox/dwm

下载安装&启动dwm

在安装dwm之前我们需要安装一些必要的软件,比如xorg,编译工具等等
sudo pacman -S base-devel git xorg-server xorg-xinit xorg-xrandr xorg-xsetroot xorg-xset xsel xorg-xkill libx11 libxft libxinerama xwallpaper
我们可以使用git工具来克隆dwm项目
git clone https://git.suckless.org/dwm

其他的比如st,dmenu也需要克隆,不然进入后无法打开终端和软件启动器
st: git clone https://git.suckless.org/st
dmenu: git clone https://git.suckless.org/dmenu

克隆完成后cd到项目目录编译安装dwm(st和dmenu也一样)
`sudo make clean install

编译安装好后我们在.xinitrc文件添加:
exec dwm
保存后只需要用在tty输入startx就可以启动
(注:exec dwm必须放在最后一行,不然无法启动)

配置dwm

我们cd到dwm目录下会发现有很多文件,其中config.def.h是我们修改配置的文件,虽然在第一次编译后产生的config.h文件也可以配置dwm,但是很多补丁添加快捷键都是修改在config.def.h上面,如果直接使用config.h来配置dwm可能就需要手动添加补丁的快捷键了,使用我比较习惯修改config.def.h在rm -rf config.h删除之前旧配置,不然再次编译安装就还是之前的配置

状态栏配置字体和位置&颜色

在默认配置中的状态栏字体是十分丑陋的,中文显示不友好,所有需要修改字体:

1
2
3
4
5
static const char *fonts[]   = {	
"JetBrainsMono Nerd Font:size=15",
"Sarasa Mono SC:size=15",
"Noto Color Emoji:size=15"
};

字体使用更纱黑体和jetbrains,noto
sudo pacman -S ttf-sarasa-gothic noto-fonts noto-fonts-emoji noto-fonts-cjk ttf-jetbrains-mono-nerd

状态栏默认的配色方案可能有一点难看,所有可以更改颜色

1
2
3
4
5
static const char col_gray1[]       = "#282828"; // 背景色
static const char col_gray2[] = "#282828"; // 非激活窗口
static const char col_gray3[] = "#ebdbb2"; // 文字颜色
static const char col_gray4[] = "#ebdbb2"; // 激活窗口边框/文字
static const char col_cyan[] = "#5b623e"; // 选中标签颜色

本配色方案参考gruvbox

tags工作区默认显示的是1234,如果你觉得太普通也可以改成中国数字大写
`static const char *tags[] = { “壹”, “貳”, “叁”, “肆”, “伍”, “陸”, “柒”, “捌”, “玖” };

修改mod键

在dwm中默认是alt为mod键,我本人不太习惯,所以我把它更改为win键
#define MODKEY Mod4Mask

亮度&音量快捷键支持

在config.h中添加下面内容,启用多媒体按键
#include <X11/XF86keysym.h>

调节音量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static const char *up_vol[]   = { "pactl", "set-sink-volume", "@DEFAULT_SINK@", "+10%",   NULL };
static const char *down_vol[] = { "pactl", "set-sink-volume", "@DEFAULT_SINK@", "-10%", NULL };
static const char *mute_vol[] = { "pactl", "set-sink-mute", "@DEFAULT_SINK@", "toggle", NULL };
...

static const Key keys[] = {
...

{ 0, XF86XK_AudioMute, spawn, {.v = mute_vol } },
{ 0, XF86XK_AudioLowerVolume, spawn, {.v = down_vol } },
{ 0, XF86XK_AudioRaiseVolume, spawn, {.v = up_vol } },

...
};


调节亮度(需要安装brightnessctl)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
static const char *brighter[] = { "brightnessctl", "set", "10%+", NULL };
static const char *dimmer[] = { "brightnessctl", "set", "10%-", NULL };
...

static const Key keys[] = {
...

{ 0, XF86XK_MonBrightnessDown, spawn, {.v = dimmer } },
{ 0, XF86XK_MonBrightnessUp, spawn, {.v = brighter } },

...
};


状态栏显示内容

我们可以通过xsetroot -name的方式来让状态栏显示我们需要的内容,在.xinitrc添加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
while true; do
light=$(brightnessctl -m | cut -d, -f4)
bat_s=$(< /sys/class/power_supply/BAT0/status)
bat=$(< /sys/class/power_supply/BAT0/capacity)
time=$(date +"󱑂 %Y-%m-%d-(0%u) %H:%M:%S")
audio_raw=$(wpctl get-volume @DEFAULT_AUDIO_SINK@)

if [[ "$audio_raw" == *"[MUTED]"* || "$audio_raw" == *"[NO]"* ]]; then
audio="MUTED"
else
audio=$(echo "$audio_raw" | awk '{print ($2 * 100)"%"}')
fi

if [[ "$(< /sys/class/net/wlp0s20f3/operstate)" == "up" ]]; then
net_icon="*"
else
net_icon="-"
fi

if ss -tln | grep :0000; then #"0000"改成自己的代理端口
proxy_str="+"
else
proxy_str="-"
fi

if [[ "$bat_s" == "Discharging" ]]; then
bat_icon=" "
else
bat_icon=" "
fi

xsetroot -name "[$proxy_str][$net_icon][ $audio][󰌵$light][$bat_icon$bat%][$time]"
sleep 1s
done &

如果你觉得那么多东西塞在.xinitrc很乱,可以创建一个脚本文件,里面写入上面的内容,在.xinitrc只需要循环执行这个脚本就可以了
脚本内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/zsh

light=$(brightnessctl -m | cut -d, -f4)
bat_s=$(< /sys/class/power_supply/BAT0/status)
bat=$(< /sys/class/power_supply/BAT0/capacity)
time=$(date +"󱑂 %Y-%m-%d-(0%u) %H:%M:%S")
audio_raw=$(wpctl get-volume @DEFAULT_AUDIO_SINK@)

if [[ "$audio_raw" == *"[MUTED]"* || "$audio_raw" == *"[NO]"* ]]; then
audio="MUTED"
else
audio=$(echo "$audio_raw" | awk '{print ($2 * 100)"%"}')
fi

if [[ "$(< /sys/class/net/wlp0s20f3/operstate)" == "up" ]]; then
net_icon="*"
else
net_icon="-"
fi

if ss -tln | grep :0000; then #"0000"改成自己的代理端口
proxy_str="+"
else
proxy_str="-"
fi

if [[ "$bat_s" == "Discharging" ]]; then
bat_icon=" "
else
bat_icon=" "
fi

xsetroot -name "[$proxy_str][$net_icon][ $audio][󰌵$light][$bat_icon$bat%][$time]"

.xinit文件写入

1
2
3
4
5
while true; do
/home/用户名/脚本.sh
sleep 1s
done &

自启动软件

我们编辑.xinitrc文件
在里面添加你需要自启动的软件,比如fcitx5
exec fcitx5 &

打补丁

补丁是dwm的一大特色,我们可以到https://dwm.suckless.org/patches/去找补丁,然后在dwm目录下新建一个叫patches的文件夹
mkdir patches
把你想要的补丁下载下来,如attachaside,再安装补丁
patch < patches/dwm-xxxxxxx.diff
卸载补丁
patch -R < patches/dwm-xxxxxxxxx.diff

不过在打补丁的过程中可能会出现报错,这个时候就要查config.def.h.rej和dwm.c.rej文件来看看需要删除什么和添加什么,然后在重新编译基本就可以解决问题了

解决dwm浏览器无法弹出文件对话框

参考https://forum.archlinuxcn.org/t/topic/13788
把以下命令添加到.xinitrc文件中

1
dbus-update-activation-environment --systemd DISPLAY

关闭自动熄屏

在.xinitrc添加
xset s off -dpms

添加一个壁纸

安装xwallpaper后在.xinitrc添加
xwallpaper --zoom 壁纸.png

解决火焰截图无法截屏

参考https://bbs.archlinux.org/viewtopic.php?id=313917
在/.config/flameshot/flameshot.ini文件添加

1
2
[General]
useX11LegacyScreenshot=true