Ben*_*ngt 5 xorg xrandr monitors amd
我有一个用于纵向模式编程的显示器。为了观看视频,我每天多次将其切换到横向模式。物理转换很快,但我每次都必须深入研究显示器配置以调整方向/分辨率。有没有办法在 Linux 下自动执行此操作?有问题的显示器是BenQ BL2410PT,它在随附的软件中具有自动旋转功能,我使用的是 AMD 显卡。
我可以将旋转更改为纵向模式
$ xrandr --output DVI-1 --rotation left
Run Code Online (Sandbox Code Playgroud)
并返回横向模式
$ xrandr --output DVI-1 --rotation normal
Run Code Online (Sandbox Code Playgroud)
所以问题归结为检测显示器的方向变化。
小智 1
据我所知,这是通过 DDC/CI 完成的。但我不认为 DDC 支持任何类型的显示启动事件。这意味着 PC 上的某些软件必须不断轮询屏幕以告知某些内容发生了变化。当然,这不能太快,否则会开始浪费资源。
\nBenq 有一个在线视频,展示了他们在 Windows 上的自动旋转功能,并且相当明显的延迟似乎表明他们的 Windows 驱动程序就是这种情况。
当然,在 Linux 上,复制这一点非常简单。
\n您所需要的只是一个在后台运行的脚本,其中有一个循环轮询指示旋转的 DDC 值,并休眠一段时间直到下一次轮询。如果发现值发生变化,它将运行 xrandr 来旋转显示。将其放入您选择的初始化系统中,\xe2\x80\x99 就完成了。它\xe2\x80\x99 并不漂亮,因为轮询从来都不是漂亮的。(中断是执行此类操作的正确方法。)但它确实有效。
\n作为一个优点,您可以设置轮询时间,我这样做是为了如果您需要由此触发任何其他内容,您可以将其放在正确的目录中。
#! /bin/bash\n# Some older systems might prefer using \xe2\x80\x9c/usr/bin/env bash\xe2\x80\x9d above.\n\n# Internals\ndeclare -A values\nconfigDir="$( [[ "$UID" == 0 ]] && echo "/etc/ddc-event/" || echo "$HOME/.config/dde-event" )"\ndebugMode=true\n\n# (First time, each time) initialization\nif [[ ! -e "$configDir/config" ]]; then\n $debugMode && echo "Creating configuration in \xe2\x80\x9d$configDir/config\xe2\x80\x9d."\n mkdir -p "$configDir"\n cat > "$configDir/config" <<-EOD\n delay=1 # seconds\n features=( AA ) # Set your VCPs here, separated be a space character. Find them via \xe2\x80\x9cddcutil capabilities\xe2\x80\x9d.\n debugMode=true\nEOD\nfi\n. "$configDir/config" # Loads configuration\nfor feature in ${features[@]}; do\n $debugMode && echo "Creating handler directories for features ( ${features[*]} ) in \xe2\x80\x9d$configDir/\xe2\x80\x9d."\n [[ -e "$configDir/$feature" ]] || mkdir -p "$configDir/$feature"\ndone\n\n# Handler manager\ncallHandlers() { local feature="$1"; local value="$2";\n for handler in "$configDir/$feature/"*; do\n $debugMode && echo " Calling handler \xe2\x80\x9c$handler\xe2\x80\x9d for feature "$feature" with value \xe2\x80\x9c$value\xe2\x80\x9d."\n "$handler" "$value"\n done\n}\n\n# Main script\nwhile true; do\n for feature in ${features[@]}; do\n newValue="$( ddcutil -t getvcp "$feature" | cut -d \' \' -f 4 )"\n if [[ "$newValue" != "${value[$feature]}" ]]; then\n $debugMode && echo "Feature \xe2\x80\x9c$feature\xe2\x80\x9d: Value \xe2\x80\x9c${value[$feature]}\xe2\x80\x9d -> \xe2\x80\x9c$newValue\xe2\x80\x9d."\n value[$feature]="$newValue"\n callHandlers "$feature" "$newValue"\n fi\n done\n sleep "$delay"\ndone\n
Run Code Online (Sandbox Code Playgroud)\n/usr/local/bin/ddc-event
然后将其保存在 例如 中chmod +x /usr/local/bin/ddc-event
。安装ddcutil
,这样就可以工作了。现在ddc-event
通过您选择的初始化系统运行,或者仅通过桌面的任何会话自动启动或.bashrc
(在后台使用ddc-event &
)或其他方式运行。
接下来,将以下轮换处理程序放入 或 中$HOME/.config/ddc-event/AA/pivot
,/etc/ddc-event/AA/pivot
具体取决于上述守护进程是以您的用户身份还是以 root 身份运行,以及chmod +x
它:
#! /bin/bash\n\ndisplay="DVI-0"\n\nif [[ "$1" == "x01" ]]; then\n xrandr --output "$display" --rotation normal\nelif [[ "$1" == "x02" ]]; then\n xrandr --output "$display" --rotation left\nfi\n
Run Code Online (Sandbox Code Playgroud)\n如果该目录不存在,则说明您忘记先运行第一个脚本。:)
\n$HOME/.config/ddc-event/config
之后,您可以设置要在或中查找哪些功能/etc/ddc-event/config
,同样取决于它是否以 root 身份运行。
\n我发现 1delay
秒5
(平均导致 2.5 秒延迟)完全没问题。即使 10 秒也可能没问题,因此只需要很少的资源。
\n可以通过(十六进制值。)features
找到要查找的值。应该在启动时自动创建功能目录。然后您可以将任何您喜欢的脚本放入其中。\n您还可以设置并从控制台运行它,以观察事件的进入和处理程序的执行。\n最后,如果你想停止它,只需杀死该进程即可。没什么特别的,除非你的处理者很特别。ddcutil capabilities
ddc-event
debugMode=true
它\xe2\x80\x99是经典Unix/Linux风格的通用DDC事件处理程序。
\n我希望这最终能解决问题。:)
\n 归档时间: |
|
查看次数: |
3235 次 |
最近记录: |