2 votos

Cómo evitar que el agente de lanzamiento lance repetidamente un determinado AppleScript

Estoy tratando de crear un agente de lanzamiento, que lanza un AppleScript cada vez que se conecta un ratón. Es similar a estas dos preguntas:

Sin embargo, una vez que cargo mi agente de lanzamiento (a través de launchctl load ), sigue iniciándose cada 5 o más segundos. ¿Cómo puedo asegurarme de que el agente se ejecuta sólo una vez, cuando el ratón está conectado?

Aquí está mi 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>

El AppleScript en cuestión:

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

1voto

zen Puntos 41

La respuesta suele ser que hay que llamar a xpc_set_event_stream_handler.

Encontré esta increíble utilidad que llamará a xpc_set_event_stream_handler para eliminar el evento de la cola, y luego llamar a su aplicación deseada. Me permitió resolver el problema que estás teniendo sin escribir/compilar ningún código. Echa un vistazo a github.com/snosrap/xpc_set_event_stream_handler y haz que llame a tu osascript. Debería resolver tu problema.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X