Tengo un único monitor Dell con un Mac Studio conectado a él mediante USB-C y un portátil que ejecuta Ubuntu conectado mediante HDMI. También tengo un KVM pero solo lo uso para dispositivos de entrada, no para vídeo porque el KVM está basado en HDMI y quiero usar MonitorControl para controlar el brillo de la pantalla y eso requiere usar DP Alt Mode sobre USB-C (creo que es una limitación del M1 que no funciona bien con DDC/CI sobre HDMI por lo que he leído). Así que quiero usar DDC/CI para cambiar la entrada de vídeo de la pantalla cuando cambio el KVM.
Respuesta
¿Demasiados anuncios?Después de trastear un poco he encontrado la solución, así que la expongo aquí por si a alguien más le sirve de ayuda:
Parece que hay varias aplicaciones de línea de comandos para el envío de comandos DDC / IC, pero el único que pude encontrar que trabajó en un mac M1 fue m1ddc .
Para activar esto en la conexión del hub usb del KVM usé launchd (el sistema de MacOS para lanzar programas basados en ciertas condiciones o eventos). Desafortunadamente si usas launchd para disparar un script de shell directamente ese script se ejecutará múltiples veces cuando se conecte el dispositivo porque launchd espera que el programa ejecutado registre que ha consumido el evento disparador. Para lidiar con esto usé esta pequeña y fantástica utilidad, xpc_set_event_stream_handler que proporciona un sencillo programa de arranque que marcará el evento como consumido y luego llamará a cualquier programa o script que desee.
xpc_set_event_stream_handler debe estar compilado (probablemente necesitarás xcode o las herramientas de línea de comandos xcode instaladas si no lo estás ya). Yo lo hice con:
cd /tmp
git clone https://github.com/snosrap/xpc_set_event_stream_handler
cd xpc_set_event_stream_handler/xpc_set_event_stream_handler
gcc -framework Foundation -o xpc_set_event_stream_handler main.m
sudo mv xpc_set_event_stream_handler /usr/local/bin/
Luego creé un script con mi comando m1ddc deseado para cambiar de pantalla y lo guardé en /usr/local/bin/kvm-switch-attached
:
#!/bin/bash
/usr/local/bin/m1ddc display 1 set input 27
Luego lo marqué como ejecutable con chmod +x /usr/local/bin/kvm-switch-attached
A continuación he creado mi plist launchd en /Library/LaunchDaemons/com.kvm-switch-attached.plist
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.KVMSwitchAttached</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/xpc_set_event_stream_handler</string>
<string>/usr/local/bin/kvm-switch-attached</string>
</array>
<key>LaunchEvents</key>
<dict>
<key>com.apple.iokit.matching</key>
<dict>
<key>com.KVMSwitchAttached.Event</key>
<dict>
<key>idVendor</key>
<integer>8523</integer>
<key>idProduct</key>
<integer>29264</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>IOMatchLaunchStream</key>
<true/>
</dict>
</dict>
</dict>
</dict>
</plist>
Obtuve los valores idVendor e idProduct de System Infomation y los convertí de su representación hexadecimal a decimal utilizando un conversor en línea.
He registrado el plist launchd con sudo launchctl load /Library/LaunchDaemons/com.kvm-switch-attached.plist
.
No pude encontrar una buena manera de desencadenar una desconexión script del hub usb del KVM. Así que en lugar de eso hice algo similar en mi portátil Ubuntu y conseguí que cambiara de entrada cuando el hub estuviera conectado. Usé Solución de u/MortimerErnest aunque como se puede ver en mi comentario Lo he simplificado un poco.