Como eu posso tentar uma resolução específica automaticamente se eu conectar um (qualquer) monitor externo?

2

Existe alguma maneira de configurar o Ubuntu para definir a resolução do monitor "first-try" padrão sempre que um (ou dois) monitor for conectado. Independentemente de quais placas gráficas ou driver gráfico estão sendo usados.

Por exemplo, quando eu conecto o monitor HDMI que suporta 1920x1080, o ubuntu reproduz bem ao definir automaticamente a resolução da tela para FullHD. Isso é bom.

Mas o que preciso é de uma resolução simples de 1024x768, em HDMI. Para resolver isso, eu posso facilmente ir para as configurações do sistema - exibir e configurá-lo, o ubuntu também se lembra da minha configuração. Ou usando o comando xrandr.

Mas toda vez que eu mudo de monitor, eu preciso ir para as configurações do sistema (ou executar outro comando xrandr novamente).

Então, existe alguma maneira de dizer ao Ubuntu, algo como

"para cada monitor conectado, não importa se é via D-SUB ou HDMI ou qualquer outra coisa, tente verificar se ele pode suportar 1024x768 e, se isso acontecer, use essa resolução"

Estou pensando em

  1. Gere algo como monitores.xml genéricos para todos os fornecedores e modelos de monitores
  2. Execute o script xrandr personalizado toda vez que um monitor for conectado / desconectado, mas isso pode causar cintilação na tela.

Mas ainda não tenho ideia de como implementá-las.

Como informação, o sistema é configurado para usar lightdm, se isso for importante. Eu tenho lido sobre xrandr, monitores.xml, mas ainda não consigo encontrar as soluções. Agradecemos antecipadamente.

    
por Lee 24.05.2016 / 08:05

3 respostas

2

Script de segundo plano para verificar novas telas

Uma vez por 5 segundos, o script de segundo plano abaixo procura novas telas a serem conectadas.
Se isso acontecer, tente definir a resolução para o que você definir na seção head do script (consulte: Como usar).

Uma notificação mostra se a tela foi configurada com sucesso:

Se o comando para definir a resolução falhar, ele mostrará uma notificação:

O script

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

# --- set your main screen below, since you probably want to set it differently
main_screen = "DVI-I-1"
# --- set the tried resolution below
res = "200x300"
#---

screens1 = [main_screen]

def screeens():
    [l.split()[0] for l in subprocess.check_output("xrandr")\
     .decode("utf-8").splitlines() if " connected" in l]

while True:
    time.sleep(5)
    screens2 = [l.split()[0] for l in subprocess.check_output("xrandr").decode("utf-8")\
               .splitlines() if " connected" in l]
    new = [scr for scr in screens2 if not scr in screens1]
    for scr in new:
        try:
            subprocess.check_call(["xrandr", "--auto", "--output", scr, "--mode", res])
            # small break to give the screens time to adapt
            time.sleep(5)
            subprocess.Popen(["notify-send", "successfully set "+scr+" to "+res])
        except subprocess.CalledProcessError:
            subprocess.Popen(["notify-send", "failed to set resolution of "+scr+" to "+res])
    screens1 = screens2

Como usar

  1. Copie o script em um arquivo vazio, salve-o como set_screens.py
  2. Defina na seção principal do script:

    • o nome de sua tela padrão , pois você provavelmente deseja excluí-la do conjunto de resoluções automáticas.
    • a resolução que você quer experimentar em novas telas.

      # --- set your main screen below, since you probably want to set it differently
      main_screen = "DVI-I-1"
      # --- set the tried resolution below
      res = "200X300"
      #---
      
  3. Teste- execute o script pelo comando (de um terminal):

    python /path/to/set_screens.py
    

Se tudo funcionar bem, adicione-o aos aplicativos de inicialização:

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

Notas

  • O sleep 15 é essencial no comando de inicialização, especialmente se as telas secundárias estiverem possivelmente conectadas. O script será quebrado se a área de trabalho ainda não estiver totalmente carregada, se começar a ser executada.

    Se o script rodar bem no terminal, mas quebrar como um comando sartup, toque um pouco com o sleep 15 .

  • Se você não quiser excluir sua tela principal de tentar definir a resolução, altere a linha:

    screens1 = [main_screen]
    

    para:

    screens1 = []
    

Executando um script de plano de fundo

Se você não precisar executar um script de segundo plano, não o faça. Se adicionar funcionalidades importantes e / ou poupar tempo, não vejo qualquer razão para não o fazer, se :

  • Não há outra solução 100% limpa e fácil disponível com a mesma funcionalidade.

e

  • O script está bem escrito e não adiciona carga de CPU visível

Nesse caso, verificar xrandr uma vez a cada cinco segundos significa nada em seu sistema.

    
por Jacob Vlijm 24.05.2016 / 12:39
1

Eu construí alguns atalhos na área de trabalho para conseguir esse tipo de coisa no meu laptop. Eles são

$ cat LowRes.desktop

#!/usr/bin/env xdg-open

[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Icon[en_GB]=gnome-panel-launcher
Name[en_GB]=LowRes
Exec=xrandr -s 8
Comment[en_GB]=1368x768
Name=LowResDisplay
Comment=1368x768
Icon=gnome-panel-launcher

e

cat HighRes.desktop

#!/usr/bin/env xdg-open

[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Icon[en_GB]=gnome-panel-launcher
Name[en_GB]=HighRes
Exec=xrandr -s 4
Comment[en_GB]=1600x900
Name=HighResDisplay
Comment=1600x900
Icon=gnome-panel-launcher

Talvez algo semelhante possa ser útil para você.

    
por NickT 24.05.2016 / 09:46
1

Eu criei um script para um dos meus monitores e o executei ao conectar o monitor. Assim, você pode criar scripts semelhantes para os diferentes tipos de monitores e executá-los conforme a necessidade.

#!/bin/bash
sudo xrandr --addmode VGA-0 1440x900_60.00
sudo xrandr --newmode  Modeline "1440x900_60.00"  106.47  1440 1520   1672 1904  900 901 904 932  -HSync +Vsync

Crie seu Modeline para seu monitor com o seguinte

cvt 1440x900 60

pixels horizontais x atualização de pixels verticais

    
por Sushrut Kanetkar 24.05.2016 / 10:01