开发组织:suckless
三种窗口布局模式:平铺、单片和浮动
其他窗口管理器
与ion,larswm和wmii相比,dwm更小、更快、更简单。
窗口布局
平铺布局(tiled layout)
平铺布局中的窗口在主窗口和堆叠区域中进行管理。主区域包含当前最需要关注的窗口,而堆叠区域包含所有其他窗口。
+------+----------------------------------+--------+
| tags | title | status |
+------+---------------------+------------+--------+
| | |
| | |
| | |
| | |
| master | stack |
| | |
| | |
| | |
| | |
+----------------------------+---------------------+
单片布局(monocle layout)
在单片布局中,所有窗口都最大化为屏幕大小。
浮动布局(floating layout)
浮动布局中的窗口可以自由调整大小和移动。
对话框窗口始终是浮动管理的,在所有窗口布局中
Windows用户将熟悉浮动布局。使用[Mod]+[鼠标右键]调整浮动窗口的大小,使用[Mod]+[鼠标左键]移动浮动窗口。这也可以用于升起浮动窗口。
有几种方法可以将特定窗口作为浮动窗口进行管理,尽管平铺布局已被激活:
- [Mod]+[Shift]+[space],它将在活动窗口上切换浮动模式。
- 使用[Mod]+[鼠标右键]调整窗口大小。
- 在窗口上[Mod]+[鼠标中键],将其切换为浮动。
当一些应用程序为了美观或简单地使用而需要这些浮动窗口时,这些浮动窗口可以用来强制特定的窗口尺寸。
如果您想将某种类型的窗口设置为始终浮动,请查看config.def.h和rules数组,其中除一个元素外的最后一个元素定义了这种行为。
窗口分组-tag
指的是窗口标签吧,就是默认状态上的1234这些
窗口按标记分组。每个窗口都可以使用一个或多个标记进行标记。选择某些标记会显示带有这些标记的所有窗口。
桌面显示布局
每个屏幕都包含一个小的状态栏,其中显示所有可用的标签、布局、可见窗口的数量、聚焦窗口的标题以及从根窗口名称属性读取的文本(如果屏幕是聚焦的)。
浮动窗口用空正方形表示,最大化的浮动窗口用窗口标题前的填充正方形表示。所选标签用不同的颜色表示。聚焦窗口的标签在左上角用一个填充的正方形表示。应用于一个或多个窗口的标签在左上角用一个空正方形表示。
窗口聚焦
dwm在窗口周围绘制一个可自定义的小边框,以指示焦点状态。
特点
- dwm没有Lua集成,没有9P支持,没有基于外壳的配置,没有远程控制,并且没有任何额外的工具,例如打印选择或扭曲鼠标。
- dwm只是一个二进制文件,它的源代码保持较小。
- dwm不区分层:没有浮动层或平铺层。无论当前所选标签的客户端是否处于平铺布局,您都可以动态重新排列它们。然而,弹出窗口和固定大小的窗口总是浮动的。
- dwm是通过编辑其源代码进行定制的,这使得它非常快速和安全——它不处理任何在编译时未知的输入数据,除了从根窗口名称读取的窗口标题和状态文本。除了C之外,您不必学习Lua/sh/ruby或一些奇怪的配置文件格式(如X资源文件),就可以根据您的需求进行自定义:您只需要学习C(至少为了编辑头文件)。
- 因为dwm是通过编辑其源代码来定制的,所以制作二进制包是毫无意义的。这使得它的用户群很小,而且很精英。没有新手问愚蠢的问题。不过,也有一些发行版提供二进制包。
- dwm从根窗口的名称中读取,以打印任意状态文本(如日期、负载、电池电量)。这比larsremote、wmiir和其他什么都简单得多。。。
- dwm为每个Xinerama屏幕创建一个视图。
配置dwm
修改config.h
- 窗口边界宽度-boarderpx
- 开机默认隐藏状态栏-showbar=0
规则数组
规则数组允许对某些应用程序(客户端)进行唯一处理。规则有一个匹配部分和一个操作部分。
//规则数组定义示例
static Rule rules[] = {
/* class instance title tags mask isfloating monitor */
{ "Gimp", NULL, NULL, 0, 1, -1 },
{ "Firefox", NULL, NULL, 1 << 8, 1, -1 },
{ "deadbeef", NULL, NULL, 1 << 7, 0 0 }
};
这些规则使每个Gimp和Firefox窗口都是浮动的,并使Firefox窗口显示在标签9上,而不是当前查看的标签上。deadbeef类似地将其窗口显示在标签8上用于辅助显示监视器。
当新客户端出现(发送映射请求)时,将根据其类、实例(WM_class)和标题(WM_NAME)属性的规则进行匹配,然后执行给定的标记和浮动模式设置操作。默认标记掩码为0,这意味着当前查看的标记和默认模式是平铺的,因此isfloating为False或0。
如果客户端的属性包含作为子字符串的给定字符串(区分大小写)或给定NULL(这意味着任何内容都匹配),则客户端匹配。
一个客户端可以应用多个规则,规则按顺序匹配。
获取窗口信息:xprop实用程序可用于获取以下信息:WM_CLASS是(实例、类)WM_NAME(或_NET_WM_NAME)是标题。
# shell脚本打印所选客户端的相关属性(如果属性不包含“=”或“,”)
xprop | awk '
/^WM_CLASS/{sub(/.* =/, "instance:"); sub(/,/, "\nclass:"); print}
/^WM_NAME/{sub(/.* =/, "title:"); print}'
标签掩码
1<<8 = 1 0000 0000 表示标签9
1<<8-1 = 0 1111 1111 表示标签1到标签8
启动时配置
设置状态栏
dwm的状态栏文本存储在根窗口的WM_NAME(X11属性)中,该属性由dwm管理
默认情况下,dwm在其状态栏中显示dwm-X.X。通过设置根窗口的WM_NAME属性来更改此文本。
- 使用下面的命令设置状态栏
xsetroot -name "Some Text"
xprop -root -set WM_NAME "Some Text"
- 使用suckless的slstatus工具
- 使用dwmstatus工具,与suckless编写的工具用法相似
git clone git://git.suckless.org/dwmstatus
cd dwmstatus
make
make PREFIX=/usr install
# add »dwmstatus 2>&1 >/dev/null &« to your .xinitrc
使用shell脚本很容易产生大型脚本,从而引入不必要的依赖项。对此的一个解决方案是用C编写所有内容,这样效率会高得多。
使用dwm
右键点击标签,可以选中多个标签,执行的命令在每个标签都会打开窗口。
测试换行符自动转换
测试中文显示