Come impedire all'agente di lancio di lanciare ripetutamente un determinato AppleScript


3

Sto cercando di creare un agente di lancio, che avvia un AppleScript ogni volta che viene collegato un mouse. Simile a queste due domande:

Tuttavia, una volta caricato il mio launch agent (tramite launchctl load ), continua a partire ogni 5 o così secondi. Come faccio a garantire che l'agente venga eseguito una volta sola, quando il mouse è connesso?

Ecco il mio agente (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>KeepAlive</key>
    <false/>
    <key>Label</key>
    <string>com.automations.switchscrolldirection</string>
    <key>ProgramArguments</key>
    <array>
        <string>osascript</string>
        <string>/Users/lirik/Documents/Automation/SwitchScrollDirectionOnMouseEvent.scpt</string>
    </array>
    <key>LaunchEvents</key>
    <dict>
        <key>com.apple.iokit.matching</key>
        <dict>
            <key>com.apple.device-attach</key>
            <dict>
                <key>idProduct</key>
                <integer>49277</integer>
                <key>idVendor</key>
                <integer>1133</integer>
                <key>IOProviderClass</key>
                <string>IOUSBDevice</string>
                <key>IOMatchStream</key>
                <true/>
                <key>IOMatchLaunchStream</key>
                <true/>
            </dict>
        </dict>
    </dict>
</dict>
</plist>

AppleScript in questione:

on gamingMouseIsAttached()
    tell application "System Preferences"
        activate
        set current pane to pane "com.apple.preference.mouse"
    end tell
    tell application "System Events" to tell process "System Preferences"
        repeat until exists checkbox 1 of window "Mouse"
        end repeat
        tell checkbox 1 of window "Mouse" to if value is 1 then click
    end tell
    tell application "System Preferences" to quit
end gamingMouseIsAttached

on TrackpadIsAttached()
    tell application "System Preferences"
        activate
        set current pane to pane "com.apple.preference.trackpad"
    end tell
    tell application "System Events" to tell application process "System Preferences"
        repeat until exists checkbox 1 of tab group 1 of window "Trackpad"
        end repeat
        tell checkbox 1 of tab group 1 of window 1 to if value is 0 then click
    end tell
    tell application "System Preferences" to quit
end TrackpadIsAttached

tell current application
    delay 15
    set internalTrackpad to (do shell script "system_profiler SPUSBDataType | awk '/Trackpad:/ { print \"Internal Trackpad\" }'")
    set gamingMouse to (do shell script "system_profiler SPUSBDataType | awk '/Gaming Mouse G502:/ { print \"Gaming Mouse\" }'")

    if gamingMouse is equal to "" then
        if internalTrackpad is equal to "Internal Trackpad" then
            my TrackpadIsAttached()
            return
        end if
    end if

    if gamingMouse is equal to "Gaming Mouse" then
        my gamingMouseIsAttached()
        return
    end if
end tell

Puoi aggiungere un ritardo alla fine del tuo script di qualcosa come 15 secondi e riprovare? launchd potrebbe riavviare lo script dopo essere uscito troppo velocemente (il che può essere associato a un'esecuzione errata che richiede un riavvio).
Constantino Tsarouhas

@RandyMarsh Darò uno scatto, tuttavia, ho bisogno che lo script venga eseguito abbastanza velocemente dopo che il dispositivo USB è stato collegato.
Kiril

@RandyMarsh Ho aggiunto un ritardo di 15 secondi, ma lo script è stato riavviato. Sto notando qualcosa di strano: lo script è progettato per aprire le preferenze di sistema, invertire la direzione di scorrimento (quando il mouse è collegato), e quindi uscire dalle preferenze di sistema. Funziona come previsto quando lo eseguo manualmente. Tuttavia, quando launchd esegue lo script, non esce dalla finestra delle preferenze di sistema.
Kiril

Il <Keep Alive> direttiva ricaricherà il tuo script una volta completato; questo è ciò che sta causando il continuo ricaricamento.
Allan

@ Allan: non lo è KeepAlive falso?
SilverWolf
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.