DWM 设置多显示屏

        (转载请注明出处)

        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
    
  • 方便的图形化界面——arandr
  •         直接用终端命令控制显示器设置确实很赞,但不常用的东西时间一久就容易忘记。对于 xrandr 来说,有一个更方便使用的图形化封装程序,叫做 arandr。它除了可以直观地设置显示器参数,还可以将配置保存为脚本,方便下次直接执行。

    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 的更多修改
  •         在不停折腾的过程当中,我发现可以通过修改 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多显示器设置

DWM 设置多显示屏》上有2条评论

  1. MODKEY + ,
    MODKEY + .
    上面两个(在两个显示器中都有内容时)可以代替 MODKEY + XK_Left 和 MODKEY + XK_Right,而且也更好用。
    另外,我发现文中 MODKEY + XK_u 的设计在多显示器使用的时候可能会出错导致图形界面退出,不再推荐使用。
    感谢春哥。

发表评论

电子邮件地址不会被公开。 必填项已用*标注