DWM-源码
DWM 的一些理念
给窗口打上标签.
可以给一个窗口打上多个标签.
管理结构为一个栈. 默认在栈头部增加窗口.
不同布局.
DWM DOC
文件结构
├── config.def.h – 配置文件
├── config.mk – 打包构建, 一般不修改
├── drw.c – DWM 封装好的关于字体, 光标等的抽象好的方法定义
├── drw.h – 上面的头, drw 应该是指 draw
├── dwm.1 – man dwm 的内容
├── dwm.c – 源代码主体部分
├── dwm.png
├── LICENSE
├── Makefile
├── README
├── transient.c
├── util.c
└── util.h – 工具方法和宏
main 执行
main 函数在 dwm.c
文件的最下面.
grabkeys()
函数用于捕捉键盘键位.
run()
比较关键.
handler event 也比较关键.
用 setup()
初始化一些变量, 用 run()
等待监听 xevent 并用对应的 handler 执行, 参数为 ev.
当 running = 0
时, dwm 退出.
关键变量
handler
定义了 dwm 接收并根据类型处理 xeventRootWin
, 指没打开任何界面的 Win 窗口.keys
buttons
layouts
关键方法 (handler)
keypress
: 处理键盘行为.
关键数据结构
每一个窗口都是一个 Client
结构体.
Monitor
, 是监视器.
Arg
, 全局参数.
DWM 带注释的源码分析
设置 rules
需匹配 class, instance (WM_CLASS) 和 title (WM_NAME or _NET_WM_NAME).
可用 xprop
命令查看如:
这里 WM_CLASS
的第一个值 Navigator
为 instance, 第二个值 firefox
为 class.
_NET_WM_ICON_NAME
的值为 title.
关于设置中的 isfloating
和 monitor
:
“isfloating”(浮动):它指定了窗口是否应该浮动在其他窗口的上方。如果将其设置为1,表示窗口是浮动的;如果设置为0,表示窗口将按照窗口管理器的布局规则进行排列。
“monitor”(显示器):它指定了窗口应该出现在哪个显示器上。如果将其设置为-1,表示窗口可以出现在任何显示器上;如果设置为特定的显示器编号,表示窗口将被限制在该显示器上。
tags
使用 bit mask 来区分 tags, 如:
000000001
, 表示 tag ‘1’100000000
, 表示 tag ‘9’
从 least significant bit 到 most significant bit.
键位
可用 xmodmap
命令查看可用的 modifiers. 对应的 modifier 也可以用 xmodmap
更换为其他键.
X11 定义的 button1-5 为:
- button1:通常是鼠标左键,常用于选择、点击和拖动操作。
- button2:通常是鼠标中键,也称为滚轮按钮。在一些配置中,它可以用于滚动文本或图像。
- button3:通常是鼠标右键,常用于上下文菜单的弹出和其他辅助功能。
- button4:通常是鼠标滚轮向上滚动的按钮。它可以用于向上滚动文本或图像。
- button5:通常是鼠标滚轮向下滚动的按钮。它可以用于向下滚动文本或图像。
执行命令
关于 C 语言中的 execvp
函数: 用于执行其他程序的函数。它是exec函数族中的一员,用于在当前进程中执行新的程序。
keypress
和 buttonpress
都会调用 spawn
函数来运行指令.
随记
用 restack
将一个 client float