Como posso executar um script na mudança de tela?

1

Contexto: tenho um monitor grande, um desktop e um laptop. Eu uso o monitor grande e um interruptor HDMI quando estou em casa. Isso dá à sinergia um problema, pois não reconhece partes da tela se a tela mudar. Você precisa reiniciar o cliente de sinergia no laptop, se for esse o caso, para poder acessar a tela inteira.

Como posso reiniciar a sinergia automaticamente usando um script quando mudo as telas? Eu sei escrever o roteiro, mas não sei de onde lançá-lo, ou se existe tal lugar. Observe que estou me referindo a telas físicas e não a telas de sinergia.

    
por user447607 28.03.2015 / 20:19

1 resposta

2

Supondo que a alteração na resolução está causando o erro e o gatilho para executar o script, a verificação periódica da resolução e a execução do script, caso ele mude, deve fazer o trabalho:

#!/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

Ele verifica a resolução atual a cada cinco segundos e executa o script, conforme definido na seção principal, se houver uma alteração na resolução.

Como usar

  1. Copie o script em um arquivo vazio, salve-o como check_resolution.py
  2. Na seção head, defina o caminho para o seu script para reiniciar o synergy
  3. Teste-o executando-o em uma janela de terminal com o comando:

    python3 /path/to/check_resolution.py
    
  4. se tudo funcionar bem, adicione-o aos seus aplicativos de inicialização.

Nota

O comando como um aplicativo de inicialização provavelmente precisa de uma pequena pausa para garantir que a área de trabalho esteja totalmente carregada quando o script for iniciado. O comando para adicionar ao Startup Applications seria então:

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

Adicionar a aplicativos de inicialização: Dash > Aplicativos de inicialização > Adicione, adicione o comando.

Editar

Apenas para completar:

Se, por algum motivo, você preferir uma versão bash do script:

#!/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

O uso é praticamente o mesmo, exceto a extensão de idioma:

check_resolution.sh

e o comando para executá-lo:

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

e substitua <command_to_run> pelo comando para reiniciar synergy ou o caminho para o seu script.

    
por Jacob Vlijm 28.03.2015 / 20:48