Existe algum evento acionado quando conecto ou retiro um monitor externo na DisplayPort do meu laptop? ACPID e UDEV não reagem de maneira alguma.
Estou usando gráficos integrados em um chip intel. Aqui está uma discussão semelhante, que já tem alguns anos.
Não quero usar o polling, mas preciso ter algumas configurações que definam as configurações do monitor automaticamente, dependendo de o monitor estar conectado.
udev
monitors
acpi
multi-monitor
janoliver
fonte
fonte
Respostas:
NOTA: Isso foi testado em um laptop com uma placa gráfica i915.
fundo
NOTA: Quando uma nova tela é conectada, nenhum evento é enviado ao host, isso permanece verdadeiro mesmo após a minha última edição. Portanto, a única maneira é usar a pesquisa. Tentando torná-los o mais eficiente possível ...
EDIT # 3
Finalmente, há uma solução melhor (por meio da ACPI):
Ainda não há evento, mas a ACPI parece mais eficiente do
xrandr
que perguntar. (Nota: isso requer módulos do kernel ACPI carregados, mas não requer privilégios de root).Minha solução final (usando o bash):
Agora um teste:
Está conectado, então agora eu desconecto:
NOTA:
${1:+*-1+1}
permitir um boolean argumento: Se algo está presente , a resposta seria invertido:( crtState >> 4 ) * -1 + 1
.e o script final:
Avisos: mais leve que
xrandr
, mas não sem importância, com um atraso menor que 0,02 segundos, o script Bash irá para o topo do processo de obtenção de recursos (top
)!Enquanto isso custa ~ 0,001 seg:
Isso requer ~ 0,030 seg:
Isso é grande! Portanto, dependendo do que você precisa,
delay
pode ser razoavelmente definido entre0.5
e2
.EDIT # 2
Finalmente encontrei algo usando este:
Isenção de responsabilidade importante: Brincar com
/proc
e/sys
entradas pode danificar seu sistema !!! Portanto, não tente o seguinte em sistemas de produção.... após alguma limpeza de entradas indesejadas:
Eu pude ler isto:
Quando conecto, desconecto e conecto o cabo do monitor.
Resposta originalQuando a configuração é consultada (em execução
system/preferences/monitor
ouxrandr
), as placas gráficas fazem um tipo de verificação ; portanto, a execuçãoxrandr -q
fornece as informações, mas você precisa pesquisar o status.Examinei todos os logs (kernel, daemon, X e assim por diante) pesquisando
/proc
&/sys
, e claramente parece que não existe nada que satisfaça sua solicitação.Eu tentei isso também:
Depois de tudo isso, se você executar
System/Preferences/Monitor
enquanto nenhuma nova tela foi conectada ou desconectada, a ferramenta aparecerá simplesmente (normalmente). Mas se você conectou ou desconectou uma tela antes, às vezes você executa esta ferramenta e vê sua área de trabalho fazendo um tipo de redefinição ou atualização (o mesmo se você executarxrandr
).Isso parece confirmar que essa ferramenta solicita
xrandr
(ou funciona da mesma maneira) pesquisando o status periodicamente, começando no momento em que é executada.Você pode tentar:
Isso exibirá quantas telas (monitores) estão conectadas por 10 segundos.
Enquanto isso estiver funcionando, conecte e / ou desconecte sua tela / monitor e veja o que está acontecendo. Então você pode criar uma pequena função de teste do Bash:
que seria utilizável como em:
Mas tenha cuidado,
xrandr
leva de 0,140 a 0,200 s enquanto nenhuma alteração ocorre nos plugues e até 0,700 segundos sempre que algo foi conectado ou desconectado pouco antes ( NOTA: parece não ser um consumidor de recursos).EDIT # 1
Para garantir que não estou ensinando algo incorreto, pesquisei na Web e nos documentos, mas não encontrei nada sobre DBus e telas .
Finalmente, corri em duas janelas diferentes
dbus-monitor --system
(também brinquei com opções) e o pequeno script que escrevi:... e novamente conectado, depois de desconectado o monitor, muitas vezes. Então agora eu poderia dizer:
xrandr -q
para saber se um monitor está conectado ou não.Mas tenha cuidado, porque não parece haver outras maneiras. Por exemplo,
xrandr
parece compartilhar essas informações, então minha área de trabalho do GNOME mudaria paraxinerama
automaticamente ... quando eu corriaxrandr
.Alguns documentos
fonte
As seguintes linhas apareceram em
udevadm monitor
ao conectar um monitor ao conector VGA. Portanto, pode haver uma maneira de descobrir isso.
fonte
Para quem, por qualquer motivo, não quiser seguir a rota de hotplug, ainda é possível não pesquisar em um script usando o inotifywait:
É melhor invocado a partir do seu .xsessionrc, sem esquecer o final &. A pesquisa com o xrandr causou sérios problemas de usabilidade no meu novo laptop (o mouse parava periodicamente).
fonte
/proc
e apenas fazendoinotifywait -q -e close /sys/class/drm/card0-DP-2/status
de fato não terminou após desconectar DP-2 no meu sistemaEu continuei usando srandrd . Ele monitora X eventos e aciona seu script quando um monitor é conectado ou desconectado.
fonte
Obviamente deve haver algo! :) / sys filesystem informa ao espaço de usuário que hardware está disponível, para que ferramentas do espaço de usuário (como udev ou mdev) possam preencher dinamicamente um diretório "/ dev" com nós de dispositivo que representam o hardware atualmente disponível. O Linux fornece duas interfaces de hotplug: / sbin / hotplug e netlink.
Há uma pequena demonstração C no arquivo a seguir. http://www.kernel.org/doc/pending/hotplug.txt
fonte
Atualmente, o software de sistema / aplicativo no Linux atualmente utiliza algumas técnicas de ipc para comunicação entre si. O D-Bus agora é usado principalmente com aplicativos GNOME e pode ajudar.
Diário do Linux:
wiki:
Existe até uma biblioteca Python para isso, e o ubuntu recentemente usou essa habilidade chamada " zeitgeist ".
fonte
Graficamente, você pode ver se o monitor é reconhecido
Monitor
, eu sei que você pode encontrar isso no Ubuntu, Fedora e outros neste (ou em um local semelhante).E você pode ligar / desligar qualquer monitor que desejar ou usar ao mesmo tempo com imagem duplicada no monitor ou em monitores independentes
fonte