¿Hay alguna manera de hacer que mi macbook ejecute automáticamente un script cada vez que lo conecto a un monitor externo?

Aug 18 2020

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

2 Daniel Aug 23 2020 at 14:08

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 disconnectscript, de lo contrario ejecuta mi connectscript.

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.