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

我有一台Dell Precision M4300,戴着Dell Dock PRO1X,运行Ubuntu Natty。

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

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

我的Xorg.conf

Dock / UnDock脚本

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

我做的第一件事是摆脱我的Xorg.conf,因为它导致了更多的问题,它解决了。 由于我使用的是nvdia卡,我最终发现使用disper是最好的方法。 我之前打了折扣,因为它的标准命令无法实现我的双视图设置,但后来我发现我可以创建一个与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 & 

    chmod +x ~/.mousevoid

  2. 创建Disper设置文件:

    文件名: ~/.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 
  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 

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

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

     Name: X Environment Variables Command: /home/your_user/.export_x_info 

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

  4. 创建将在dock事件上运行的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 

    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 & 

    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 & 

    chmod +x /usr/local/sbin/dock


调试

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

 udevadm control --log-priority=debug 

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


资源

nVidia自述文件: 配置Twinview , X配置选项
Autorandr
分散PPA
NV-控制DPY
Ubuntu论坛 - Un / Dock脚本
Thinkwiki
udevadm

您可以使用autorandr 。

自动检测连接显示硬件并使用xrandr或disper加载适当的X11设置

根据连接的设备自动选择显示配置

也可以看看:

  • 使用Autorandr解决Linux中的优点问题
  • 插入外部显示器时自动应用RandR配置的工具
  • 如何轻松切换到外接显示器