Uma ferramenta para aplicar automaticamente a configuração RandR quando o monitor externo está conectado

49

existe uma ferramenta que permite:

  • lembre-se da configuração RandR atual (posição, orientação, resolução, etc.) por monitor,
  • aplicar automaticamente a última configuração válida assim que a exibição estiver conectada, sem necessidade de se preocupar com applets ou xrandr (1)?

As configurações teriam que ser aplicadas por usuário e por exibição.

Se não existe essa ferramenta na natureza, eu gostaria de juntar uma, mas até onde eu posso ver, não há como dizer que um monitor foi conectado. xrandr -q de vez em quando para descobrir que uma saída foi conectada ou desconectada, ou existe uma maneira mais eficiente de fazer isso? O udev pode ser ajustado para fazer exatamente isso?

    
por Yaroslav Fedevych 02.12.2010 / 15:12

11 respostas

15

Estou usando este script simples (caseiro) que mantém o polling de RandR e alterna entre LVDS1 e VGA1 quando o VGA é conectado / desconectado.

É uma solução suja, mas está funcionando bem.

Ele é personalizado para minha configuração: você provavelmente precisará alterar os nomes de saída RandR ( LVDS1 e VGA1 ) e ao contrário de mim você provavelmente ficará bem com o seu modo padrão RandR para VGA.

#!/bin/bash

# setting up new mode for my VGA
xrandr --newmode "1920x1080" 148.5 1920 2008 2052 2200 1080 1089 1095 1125 +hsync +vsync
xrandr --addmode VGA1 1920x1080

# default monitor is LVDS1
MONITOR=LVDS1

# functions to switch from LVDS1 to VGA and vice versa
function ActivateVGA {
    echo "Switching to VGA1"
    xrandr --output VGA1 --mode 1920x1080 --dpi 160 --output LVDS1 --off
    MONITOR=VGA1
}
function DeactivateVGA {
    echo "Switching to LVDS1"
    xrandr --output VGA1 --off --output LVDS1 --auto
    MONITOR=LVDS1
}

# functions to check if VGA is connected and in use
function VGAActive {
    [ $MONITOR = "VGA1" ]
}
function VGAConnected {
    ! xrandr | grep "^VGA1" | grep disconnected
}

# actual script
while true
do
    if ! VGAActive && VGAConnected
    then
        ActivateVGA
    fi

    if VGAActive && ! VGAConnected
    then
        DeactivateVGA
    fi

    sleep 1s
done
    
por 23.04.2011 / 22:08
21

Respondendo à "[maneira] de informar que um monitor foi conectado" parte da pergunta:

O suporte ainda varia um pouco, mas com kernels recentes há algum suporte para gerar eventos do udev quando um hotplug de exibição ocorre. Com o kernel 2.6.38 e o hardware ATI X1400, recebo um evento na primeira vez que conecto um monitor VGA, mas nenhum evento em desconexões ou reconexões subseqüentes do monitor. O hardware da Intel pode ter um suporte melhor. O driver proprietário da NVIDIA atualmente não suporta KMS; Eu não tentei procurar eventos hotplug no hardware da NVIDIA, mas tenho dúvidas de que funcionaria.

Se você quiser experimentar o udev, tente as seguintes etapas:

  • atualize para o kernel mais recente
  • verifique se a configuração do modo kernel (KMS) está ativada. Se ativado, ele deve ser relatado na saída do kernel. O meu diz [drm] radeon kernel modesetting enabled e [drm] initializing kernel modesetting
  • execute udevadm monitor --property e veja se os eventos são relatados quando você (dis) se conectar exibe

Se você estiver obtendo eventos do udev no hotplug de exibição, poderá acionar um script com uma regra do udev como:

ACTION=="change", SUBSYSTEM=="drm", HOTPLUG=="1", RUN+="/path/to/hotplug.sh"

Nota: Isso não funcionará se você usar uma GPU nVIDIA com o driver binário proprietário, já que ela não usa o KMS. Você não obterá eventos do udev.

    
por 27.05.2011 / 18:21
18

Em relação a uma ferramenta que pode armazenar perfis de configuração de monitor por usuário e por display, o autorar faz exatamente isso. link .

Meu laptop tem uma placa NVIDIA, então eu uso o backend disper em vez do xrandr: link . O Autorandr usará o disper como o backend para gerenciar seus monitores se você chamá-lo como autodisper . Para o resto deste post, eu vou me referir a ele como autorandr para consistência.

Você pode salvar perfis com autorandr --save profile_name . Executar autorandr por si só fornecerá uma lista de perfis e identificará qual deles é detectado como a configuração atual.

Por exemplo:

$ autorandr
laptop
syncmaster19 (detected)

Você pode dizer para carregar automaticamente o perfil apropriado para a configuração atual com autorandr --change . Este comando, emparelhado com uma regra do udev para executá-lo quando é hotplugged, faria o que você pediu.

Como precaução adicional, acrescentei --default laptop a esse comando, o que tornará padrão a exibição do laptop se não houver um perfil salvo que corresponda à configuração atual. Então, o comando completo que uso para alternar exibições é:

autorandr --change --default laptop

Infelizmente, minha máquina não fornece nenhuma saída do udev quando eu conecto meu monitor ao hotplug. Estou usando os drivers proprietários da NVIDIA, o que não é surpreendente. Então, eu o vinculei à tecla XF68Display (Fn-F8) por enquanto, o que é quase tão bom.

    
por 12.10.2011 / 07:18
7

Eu usei a regra do udev sugerida acima junto com um script de shell que parece

#!/bin/sh

dmode="$(cat /sys/class/drm/card0-VGA-1/status)"
export DISPLAY=:0
export XAUTHORITY=/home/yourusername/.Xauthority

if [ "${dmode}" = disconnected ]; then
     /usr/bin/xrandr --auto
elif [ "${dmode}" = connected ];then
     /usr/bin/xrandr --output VGA1 --auto --right-of LVDS1
else /usr/bin/xrandr --auto
fi

A parte Xauthority é essencial, assim como a exportação DISPLAY , você pode usar o echo $DISPLAY para ver a qual número é igual. Use xrandr -q para ver os monitores externos que você possui. A última afirmação é apenas para ter certeza de que você nunca ficará preso sem uma exibição.

    
por 17.10.2012 / 08:09
6

Um pequeno programa que aguarda o servidor X notificá-lo sobre a configuração do monitor alterado e, em seguida, executa um determinado comando (por exemplo, o autorandr mencionado em outra resposta) está disponível em: link

Esta parece ser uma solução mais limpa que usa udev (onde você precisa se preocupar em encontrar o servidor X correto, etc.)

    
por 20.07.2014 / 21:52
3

Se você precisar detectar automaticamente a exibição quando ela estiver conectada, parece que a solução mais limpa é adicionar uma regra UDEV para executar um script que contenha seus comandos xrandr. Aqui está um exemplo da solução de um usuário 1 :

Monitore eventos UDEV (saída) com udevadm
Essa etapa será mais importante para cada usuário. Execute udevadm monitor --environment --udev . Em seguida, conecte o cabo HDMI.

regra UDEV
Com base na saída do comando acima, o usuário criou essa regra UDEV em /etc/udev/rules.d/95-monitor-hotplug.rules .

KERNEL=="card0", SUBSYSTEM=="drm", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/dan/.Xauthority", RUN+="/usr/local/bin/hotplug_monitor.sh"

Observe que as variáveis de ambiente usadas para xrandr serão executadas sob o perfil do usuário.

script xrandr hotplug_monitor.sh

Você pode querer ajustar as opções do xrandr para atender às suas necessidades.

#! /usr/bin/bash

export DISPLAY=:0
export XAUTHORITY=/home/dan/.Xauthority

function connect(){
    xrandr --output HDMI1 --right-of LVDS1 --preferred --primary --output LVDS1 --preferred 
}

function disconnect(){
      xrandr --output HDMI1 --off
}

xrandr | grep "HDMI1 connected" &> /dev/null && connect || disconnect
    
por 07.12.2014 / 07:20
3

Para aqueles que, por alguma razão, não querem usar a rota do hotplug, ainda é possível não pesquisar em um script usando inotifywait:

#!/bin/bash

SCREEN_LEFT=DP2
SCREEN_RIGHT=eDP1
START_DELAY=5

renice +19 $$ >/dev/null

sleep $START_DELAY

OLD_DUAL="dummy"

while [ 1 ]; do
    DUAL=$(cat /sys/class/drm/card0-DP-2/status)

    if [ "$OLD_DUAL" != "$DUAL" ]; then
        if [ "$DUAL" == "connected" ]; then
            echo 'Dual monitor setup'
            xrandr --output $SCREEN_LEFT --auto --rotate normal --pos 0x0 --output $SCREEN_RIGHT --auto --rotate normal --below $SCREEN_LEFT
        else
            echo 'Single monitor setup'
            xrandr --auto
        fi

        OLD_DUAL="$DUAL"
    fi

    inotifywait -q -e close /sys/class/drm/card0-DP-2/status >/dev/null
done

O polling com xrandr forneceu sérios problemas de usabilidade em meu novo laptop (o mouse travaria periodicamente).

    
por 16.06.2015 / 13:56
1

Ao usar a solução do peoro, obtive uma saída extra do xrandr, então usei a opção -c para o grep, que conta o número de correspondências. Eu o adaptei para HDMI e adicionei também o áudio:

#!/bin/bash
# adapted from http://unix.stackexchange.com/questions/4489/

# default monitor is LVDS1
MONITOR=LVDS1

# functions to switch from LVDS1 to HDMI1
function ActivateHDMI {
    xrandr --output HDMI1 --mode 1920x1080 --dpi 160 --output LVDS1 --off
    pactl set-card-profile 0 output:hdmi-stereo-extra1
    MONITOR=HDMI1
}
function DeactivateHDMI {
    xrandr --output HDMI1 --off --output LVDS1 --auto
    pactl set-card-profile 0 output:analog-stereo
    MONITOR=LVDS1
}

# functions to check if HDMI is connected and in use
function HDMIActive {
    [ $MONITOR = "HDMI1" ]
}
function HDMIConnected {
    [[ 'xrandr | grep "^HDMI1" | grep -c disconnected' -eq 0 ]]
}

# actual script
while true
do
    if ! HDMIActive && HDMIConnected
    then
        ActivateHDMI
    fi

    if HDMIActive && ! HDMIConnected
    then
        DeactivateHDMI
    fi

    sleep 1s
done
    
por 15.11.2014 / 18:27
1

Eu acho que as pessoas que olham para esta pergunta não são aquelas que querem usar o GNOME, e aquelas que usam o GNOME não teriam que olhar para essa questão, mas no interesse da completude:

O GNOME tem essa funcionalidade embutida. Se você alterar a configuração via gnome-control-center, o daemon gnome-settings-lem-se (em .config/monitors.xml ) e aplicará automaticamente quando um monitor estiver conectado ou desconectado.

Infelizmente, a configuração no arquivo monitores.xml não está bem documentada. Veja a pergunta aqui . A ferramenta de exibição do gnome também não tem meios de configurar o pan, escalonar por monitor e não faz zoom out. Como muitas pessoas estão usando uma tela de laptop HiDPI junto com uma tela DPI comum, as ferramentas não são suficientes para obter uma solução viável.

Eu vi este mencionado como um item de roadmap para Wayland , então quando ele finalmente chegar, poderemos ver uma correção para as questões mencionadas. Até então, no Gnome, apenas executei um script de inicialização após um atraso para configurar o xrandr manualmente.

    
por 20.07.2014 / 21:40
1

Para simplificar no Xfce, por exemplo, instale o "arandr", que deve estar disponível em seus pacotes de distro. Configure seu display usando "arandr" e salve-o como "displayLayout" por exemplo. Arandr deve adicionar para você a extensão ".sh" para que possa ser usado diretamente em "function connect ()" como escrito no script "hotplug_monitor.sh" mencionado por iyrin acima, por exemplo:

function connect(){
 /path/to/displayLayout.sh
}

Para usar o mecanismo de desconexão, adicione no topo do script logo abaixo "#! / bin / bash" da seguinte forma:

#!/bin/bash
#
PLUGGED_EXTERNAL='xrandr | awk /"connected [0-9]"/'{print $1}''

xrandr detectará a exibição e transmitirá a saída para awk, que a filtrará com base na expressão regular "connected" seguida por um dígito que, em essência, é o que queremos. Na minha opinião, não é necessário combinar a resolução exata na expressão regular porque a exibição principal é relatada como "primária conectada" seguida de número, ou seja, resolução. Então awk "print $ 1" irá imprimir apenas a primeira coluna que é o nome do monitor externo neste caso e isso será armazenado na variável PLUGGED_EXTERNAL. Em seguida, em vez do nome de exibição fixo "HDMI1" no script $ PLUGGED_EXTERNAL, pode ser usado assim:

function disconnect(){
  xrandr --output $PLUGGED_EXTERNAL --off
}

xrandr | grep "$PLUGGED_EXTERNAL connected" &> /dev/null && connect || disconnect
    
por 19.07.2016 / 12:55
0

Editando minha resposta para simplificar a configuração.

Instale o autorandr para automatizar o layout da tela no xrandr, pegue o .deb mais recente do link e execute:

dpkg -i [file]

Configuração automática com layouts de tela armazenados

autorandr --save [docked|mobile|home|etc]

Como exemplo, no meu laptop sem nenhum monitor conectado, configurei-o da maneira que quero e executei:

autorandr --save mobile

Em seguida, conectei meu hdmi e arandr reconfigurado, então corri:

autorandr --save docked

Depois de configurar cada um dos seus layouts, você pode executar (substituir 'mobile' por um nome favorecido anterior, usei mobile):

autorandr --default mobile

Agora que o autorandr é todo configurado, você pode automatizar o processo instalando um pacote que pesquisará monitores conectados e executará autorandr --change após a detecção. Sim, eu sei sobre o udev e você pode configurá-lo se funcionar para você, mas no meu teste o udev não funcionou para o meu HDMI consistentemente. Só funcionou 1 em cada 20 plugs / unplugs ou, por vezes, apenas parou completamente.

Faça o download do último .deb daqui: link e instale com

dpkg -i [file]

É mais provável que você execute mais tarefas após a conclusão de autorandr --change , autorarr permite que esses comandos sejam inseridos em um arquivo chamado ~ / .autorandr / postswitch. Faça o seguinte:

cd ~/.autorandr/ && touch postswitch && chmod +x postswitch

Agora edite o arquivo de pós-mudança para ter algo semelhante ao seguinte:

#!/bin/bash
if pidof conky > /dev/null 2>&1; then
  killall conky
fi
(sleep 2s && xrandr-adjust-brightness restore -q) &
(sleep 2s && nitrogen --restore) &
(sleep 3s && conky -q) &

Além disso, você provavelmente vai querer adicionar autorandr e poll-xrandr às suas startups, algo como os dois comandos a seguir:

autorandr --change &
poll-xrandr &

Desconecte ou conecte um monitor e assista a magia!

    
por 13.03.2015 / 20:08