我有一台配备 nvidia optimus 的 lenovo thinkpad 和一个迷你扩展坞系列 3。
我希望在对接时,如果可能的话,它应该自动切换到外部显示器,如果我断开对接,它应该自动切换到thinkpad lcd。
这也应该在启动阶段起作用,因为我必须输入加密磁盘(dm-crypt)的密码。
我尝试了以下方法,但它不起作用:
我创建了一个文件/etc/acpi/thinkpad-undock.sh
(+ chmod a+x thinkpad-undock.sh
),其中包含以下行:
#!/bin/sh
xrandr --output LVDS-1 --auto --output DP-5.8 --off
并且/etc/acpi/thinkpad-dock.sh
#!/bin/sh
prime-select nvidia # ensures that nvidia card is selected
xrandr --output LVDS-1 --off --output DP-5.8 --auto
然后再次chmod a+x thinkpad-dock.sh
。
手动执行这两个脚本都可以。
然后我创建了两个文件来处理事件:
thinkpad-dock-lenovo
event=ibm/hotkey LEN0068:00 00000080 00004010
action=/etc/acpi/thinkpad-dock.sh
并且thinkpad-undock-lenovo
event=ibm/hotkey LEN0068:00 00000080 00004011
action=/etc/acpi/thinkpad-undock.sh
然后我用 重新加载了 acpi 守护进程/etc/init.d/acpid reload
。但是,如果我对接或断开笔记本电脑的对接,它不会执行任何操作。
acpi_listen
我通过执行然后对接和断开笔记本电脑来获取上面的事件号。
那么有什么想法可以让它发挥作用吗?
也许问题可以通过某些桌面环境(例如 kde)解决,但我使用的是 xmonad,尽管如此,如上所述,它甚至应该在启动阶段独立于桌面环境工作。
我正在运行 ubuntu 16.04,内核版本为 4.4.0-22。
我还尝试添加 udev 规则,如下所示,但它不起作用:
ENV{EVENT}=="undock", KERNEL=="dock.0", SUBSYSTEM=="platform", RUN+="disper -s"
ENV{EVENT}=="dock", KERNEL=="dock.0", SUBSYSTEM=="platform", RUN+="disper -s"
dock
我刚刚注意到,无论笔记本电脑是否插入坞站,该文件的值始终为 0。
答案1
您的脚本未设置 DISPLAY 环境变量。它应该看起来像这样:
#!/bin/sh
export DISPLAY=:0
xrandr --output LVDS-1 --auto --output DP-5.8 --off
答案2
我很幸运地设置了两者DISPLAY
并XAUTHORITY
添加了一个小睡眠,例如
export DISPLAY=:0
export XAUTHORITY=/home/user/.Xauthority
sleep 3
xrandr ...
答案3
我有类似的设置,但是我从未追求对码头做出反应的解决方案。这是一件有趣的事。
我所做的是使用 Gnome 的显示管理器将 LCD 显示器设置为“关闭”,并将外部显示器设置为主显示器。这样,每当我将笔记本电脑放在扩展坞上时,它就会切换到外部显示器。当我抬起它时,它又切换回液晶显示屏。
将其放在控制台上(从 dm-crypt 安装启动)也可以,但有其细微差别。如果盖子关闭,我将笔记本电脑放在扩展坞上并打开它,它会自动在外部显示器上启动(所有内容,包括 BIOS 屏幕等)。如果盖子打开,则只有登录 GDM 后才会切换。
答案4
你需要这样的东西:
udev(从 lsusb 更改 idVendor)
ACTION=="add", ATTRS{idVendor}=="05e3", ATTRS{idProduct}=="****", RUN+="/local/run.sh /local/udev-dplink-on.sh"
ACTION=="remove", ATTRS{idVendor}=="05e3", ATTRS{idProduct}=="****", RUN+="/local/run.sh /local/udev-dplink-off.sh"
apt-get 安装在
运行sh
#!/bin/bash
echo $1 | at now