如何根据显示器的枢轴位置自动更改方向?

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 驱动程序就是这种情况。

\n

当然,在 Linux 上,复制这一点非常简单。
\n您所需要的只是一个在后台运行的脚本,其中有一个循环轮询指示旋转的 DDC 值,并休眠一段时间直到下一次轮询。如果发现值发生变化,它将运行 xrandr 来旋转显示。将其放入您选择的初始化系统中,\xe2\x80\x99 就完成了。它\xe2\x80\x99 并不漂亮,因为轮询从来都不是漂亮的。(中断是执行此类操作的正确方法。)但它确实有效。
\n作为一个优点,您可以设置轮询时间,我这样做是为了如果您需要由此触发任何其他内容,您可以将其放在正确的目录中。

\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 &)或其他方式运行。

\n

接下来,将以下轮换处理程序放入 或 中$HOME/.config/ddc-event/AA/pivot/etc/ddc-event/AA/pivot具体取决于上述守护进程是以您的用户身份还是以 root 身份运行,以及chmod +x它:

\n
#! /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我发现 1delay5(平均导致 2.5 秒延迟)完全没问题。即使 10 秒也可能没问题,因此只需要很少的资源。
\n可以通过(十六进制值。)features找到要查找的值。应该在启动时自动创建功能目录。然后您可以将任何您喜欢的脚本放入其中。\n您还可以设置并从控制台运行它,以观察事件的进入和处理程序的执行。\n最后,如果你想停止它,只需杀死该进程即可。没什么特别的,除非你的处理者很特别。ddcutil capabilitiesddc-event
debugMode=true

\n

它\xe2\x80\x99是经典Unix/Linux风格的通用DDC事件处理程序。

\n

我希望这最终能解决问题。:)

\n