如何在屏幕变化时执行脚本?

如何在屏幕变化时执行脚本?

背景:我有一台大显示器、一台台式机和一台笔记本电脑。我在家时使用大显示器和 HDMI 开关。这给 synergy 带来了一个问题,即如果屏幕发生变化,它无法识别屏幕的某些部分。如果是这种情况,您必须在笔记本电脑上重新启动 synergy 客户端才能访问整个屏幕。

每次我更换屏幕时,如何使用脚本自动重新启动 synergy?我知道如何编写脚本,但我不知道从哪里启动它,或者是否有这样的地方。请注意,我指的是物理屏幕,而不是 synergy 屏幕。

答案1

假设分辨率的变化既导致了错误,又触发了脚本的运行,则定期检查分辨率并在发生变化时运行脚本应该可以完成这项工作:

#!/usr/bin/env python3
import subprocess
import time

command = "</path/to/script_to_run>"

def get_res():
    # get resolution
    xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
    pos = xr.index("current")
    return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]

res1 = get_res()
while True:
    time.sleep(5)
    res2 = get_res()
    if res2 != res1:
        subprocess.Popen(["/bin/bash", "-c", command])
    res1 = res2

它每五秒检查一次当前分辨率,如果分辨率发生变化,则运行头部部分设置的脚本。

如何使用

  1. 将脚本复制到一个空文件中,另存为check_resolution.py

  2. 在 head 部分,设置要重新启动的脚本的路径synergy

  3. 在终端窗口中使用以下命令运行它进行测试运行:

     python3 /path/to/check_resolution.py
    
  4. 如果一切正常,请将其添加到您的启动应用程序中。

笔记

作为启动应用程序的命令可能需要稍作休息,以确保脚本启动时桌面已完全加载。然后要添加到启动应用程序的命令将是:

/bin/bash -c "sleep 15&&python3 /path/to/check_resolution.py

添加到启动应用程序:Dash > 启动应用程序 > 添加,添加命令。


编辑

为了完整起见:

如果由于某种原因,您更喜欢该脚本的 bash 版本:

#!/bin/bash

function get_res {
    echo $(xrandr -q | awk -F'current' -F',' 'NR==1 {gsub("( |current)","");print $2}')
}

res1=$(get_res)

while true; do
  sleep 5
  res2=$(get_res)
  if [ "$res1" != "$res2" ]; then
      <command_to_run>
  fi
  res1=$res2
done

除语言扩展外,用法几乎相同:

check_resolution.sh

以及运行它的命令:

/bin/bash /path/to/check_resolution.sh

<command_to_run>并用重新启动的命令synergy或脚本的路径替换。

相关内容