当我将外接显示器连接到笔记本电脑时,我尝试运行位于的脚本usr/local/bin/
。我尝试添加新udev
规则,但没有成功。我在中创建了一个/etc/udev/rules.d
名为的新文件vga-monitor-connect.rules
。文件内容为
SUBSYSTEM=="drm", ACTION=="change", RUN+="/usr/local/bin/panel-fix"
我接了这个答案
在网上搜索后,我也尝试了以下规则
KERNEL=="card0", SUBSYSTEM=="drm", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/rumesh/.Xauthority", RUN+="/usr/local/bin/panel-fix"
但这也不起作用。
我已经手动运行了该脚本,并且可以确认它有效,所以这不是我的脚本的问题。
我还想澄清一下,我对此了解不多,udev
所以我使用的规则可能是错误的。如果有人知道适合我问题的规则,请留下答案。
我的显卡是英特尔 GM965 集成芯片组
答案1
在屏幕连接或断开连接时运行命令的另一种方法
另一种解决方案是运行一个小型后台脚本。在后台运行下面的脚本,我无法测量处理器负载的任何增加。
无论何时连接或断开第二个屏幕,这都是运行脚本或任何其他命令的简单便捷方法。
示例脚本
- 每五秒检查一次命令输出中字符串“connected”出现的次数
xrandr
(注意“connected”后面的空格,以防止与“disconnected”错误匹配)。每次出现都代表一个已连接的屏幕。 - 如果发生次数发生变化,则表示屏幕已连接或已断开连接。脚本会“注意到”此变化,并且可以将其连接到命令,您可以在脚本的头部部分进行设置。
剧本
#!/usr/bin/env python3
import subprocess
import time
#--- set both commands (connect / disconnect) below
connect_command = "gedit"
disconnect_command = ""
#---
def get(cmd): return subprocess.check_output(cmd).decode("utf-8")
# - to count the occurrenc of " connected "
def count_screens(xr): return xr.count(" connected ")
# - to run the connect / disconnect command(s)
def run_command(cmd): subprocess.Popen(["/bin/bash", "-c", cmd])
# first count
xr1 = None
while True:
time.sleep(5)
# second count
xr2 = count_screens(get(["xrandr"]))
# check if there is a change in the screen state
if xr2 != xr1:
print("change")
if xr2 == 2:
# command to run if connected (two screens)
run_command(connect_command)
elif xr2 == 1:
# command to run if disconnected (one screen)
# uncomment run_command(disconnect_command) to enable, then also comment out pass
pass
# run_command(disconnect_command)
# set the second count as initial state for the next loop
xr1 = xr2
如何使用
- 将脚本复制到一个空文件中,另存为
connect_screen.py
在 head 部分,设置连接时运行的命令(我以“gedit”为例,请注意引号)。同样,也可以在断开连接时设置命令。否则保持
disconnect_command = ""
原样。如果如果您确实使用了 disconnect- 命令,也请取消注释该行:
run_command(disconnect_command)
并注释掉以下行:
pass
如脚本所示
- 从终端测试运行脚本,连接屏幕并查看一切是否正常。
如果一切正常,请将其添加到您的启动应用程序中:Dash>启动应用程序>添加命令:
/bin/bash -c "sleep 15&&python3 /path/to/connect_screen.py"
这
sleep 15
是为了让桌面在脚本开始运行之前完全启动。只是为了确保万无一失。
编辑
如何以“智能”方式在启动时运行脚本。
的中断sleep 15
通常应该可以工作,但由于每个系统的启动时间不同,可能需要进行一些实验才能找到正确的中断时间。只需添加一点,脚本就会变得“智能”,并等待命令xrandr
成功后再启动实际脚本。如果您使用以下版本,则只需添加命令:
python3 /path/to/connect_screen.py
添加到您的启动应用程序。进一步的使用方法与上面的版本完全相同。
剧本
#!/usr/bin/env python3
import subprocess
import time
#--- set both commands (connect / disconnect) below
connect_command = "gedit"
disconnect_command = ""
#---
while True:
time.sleep(5)
try:
subprocess.Popen(["xrandr"])
except:
pass
else:
break
# function to get the output of xrandr
def get(cmd): return subprocess.check_output(cmd).decode("utf-8")
# - to count the occurrenc of " connected "
def count_screens(xr): return xr.count(" connected ")
# - to run the connect / disconnect command(s)
def run_command(cmd): subprocess.Popen(["/bin/bash", "-c", cmd])
# first count
xr1 = None
while True:
time.sleep(5)
# second count
xr2 = count_screens(get(["xrandr"]))
# check if there is a change in the screen state
if xr2 != xr1:
if xr2 == 2:
# command to run if connected (two screens)
run_command(connect_command)
elif xr2 == 1:
# command to run if disconnected (one screen)
# uncomment run_command(disconnect_command) to enable, then also comment out pass
pass
# run_command(disconnect_command)
# set the second count as initial state for the next loop
xr1 = xr2
答案2
这也可以通过以下 bash 脚本实现。
#!/usr/bin/env bash
xrandr=$(xrandr)
con_monitors=$(echo $xrandr | grep -c " connected ")
if [[ $con_monitors -gt 1 ]]; then
# All the layouts are saved in "screenlayout" folder.
# eg cmd. xrandr --output HDMI-1 --mode 2560x1440 --pos 0x0 --rotate normal --output DP-1 --off --output eDP-1 --primary --mode 1920x1080 --pos 283x1440 --rotate normal --output DP-2 --off
for layout in ~/.screenlayout/*.sh; do
./layout
done
fi