(转载请注明出处)
DWM 的介绍和编译安装之前已有介绍,最近以来,本人也一直在使用这个窗口管理器。总的来说,其精简,快速,也很稳定,是一个实用又耐折腾的好“桌面”。不过美中也有不足,在两次组会时间,本人发现不知道该怎样来设置外接显示器,也带来了一些使用上的小麻烦。后经多方调查和尝试,终于找到了设置多显示屏的方法。网上的介绍比较少,写在这里备忘一下。
- xrandr 及其基本使用
linux 通过工具 xrandr 设置屏幕显示方式(分辨率、旋转、扩展屏幕等),其具体用法可以通过“man xrandr”查看,这里只介绍一下其最基本的用法,相信日常使用已经足够了。
用 xrandr 命令显示当前连接的显示器,比如外界显示器是 VGA-0,笔记本显示器是 LVDS:
$ xrandr
Screen 0: minimum 320 x 200, current 1280 x 800, maximum 8192 x 8192
VGA-0 disconnected (normal left inverted right x axis y axis)
LVDS connected 1280x800+0+0 (normal left inverted right x axis y axis) 331mm x 207mm
1280x800 60.0*+ 50.0
1280x720 59.9
1152x768 59.8
1024x768 60.0 59.9
800x600 60.3 59.9
848x480 59.7
720x480 59.7
640x480 60.0 59.4
DVI-0 disconnected (normal left inverted right x axis y axis)
打开外接显示器(两个显示器显示同样的内容,如果默认分辨率不同显示就会不太正常):
$ xrandr --output VGA-0 --auto
让外接显示器扩展显示:
$ xrandr --output VGA-0 --right-of LVDS --auto
采用这种方式,外接显示器显示的内容在 LVDS 的右边,可以通过 “MODKEY + 鼠标左键” 拖动当前窗口的内容到外接显示器中。
改变显示器的分辨率,比如从前面的 “xrandr” 输出结果可以看出,当前显示器支持多种分辨率。将分辨率调整为 1280×720 的命令为:
$ xrandr --output LVDS --mode 1280x720
直接用终端命令控制显示器设置确实很赞,但不常用的东西时间一久就容易忘记。对于 xrandr 来说,有一个更方便使用的图形化封装程序,叫做 arandr。它除了可以直观地设置显示器参数,还可以将配置保存为脚本,方便下次直接执行。
arandr 的界面如上图所示,可以通过鼠标拖动改变多个屏幕之间的相对位置。通过“Save As”按钮可以将当前配置保存为 bash 脚本,下次要设置该配置时可以直接执行该脚本。比如下面就是一个自动生成的脚本:
#!/bin/sh xrandr --output VGA-0 --mode 1920x1080 --pos 1280x0 --rotate normal --output LVDS --mode 1280x800 --pos 0x0 --rotate normal --output DVI-0 --off
在不停折腾的过程当中,我发现可以通过修改 dwm 来获得更好的体验。
其一是将左边屏幕中的程序拖动到更大的外接右边屏幕中时,程序窗口并没有铺满,而是还保持着原先的分辨率。在寻找最大化的方法时,我发现 config.h 中有下面一行代码:
{ ClkClientWin, MODKEY, Button3, resizemouse, {0} },
真是得来全不费工夫,原来只要在按住 MODKEY 的情况下用鼠标中键点击窗口,就能使窗口铺满屏幕了。
不过上面的操作虽不麻烦,却不容易记住。在 dwm.c 中还有这样一个函数:
static void setfullscreen(Client *c, Bool fullscreen);
从名字就可以推测,这是将程序窗口设为全屏的函数。于是我加了下面几行代码:
/* File: dwm.c */ void myfulscr(const Arg *arg){ setfullscreen(selmon->sel, True); } void myunfulscr(const Arg *arg){ setfullscreen(selmon->sel, False); } /* File: config.h */ { MODKEY, XK_x, myfulscr, {0} },//全屏显示当前程序 { MODKEY|ShiftMask, XK_x, myunfulscr, {0} },//非全屏
这样就能用键盘控制程序的全屏了。不过问题也来了,这样全屏后连 topbar 也不见了,能不能继续显示 topbar 呢?当然是可以的,我把 setfullscreen 修改成了一个新的函数 setfulscr_withbar。两者的主要不同在于:
/* setfullscreen */ c->isfullscreen = True; c->bw = 0; resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw - c->bw, c->mon->mh); /* setfulscr_withbar */ //bh : bar height resizeclient(c, c->mon->mx, c->mon->my + bh, c->mon->mw, c->mon->mh - bh);
将之绑定到新的快捷键“MODKEY+XK_u”上,就能在保留 topbar 的前提下“全屏”了。
第二处修改是通过快捷键在左右两个屏幕间切换,安装 xdotool 后,在 config.h 中增加如下代码:
/* File: config.h */ static const char *lscreen[] = { "xdotool", "mousemove", "200", "500", "click", "1", NULL }; static const char *rscreen[] = { "xdotool", "mousemove", "2000", "500", "click", "1", NULL }; ... { MODKEY, XK_Left, spawn, {.v = lscreen } },//显示屏切换 { MODKEY, XK_Right, spawn, {.v = rscreen } },
代码的作用很明显,相信也不用解释了,修改后用 MODKEY 加上左右键就能在左右两个屏幕间切换了,再也不需要用鼠标划来划去了。
Linux 下用 xrandr 设置显示器参数确实没有 Windows 下那么方便,具体的用法也需要自己去慢慢琢磨,但 Linux 凭借其高度可定制性,为我们寻找解决方案提供了通向罗马的条条大道。这是黑客精神的一个侧影,也是 *nix 哲学的一种体现。
【本文参考】dwm多显示器设置
试试:
MODKEY + SHIFT + SPACE
MODKEY + SHIFT + ,
MODKEY + SHIFT + .
MODKEY + ,
MODKEY + .
上面两个(在两个显示器中都有内容时)可以代替 MODKEY + XK_Left 和 MODKEY + XK_Right,而且也更好用。
另外,我发现文中 MODKEY + XK_u 的设计在多显示器使用的时候可能会出错导致图形界面退出,不再推荐使用。
感谢春哥。