如何使用我的笔记本电脑底座自动切换显示器

Cas*_*Cas 11 dock nvidia multiple-monitors 11.04

我有一台 Dell Precision M4300,带有运行 Ubuntu Natty 的 Dell Dock PRO1X。

当我将笔记本电脑对接时,液晶显示器关闭,我使用两个外接显示器,但是当我将笔记本电脑断开时,它不会切换到笔记本电脑屏幕。当我对接笔记本电脑时也会发生同样的情况,它不会切换到外接显示器。

如果我重新启动笔记本电脑,它将选择正确的设置,但它不会在 Ubuntu 运行时自动更改显示器。

我的Xorg.conf

Cas*_*Cas 10

停靠/取消停靠脚本

我终于完成了一个完整的脚本设置,它将检测我的坞站状态并自动切换显示器。

我做的第一件事是删除我的 Xorg.conf,因为它导致了更多问题,但它解决了。由于我使用的是NVDIA卡我最终发现,用分散机是最好的一段路要走。我之前打折过它,因为它的标准命令无法实现我的双视图设置,但后来我发现我可以创建一个自定义元模式与 disper 一起使用。

为了创建自定义元模式,我使用了存储在 Xorg.conf 中的值以及之前使用nv-control-dpyxrandr作为指导的测试。此元模式和其他 twinview 值已添加到可以通过stdin传递给 disper 的文件中。

由于 Twinview 有不同大小的显示器,我需要使用XCreateMouseVoid,如本问题所述

以下是脚本和文件及其内容的完整细分。


脚本

  1. 创建 XCreateMouseVoid 脚本:

    脚本名称: ~/.mousevoid

    #!/bin/bash
    echo "Mouse Void"
    /opt/XCreateMouseVoid/XCreateMouseVoid 0 1112 1280 88 &
    /opt/XCreateMouseVoid/XCreateMouseVoid 0 0 1280 88 &
    
    Run Code Online (Sandbox Code Playgroud)

    chmod +x ~/.mousevoid

  2. 创建分散设置文件:

    文档名称: ~/.disperDocked

    backend: nvidia
    associated displays: CRT-0, DFP-0, DFP-1
    metamode: CRT-0: 1280x1024_60 @1280x1024 +0+88, DFP-1: 1920x1200 @1920x1200 +1280+0
    scaling: default, default, stretched
    xinerama info order: DFP-1, CRT-0, DFP-0
    
    Run Code Online (Sandbox Code Playgroud)
  3. 创建导出 dbus 会话脚本:

    脚本名称: ~/.export_x_info

    #!/bin/bash
    # Export the dbus session address on startup so it can be used by any other environment
    sleep 5
    touch $HOME/.Xdbus
    chmod 600 $HOME/.Xdbus
    env | grep DBUS_SESSION_BUS_ADDRESS > $HOME/.Xdbus
    echo 'export DBUS_SESSION_BUS_ADDRESS' >> $HOME/.Xdbus
    # Export XAUTHORITY value on startup so it can be used by cron
    env | grep XAUTHORITY >> $HOME/.Xdbus
    echo 'export XAUTHORITY' >> $HOME/.Xdbus
    
    Run Code Online (Sandbox Code Playgroud)

    设置为仅用户可执行: chmod 700 ~/.export_x_info

    然后把它放在启动应用程序中:

    Name: X Environment Variables
    Command: /home/your_user/.export_x_info
    
    Run Code Online (Sandbox Code Playgroud)

    除非您重新启动,否则您需要运行 ~/.export_x_info 来创建.Xdbus文件

  4. 创建将在停靠事件上运行的 udev 规则:

    脚本名称: /etc/udev/rules.d/81-dell-dock.rules

    KERNEL=="dock.0", ACTION=="change", RUN+="/usr/local/sbin/dell-dock"

    chmod +x /etc/udev/rules.d/81-dell-dock.rules

  5. 创建与 udev 规则关联的脚本:

    脚本名称: /usr/local/sbin/dell-dock

    #!/bin/sh
    # wait for the dock state to change
    sleep 0.5
    DOCKED=$(cat /sys/devices/platform/dock.0/docked)
    case "$DOCKED" in
       "0")
           echo "Run UnDocking Script..."
            /usr/local/sbin/undock
            ;;
        "1") 
            echo "Run Docking Script..."
            /usr/local/sbin/dock
            ;;
    esac
    exit 0
    
    Run Code Online (Sandbox Code Playgroud)

    chmod +x /usr/local/sbin/dell-dock

  6. 创建取消停靠脚本(更改your_user以匹配您的用户名):

    脚本名称: /usr/local/sbin/undock

    #!/bin/bash
    USER=your_user
    export HOME=/home/$USER
    source $HOME/.Xdbus
    export DISPLAY=:0
    echo "UnDocking Script"
    echo "Switch primary monitor"
    sudo -u $USER disper -s
    echo "Killall XCreateMouseVoid"
    pkill XCreate
    echo "Restart conky"
    pkill conky
    sudo -u $USER conky &
    
    Run Code Online (Sandbox Code Playgroud)

    chmod +x /usr/local/sbin/undock

  7. 创建停靠脚本(更改your_user以匹配您的用户名):

    脚本名称: /usr/local/sbin/dock

    #!/bin/bash
    USER=your_user
    export HOME=/home/$USER
    source $HOME/.Xdbus
    export DISPLAY=:0
    echo "Docking Script"
    echo "Switch to Dualview"
    sudo -u $USER disper -i < $HOME/.disperDocked
    echo "Start XCreateMouseVoid"
    pkill XCreate
    sudo -u $USER $HOME/.mousevoid
    echo "Restart conky"
    pkill conky
    sudo -u $USER conky &
    
    Run Code Online (Sandbox Code Playgroud)

    chmod +x /usr/local/sbin/dock


调试

要调试停靠脚本,您必须启用 udev 调试日志记录:

udevadm control --log-priority=debug
Run Code Online (Sandbox Code Playgroud)

然后在日志文件查看器中打开syslog


资源

nVidia 自述文件:配置 TwinviewX 配置选项
Autorandr
Disper PPA
nv-control-dpy
Ubuntu 论坛 - Un/Dock Scripts
Thinkwiki
udevadm