/etc/acpi/events
我在和中有以下文件/etc/udev/rules.d
。
/etc/acpi/events/lidclose
# Pass all events to our one handler script event=button/lid action=/etc/acpi/monitors.sh
/etc/udev/rules.d/80-monitor.rules
# change monitor settings when monitor is plugged in or o$ ACTION=="change", SUBSYSTEM=="drm", HOTPLUG=="1", RUN+="/etc/acpi/monitors.sh"
现在,(可执行文件并由root拥有)
/etc/acpi/monitors.sh
#!/bin/sh # default monitor is LVDS1 STATE=internal INTERNAL=LVDS1 EXTERNAL=HDMI3 # functions to switch from LVDS1 to VGA and vice versa function internal { echo "Switching to internal" xrandr --output $EXTERNAL --off --output $INTERNAL --auto STATE=internal } function external { echo "Switching to external" xrandr --output $EXTERNAL --auto --output $INTERNAL --off STATE=external } function both { echo "Switching to both" xrandr --output $EXTERNAL --auto --right-of $INTERNAL --output $INTERNAL --auto --primary STATE=both } # functions to check if VGA is connected and in use function externalConnected { ! xrandr | grep "^$EXTERNAL" | grep disconnected >/dev/null } function lidOpen { ! cat /proc/acpi/button/lid/LID/state | grep closed >/dev/null } # actual script if ! [ $STATE == "both" ] && externalConnected && lidOpen then both fi if ! [ $STATE == "external" ] && externalConnected && ! lidOpen then external fi if ! [ $STATE == "internal" ] && ! externalConnected && lidOpen then internal fi
现在,我以 root 和我的用户身份测试了该脚本,它的工作非常顺利。我还在echo bla > /home/me/test
其中放入了一些测试输出,当调用 by 时udev
,acpid
它会生成输出,因此它会被执行。唯一的事情是,什么也没有发生xrandr
。
我缺少什么?如何记录脚本的输出以查找错误?
答案1
在对我的问题发表评论的人的帮助下,我找出了问题所在并在脚本中修复了它。
现在这里更新了如何使用笔记本电脑进行自动屏幕切换的例程。您需要 acpid、kms 和 udev。
为 acpi 和 udev 创建以下规则
/etc/acpi/events/lidclose
# Pass all events to our one handler script
event=button/lid
action=/etc/acpi/monitors.sh
/etc/udev/rules.d/80-monitor.rules
# change monitor settings when monitor is plugged in or o$
ACTION=="change", SUBSYSTEM=="drm", HOTPLUG=="1", RUN+="/etc/acpi/monitors.sh"
现在创建/etc/acpi/monitors.sh
#!/bin/sh
# specify the monitors to use
INTERNAL=LVDS1
EXTERNAL=HDMI3
USERNAME=oli
# set some variables needed to control the x server
export XAUTHORITY=/home/$USERNAME/.Xauthority
export DISPLAY=:0
# functions to switch from internal screen to external screen and vice versa or to use both screens together
function internal {
echo "Switching to internal" >> /var/log/monitors.log
xrandr --verbose --output $EXTERNAL --off --output $INTERNAL --auto >> /var/log/monitors.log 2>&1
}
function external {
echo "Switching to external" >> /var/log/monitors.log
xrandr --verbose --output $EXTERNAL --auto --output $INTERNAL --off >> /var/log/monitors.log 2>&1
}
function both {
echo "Switching to both" >> /var/log/monitors.log
xrandr --verbose --output $EXTERNAL --auto --right-of $INTERNAL --output $INTERNAL --auto --primary >> /var/log/monitors.log 2>&1
}
# functions to check if external monitor is connected and in use
function externalConnected {
! xrandr | grep "^$EXTERNAL" | grep disconnected >/dev/null
}
function lidOpen {
! cat /proc/acpi/button/lid/LID/state | grep closed >/dev/null
}
# actual script
if externalConnected && lidOpen
then
both
fi
if externalConnected && ! lidOpen
then
external
fi
if ! externalConnected && lidOpen
then
internal
fi
希望它能起作用。
答案2
贾诺利弗溶液工作得几乎很好。一个小修复终于在我的系统上解决了有关 HOTPLUG 变量的问题:
/etc/udev/rules.d/80-monitor.rules
:
# change monitor settings when monitor is plugged in or off
ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", RUN+="/etc/acpi/monitors.sh"
即,更改HOTPLUG
为ENV{HOTPLUG}
.