¿Hay alguna manera de hacer que mi macbook ejecute automáticamente un script cada vez que lo conecto a un monitor externo?
Me gustaría hacer que mi macbook se conecte automáticamente a un wifi específico e inicie Lunar cada vez que lo conecto a mi monitor externo, y viceversa cuando lo desenchufo, pero no sé por dónde empezar...
Podría escribir una secuencia de comandos que siga comprobando si un monitor externo está conectado o no cada, por ejemplo, 60 segundos, pero me gustaría hacer algo como "impulsado por eventos" que no verifique ni haga nada hasta que ocurra un evento (" monitor externo conectado" o "monitor externo desconectado").
¿Alguna pista?
Respuestas
Nadie respondió y todavía estoy buscando una solución más simple, pero encontré una solución creando una pequeña aplicación SwiftUI.
//
// ContentView.swift
// HomeSweetHome
//
// Created by Daniel Falbo on 20/08/2020.
// Copyright © 2020 Daniel Falbo. All rights reserved.
//
import SwiftUI
struct ContentView: View {
func execute(script: String) {
let task = Process()
task.launchPath = "/usr/bin/env"
task.arguments = ["/Applications/HomeSweetHome.app/Contents/bin/\(script)"]
task.launch()
}
var body: some View {
Text("")
.frame(maxWidth: .infinity, maxHeight: .infinity)
.onReceive(NotificationCenter.default.publisher(for: NSApplication.didChangeScreenParametersNotification)) { _ in
self.execute(script: NSScreen.screens.count > 1 ? "connect" : "disconnect")
}
}
}
Básicamente es solo un objeto de texto que escucha didChangeScreenParametersNotification . Dado que el objeto de texto debe estar vivo para escuchar las notificaciones, siempre se debe abrir o minimizar una instancia de la aplicación (¿alguien tiene alguna idea de cómo evitar esto?). Cada vez que recibe una notificación, verifica la cantidad de pantallas conectadas, si solo hay una pantalla conectada, ejecuta mi disconnect
script, de lo contrario ejecuta mi connect
script.
Así es como se ven los scripts:
#!/usr/bin/env sh
#
# connect
#
open -a Lunar
networksetup -setairportnetwork en0 $SSID $PASSWORD
#!/usr/bin/env sh
#
# disconnect
#
killall Lunar
networksetup -setairportnetwork en0 $SSID $PASSWORD
Y así es como se ve la aplicación

Esto me ayudó a conectarme a un wifi mediante programación.