一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第22天,点击查看活动详情。
窗口管理器是管理桌面上各种窗口的组件,主要功能有:窗口堆叠方式,窗口移动规则等。大多数人接触到的是堆叠式窗口管理器,一个窗口可以叠放在其他窗口之上,调整窗口的主要方式是鼠标。而dwm(Dynamic Window Manager)是suckless开发的一个动态窗口管理器,可以自定义不同窗口的出现规则如平铺或者堆叠,它调整窗口的主要方式是键盘。
同桌面环境一样,dwm也必须有最基本的软件支撑,推荐安装下面的软件:
| 软件名 | 软件介绍 |
|---|---|
| dwm | 动态窗口管理器,suckless开发 |
| demu | 应用程序选择器,suckless开发 |
| st | 终端模拟器,suckless开发 |
| feh | 壁纸设置程序 |
| pcmanfm | 文件管理系统 |
| fcitx5 | 输入法 |
1.创建一个用户,并赋sudo权限
起手式,就是创建用户,避免用root登录系统。
useradd -m hollowman
usermod -aG adm,wheel hollowman
passwd hollowman
vim /etc/sudoers #找到 #%wheel ALL=(ALL:ALL) ALL去掉注释
%wheel ALL=(ALL:ALL) ALL
2.安装xorg协议及必要软件
$ sudo pacman -S xorg xorg-xinit
$ sudo pacman -S feh udisks2 udiskie pcmanfm git
$ systemctl enable udisks2 #自动启动udisks2服务,可以使得文件管理系统(pcmanfm)能够自动识别U盘
3.安装dwm,st,dmenu
$ git clone https://git.suckless.org/dwm
$ git clone https://git.suckless.org/st
$ git clone https://git.suckless.org/dmenu
$ cd dwm
$ sudo make clean install #编译安装
$ cd ../st
$ sudo make clean install
$ cd ../dmenu
$ sudo make clean install
4.安装显卡驱动
由于我的是KVM虚拟机,使用的是qxl虚拟网卡,如不装驱动,会提示找不到display,因此需安装驱动后重启。
sudo pacman -S xf86-video-qxl
4.配置自动启动dwm
$ cp /etc/X11/xinit/xinitrc ~/.xinitrc
$ sudo vim .xinitrc #注释掉最后5行,并添加exec dwm
#twm &
#xclock -geometry 50x50-1+1 &
#xterm -geometry 80x50+494+51 &
#xterm -geometry 80x20+494-0 &
#exec xterm -geometry 80x66+0+0 -name login
exec dwm
$ startx #启动dwm,若启动失败,考虑重装xorg和xorg-xinit
5. 配置dwm
先看下下面的4个基础用法(这里Mod1指的是alt键):
启动dmenu:Mod1 + p,并在上边出现的工具条中输入你想运行的程序名,按回车。
启动终端st:Mod1 + Shift + enter
切换工作区(1-9):Shift + Mod1 + x
关闭当前窗口:Mod1 + Shift +c
退出 dwm:Mod1 + Shift + q
$ cd dwm
$ sudo vim config.h #查看并修改dwm的配置信息,重点学习按键操作。
...省略的配置信息....
#define MODKEY Mod1Mask #定义MODKEY,默认是Mod1Mask(Alt键),如怕冲突,可修改为Mod4Mask(Window键),修改后要重新编译安装才能生效。
...省略的配置信息....
static Key keys[] = {
/* modifier key function argument */
{ MODKEY, XK_p, spawn, {.v = dmenucmd } }, # MODKEY + p 打开程序管理器dmenu
{ MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, # MODKEY + Shift + Return 打开终端模拟器st
{ MODKEY, XK_b, togglebar, {0} }, # MODKEY + b 显示/隐藏dwm顶部的状态栏
{ MODKEY, XK_j, focusstack, {.i = +1 } }, # MODKEY + j 工作窗口焦点切换,窗口层次+1,也就是下移1层
{ MODKEY, XK_k, focusstack, {.i = -1 } }, # MODKEY + k 工作窗口焦点切换,窗口层次-1,也就是上移1层
{ MODKEY, XK_i, incnmaster, {.i = +1 } }, # MODKEY + i 平铺式工作窗口排列布局切换
{ MODKEY, XK_d, incnmaster, {.i = -1 } }, # MODKEY + d 平铺式工作窗口排列布局切换
{ MODKEY, XK_h, setmfact, {.f = -0.05} }, # MODKEY + h 平铺式工作窗口大小比例切换,主窗口-5%
{ MODKEY, XK_l, setmfact, {.f = +0.05} }, # MODKEY + l 平铺式工作窗口大小比例切换,主窗口+5%
{ MODKEY, XK_Return, zoom, {0} }, # MODKEY + Return 将第一层窗口(主窗口)与当前焦点所在的窗口或者第2层的窗口交换位置
{ MODKEY, XK_Tab, view, {0} }, # MODKEY + Tab 切换到上一次进入的工作区
{ MODKEY|ShiftMask, XK_c, killclient, {0} }, # MODKEY + Shift + c 关闭工作窗口
{ MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, # MODKEY + t 将窗口布局模式设为layouts[0]也就是平铺
{ MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, # MODKEY + f 将窗口布局模式设为layouts[1]也就是浮动堆叠,但不改变打开的窗口大小
{ MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, # MODKEY + m 将窗口布局模式设为layouts[2]也就是全屏堆叠
{ MODKEY, XK_space, setlayout, {0} }, # MODKEY + Space 在最近获得焦点的两个窗口排列模式之间来回切换
{ MODKEY|ShiftMask, XK_space, togglefloating, {0} }, # MODKEY + Shift + Space 将工作区窗口布局模式调整为浮动式模式,且会将第2层的窗口调整为全屏,注意与 XK + f 区分
{ MODKEY, XK_0, view, {.ui = ~0 } }, # MODKEY + [0-9] 显示对应工作区的工作窗口,如果是0则显示所有工作区的所有工作窗口
{ MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, # MODKEY + Shift + [0-9] 将当前工作窗口移动至对应工作区,如果是0则表示将当前工作窗口移动至每个工作区(不是拷贝)
{ MODKEY, XK_comma, focusmon, {.i = -1 } }, # MODKEY +
{ MODKEY, XK_period, focusmon, {.i = +1 } }, # MODKEY +
{ MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, # MODKEY + Shift +
{ MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, # MODKEY + Shift +
TAGKEYS( XK_1, 0) # MODKEY + 1 切换到1号工作区
TAGKEYS( XK_2, 1) # MODKEY + 2 切换到2号工作区
TAGKEYS( XK_3, 2) # MODKEY + 3 切换到3号工作区
TAGKEYS( XK_4, 3) # MODKEY + 4 切换到4号工作区
TAGKEYS( XK_5, 4) # MODKEY + 5 切换到5号工作区
TAGKEYS( XK_6, 5) # MODKEY + 6 切换到6号工作区
TAGKEYS( XK_7, 6) # MODKEY + 7 切换到7号工作区
TAGKEYS( XK_8, 7) # MODKEY + 8 切换到8号工作区
TAGKEYS( XK_9, 8) # MODKEY + 9 切换到9号工作区
{ MODKEY|ShiftMask, XK_q, quit, {0} }, # MODKEY + Shift + q 退出dwm动态窗口管理器
...省略的配置信息....
6.安装应用,以火狐为例
sudo pacman -S firefox
但是打开火狐发现有乱码,是因为缺少字体的原因(忘记截图了),安装字体就可以了
7. 安装字体
xorg图形界面常用到的字体:
sudo pacman -S ttf-dejavu ttf-droid ttf-hack ttf-font-awesome otf-font-awesome ttf-lato ttf-liberation ttf-linux-libertine ttf-opensans ttf-roboto ttf-ubuntu-font-family
sudo pacman -S ttf-hannom noto-fonts noto-fonts-extra noto-fonts-emoji noto-fonts-cjk
sudo pacman -S adobe-source-code-pro-fonts adobe-source-sans-fonts adobe-source-serif-fonts adobe-source-han-sans-cn-fonts adobe-source-han-sans-hk-fonts adobe-source-han-sans-tw-fonts adobe-source-han-serif-cn-fonts
sudo pacman -S wqy-zenhei wqy-microhei
6.配置dwm启动时自动加载项
如不配置,dwm窗口的当前分辨率为1024x768,需调整为自动加载,先看看命令如何设置:
$ xrandr -q
$ xrandr --output Virtual-1 --mode 1920x1080 --rate 60.00 #修改显示器屏幕分辨率及刷新率,但重启失效
dwm可以设置一个背景,如下可实现:
$ sudo pacman -S archlinux-wallpaper
$ feh --bg-fill --randomize /usr/share/backgrounds/archlinux/* #添加背景,但重启失效
结合上面的配置,将其添加到自动加载:
$ sudo vim ~/.xinitrc #在exec dwm 前添加2行,注意先修改分辨率,否则背景会不全屏。
xrandr --output Virtual-1 --mode 1920x1080 --rate 60.00 #修改显示器屏幕分辨率及刷新率
feh --bg-max --randomize /usr/share/backgrounds/archlinux/* #添加背景
exec dwm
效果图