In the meantime, I've used your suggestion and figured a workaround by adding 2 triggers with opposing advanced trigger conditions, each setting the same variable ("activeMissionControl"
) to a different value:
[
{
"BTTGestureNotes" : "Mission Control INACTIVE",
"BTTTriggerConditionsReadOnly" : "NOT (visible_window_list CONTAINS \"Dock - (null)\")",
"BTTTriggerConditions" : "YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMSAAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGvEBgLDBMYHCAoMjM2PUFGR0pOUlZXWmBkaGpVJG51bGzTDQ4PEBESXxAXTlNDb21wb3VuZFByZWRpY2F0ZVR5cGVfEA9OU1N1YnByZWRpY2F0ZXNWJGNsYXNzEACAAoAX0hQPFRdaTlMub2JqZWN0c6EWgAOAFtMNDg8ZGhIQAoAEgBfSFA8dF6EegAWAFtQPISIjJCUmJ18QEU5TUmlnaHRFeHByZXNzaW9uXxAQTlNMZWZ0RXhwcmVzc2lvbl8QE05TUHJlZGljYXRlT3BlcmF0b3KAFYAQgAaAE9UpKissDy0uLzAxWU5TT3BlcmFuZF5OU1NlbGVjdG9yTmFtZV8QEE5TRXhwcmVzc2lvblR5cGVbTlNBcmd1bWVudHOACIAHEAOACoAPXHZhbHVlRm9yS2V5OtIrDzQ1EAGACdI3ODk6WiRjbGFzc25hbWVYJGNsYXNzZXNfEBBOU1NlbGZFeHByZXNzaW9uozk7PFxOU0V4cHJlc3Npb25YTlNPYmplY3TSFA8+QKE_gAuADtMPK0JDREVZTlNLZXlQYXRogA0QCoAMXxATdmlzaWJsZV93aW5kb3dfbGlzdNI3OEhJXxAcTlNLZXlQYXRoU3BlY2lmaWVyRXhwcmVzc2lvbqNIOzzSNzhLTF5OU011dGFibGVBcnJheaNLTTxXTlNBcnJhedI3OE9QXxATTlNLZXlQYXRoRXhwcmVzc2lvbqRPUTs8XxAUTlNGdW5jdGlvbkV4cHJlc3Npb27TUysPVBBVXxAPTlNDb25zdGFudFZhbHVlgBGAEl1Eb2NrIC0gKG51bGwp0jc4WFlfEBlOU0NvbnN0YW50VmFsdWVFeHByZXNzaW9uo1g7PNQPW1xdXhAQX1pOU01vZGlmaWVyV05TRmxhZ3NeTlNPcGVyYXRvclR5cGWAFBBj0jc4YWJfEBVOU0luUHJlZGljYXRlT3BlcmF0b3KjYWM8XxATTlNQcmVkaWNhdGVPcGVyYXRvctI3OGVmXxAVTlNDb21wYXJpc29uUHJlZGljYXRlo2VnPFtOU1ByZWRpY2F0ZdI3OE1pok080jc4a2xfEBNOU0NvbXBvdW5kUHJlZGljYXRlo2tnPAAIABEAGgAkACkAMgA3AEkATABRAFMAbgB0AHsAlQCnAK4AsACyALQAuQDEAMYAyADKANEA0wDVANcA3ADeAOAA4gDrAP8BEgEoASoBLAEuATABOwFFAVQBZwFzAXUBdwF5AXsBfQGKAY8BkQGTAZgBowGsAb8BwwHQAdkB3gHgAeIB5AHrAfUB9wH5AfsCEQIWAjUCOQI+Ak0CUQJZAl4CdAJ5ApAClwKpAqsCrQK7AsAC3ALgAukC9AL8AwsDDQMPAxQDLAMwA0YDSwNjA2cDcwN4A3sDgAOWAAAAAAAAAgEAAAAAAAAAbQAAAAAAAAAAAAAAAAAAA5o=",
"BTTTriggerType" : 643,
"BTTTriggerTypeDescription" : "Named Trigger: btt.testMissionControl",
"BTTTriggerClass" : "BTTTriggerTypeOtherTriggers",
"BTTPredefinedActionType" : 281,
"BTTPredefinedActionName" : "Run Real JavaScript",
"BTTRealJavaScriptString" : "(async () => {\n await callBTT(\"set_string_variable\", { variable_name: \"activeMissionControl\", to: \"0\" });\n returnToBTT(0);\n})();",
"BTTTriggerName" : "btt.testMissionControl",
"BTTEnabled2" : 1,
"BTTAlternateModifierKeys" : 0,
"BTTRepeatDelay" : 0,
"BTTUUID" : "2D6090F7-B9A4-4C8B-AB7D-1DB01AE92371",
"BTTNotesInsteadOfDescription" : 0,
"BTTEnabled" : 1,
"BTTModifierMode" : 0,
"BTTOrder" : 10,
"BTTDisplayOrder" : 0
},
{
"BTTGestureNotes" : "Mission Control ACTIVE",
"BTTTriggerConditionsReadOnly" : "visible_window_list CONTAINS \"Dock - (null)\"",
"BTTTriggerConditions" : "YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMSAAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGvEBYLDBMYICorLTQ4PT5BRUlOT1JYXGBiVSRudWxs0w0ODxAREl8QF05TQ29tcG91bmRQcmVkaWNhdGVUeXBlXxAPTlNTdWJwcmVkaWNhdGVzViRjbGFzcxABgAKAFdIUDxUXWk5TLm9iamVjdHOhFoADgBTUDxkaGxwdHh9fEBFOU1JpZ2h0RXhwcmVzc2lvbl8QEE5TTGVmdEV4cHJlc3Npb25fEBNOU1ByZWRpY2F0ZU9wZXJhdG9ygBOADoAEgBHVISIjJA8lJicoKVlOU09wZXJhbmReTlNTZWxlY3Rvck5hbWVfEBBOU0V4cHJlc3Npb25UeXBlW05TQXJndW1lbnRzgAaABRADgAiADVx2YWx1ZUZvcktleTrSIw8QLIAH0i4vMDFaJGNsYXNzbmFtZVgkY2xhc3Nlc18QEE5TU2VsZkV4cHJlc3Npb26jMDIzXE5TRXhwcmVzc2lvblhOU09iamVjdNIUDzU3oTaACYAM0w8jOTo7PFlOU0tleVBhdGiACxAKgApfEBN2aXNpYmxlX3dpbmRvd19saXN00i4vP0BfEBxOU0tleVBhdGhTcGVjaWZpZXJFeHByZXNzaW9uoz8yM9IuL0JDXk5TTXV0YWJsZUFycmF5o0JEM1dOU0FycmF50i4vRkdfEBNOU0tleVBhdGhFeHByZXNzaW9upEZIMjNfEBROU0Z1bmN0aW9uRXhwcmVzc2lvbtNKIw9LTE1fEA9OU0NvbnN0YW50VmFsdWWADxAAgBBdRG9jayAtIChudWxsKdIuL1BRXxAZTlNDb25zdGFudFZhbHVlRXhwcmVzc2lvbqNQMjPUD1NUVVZMTFdaTlNNb2RpZmllcldOU0ZsYWdzXk5TT3BlcmF0b3JUeXBlgBIQY9IuL1laXxAVTlNJblByZWRpY2F0ZU9wZXJhdG9yo1lbM18QE05TUHJlZGljYXRlT3BlcmF0b3LSLi9dXl8QFU5TQ29tcGFyaXNvblByZWRpY2F0ZaNdXzNbTlNQcmVkaWNhdGXSLi9EYaJEM9IuL2NkXxATTlNDb21wb3VuZFByZWRpY2F0ZaNjXzMACAARABoAJAApADIANwBJAEwAUQBTAGwAcgB5AJMApQCsAK4AsACyALcAwgDEAMYAyADRAOUA+AEOARABEgEUARYBIQErAToBTQFZAVsBXQFfAWEBYwFwAXUBdwF8AYcBkAGjAacBtAG9AcIBxAHGAcgBzwHZAdsB3QHfAfUB+gIZAh0CIgIxAjUCPQJCAlgCXQJ0AnsCjQKPApECkwKhAqYCwgLGAs8C2gLiAvEC8wL1AvoDEgMWAywDMQNJA00DWQNeA2EDZgN8AAAAAAAAAgEAAAAAAAAAZQAAAAAAAAAAAAAAAAAAA4A=",
"BTTTriggerType" : 643,
"BTTTriggerTypeDescription" : "Named Trigger: btt.testMissionControl",
"BTTTriggerClass" : "BTTTriggerTypeOtherTriggers",
"BTTPredefinedActionType" : 281,
"BTTPredefinedActionName" : "Run Real JavaScript",
"BTTRealJavaScriptString" : "(async () => {\n await callBTT(\"set_string_variable\", { variable_name: \"activeMissionControl\", to: \"1\" });\n returnToBTT(1);\n})();",
"BTTTriggerName" : "btt.testMissionControl",
"BTTEnabled2" : 1,
"BTTAlternateModifierKeys" : 0,
"BTTRepeatDelay" : 0,
"BTTUUID" : "3DA12C71-465D-4FEB-B191-0102584C986C",
"BTTNotesInsteadOfDescription" : 0,
"BTTEnabled" : 1,
"BTTModifierMode" : 0,
"BTTOrder" : 13,
"BTTDisplayOrder" : 0
}
]
From a webview or JS, I can then infer whether Mission Control is active at any time using:
async function activeMissionControl() {
await callBTT("trigger_named_async_without_response", { trigger_name: "btt.testMissionControl" });
return !!parseInt(await callBTT("get_string_variable", { variable_name: "activeMissionControl" }));
};
I realise it seems a complete antipattern to await
a call to trigger_named_async_without_response
, but for some reason it doesn't work with a regular trigger_named
.
I also tried returning a result directly from the named trigger
without the intermediary variable, but couldn't get this to work at all. Even when using Applescript or a shell script, which I originally thought contradicts this part of the documentation. However I then realised that line of text is repeated elsewhere in that same page but for other actions. @Andreas_Hegenberg please could you clarify that this limitation in fact refers to the runAppleScript()
and runShellScript()
JS-specific actions, as opposed to a named trigger
calling an Apple Script
or Shell Script
action? The difference in wording is subtle, but I wasted a good couple of hours down that particular rabbit hole
.
Anyway, I've done a bit of testing with polling this method within a webview, and it does indeed seem a lot less resource-intensive than using a runShellScript
call with the compiled binary as I originally suggested
.