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 接收并根据类型处理 xevent
RootWin, 指没打开任何界面的 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.

关于设置中的 isfloatingmonitor:

  • “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函数族中的一员,用于在当前进程中执行新的程序。

keypressbuttonpress 都会调用 spawn 函数来运行指令.

随记

restack 将一个 client float


DWM-源码
http://example.com/2023/02/26/DWM-源码/
作者
Jie
发布于
2023年2月26日
许可协议