Existe-t-il un moyen de faire en sorte que mon macbook exécute automatiquement un script chaque fois que je le connecte à un moniteur externe ?

Aug 18 2020

Je voudrais que mon macbook se connecte automatiquement à un wifi spécifique et lance Lunar à chaque fois que je le connecte à mon moniteur externe, et vice versa lorsque je le débranche, mais je ne sais pas par où commencer...

Je pourrais écrire un script qui vérifie en permanence si un moniteur externe est connecté ou non toutes les 60 secondes, par exemple, mais j'aimerais faire quelque chose comme "axé sur les événements" qui ne vérifie ni ne fait rien du tout jusqu'à ce qu'un événement (" moniteur externe branché" ou "moniteur externe débranché") se produit.

Un indice ?

Réponses

2 Daniel Aug 23 2020 at 14:08

Personne n'a répondu et je cherche toujours une solution plus simple mais j'ai trouvé une solution de contournement en créant une petite application 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")
        }
    }
    
}

Il s'agit essentiellement d'un objet Text qui écoute didChangeScreenParametersNotification . Étant donné que l'objet Text doit être actif pour écouter les notifications, une distance de l'application doit toujours être ouverte ou minimisée (quelqu'un a-t-il une idée sur la façon d'éviter cela ?). Chaque fois qu'il reçoit une notification, il vérifie le nombre d'écrans connectés, s'il n'y a qu'un seul écran connecté, il exécute mon disconnectscript, sinon il exécute mon connectscript.

Voici à quoi ressemblent les 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

Et voici à quoi ressemble l'application

Cela m'a aidé à me connecter à un wifi par programmation