C'è un modo per fare in modo che il mio macbook esegua automaticamente uno script ogni volta che lo collego a un monitor esterno?

Aug 18 2020

Vorrei che il mio macbook si connettesse automaticamente a un wifi specifico e avviasse Lunar ogni volta che lo collego al mio monitor esterno, e viceversa quando lo scollego, ma non so da dove cominciare...

Potrei scrivere uno script che continui a controllare se un monitor esterno è connesso o meno ogni, ad esempio, 60 secondi, ma mi piacerebbe fare qualcosa come "event driven" che non controlla né fa nulla fino a quando non si verifica un evento (" monitor esterno collegato" o "monitor esterno scollegato").

Qualche indizio?

Risposte

2 Daniel Aug 23 2020 at 14:08

Nessuno ha risposto e sto ancora cercando una soluzione più semplice, ma ho trovato una soluzione alternativa creando una piccola app 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")
        }
    }
    
}

Fondamentalmente è solo un oggetto Text che ascolta didChangeScreenParametersNotification . Poiché l'oggetto Text deve essere attivo per ascoltare le notifiche, un'istanza dell'app deve sempre essere aperta o ridotta a icona (qualcuno ha idea di come evitarlo?). Ogni volta che riceve una notifica, controlla il numero di display collegati, se c'è un solo display collegato, esegue il mio disconnectscript, altrimenti esegue il mio connectscript.

Ecco come appaiono gli script:

#!/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

E questo è l'aspetto dell'app

Questo mi ha aiutato a connettermi a un wifi in modo programmatico