Como distinguir monitores conectados?

Como distinguir monitores conectados?

Para alterar automaticamente o layout de exibição do Xserver ao encaixar meu laptop, preciso não apenas detectar que esse evento realmente aconteceu, mas tambémqualmonitores são conectados para poder distinguir entre configurações de múltiplas estações de acoplamento, ou seja, há múltiplas estações de acoplamento com diferentes monitores conectados. Como isso é possível no Linux (preferível no código shell POSIX)?

Responder1

Se você está realmente procurando uma maneira de configurar seus monitores automaticamente ao (des) encaixar, sugiro que você dê uma olhadaautorandrantes de começar algo parecido por conta própria (ao contrário de mim;).

Para detectar se uma determinada saída de vídeo está conectada a um monitor ou não, existem boas respostasnesta questão. O mais intrigante parece ser observar /sys/class/drm/card0-*-*/statusqual leitura connectedou disconnected.

Isso não resolve o problema declarado nesta mesma pergunta, mas uma abordagem muito semelhante pode ser adotada, uma vez que existe /sys/class/drm/card0-*-*/edidcom o (em cache)EDID, também conhecido como informação DDCdos respectivos monitores. Se você tiver sorte, esses dados contêm até o número de série do monitor e, portanto, podem distinguir até mesmo entre configurações de tipos de monitores idênticos (você pode verificar em edid-decode /sys/class/drm/.../edid).

Portanto, com o propósito de distinguir conjuntos de monitores conectados, estou usando a seguinte função shell, que é fortemente baseada em uma função com funcionalidade semelhante emautorandr.

# hash_sysfs_edid() simply concatenates the md5 hashes of all connected 
# monitors and hashes them again so that the output is always 32 characters long.
hash_sysfs_edid () {
  edid_hash=""
    for DEVICE in /sys/class/drm/card*-*; do
        [ -e "${DEVICE}/status" ] && grep -q "^connected$" "${DEVICE}/status" || continue
      edid_hash="${edid_hash}"$(md5sum "${DEVICE}/edid" | awk '{print $1}')
    done
  echo $(echo "$edid_hash" | md5sum | awk '{print $1}')
}

informação relacionada