Сценарии Какао: Как я могу использовать обработчики AppleScript (события)?
Добавляя возможность написания сценариев к моему приложению Mac, мне интересно, могу ли я вызывать обработчики на конце сценария из моего приложения. Если так, как это работает?
Насколько я понимаю, обработчики похожи на функции (как в "on-run"), которые могут вызываться событиями, поступающими извне собственного кода скрипта. И файл Sdef понимает event
тег, видя, что я могу вводить события с помощью редактора Sdef. Но я не могу найти никакой документации по этому вопросу в Руководстве по написанию сценариев Какао.
Мое приложение записывает буфер обмена, поэтому мне интересно, смогу ли я сообщить запущенным сценариям, что был записан новый буфер обмена, чтобы скрипт мог с ним работать.
Теперь вместо того, чтобы вызывать отдельные (автономные) сценарии, которые я нахожу, загружаю и запускаю для такого события, я бы предпочел, чтобы пользователь мог постоянно запускать сценарий, который объявляет событие, которое затем вызывает мое приложение. (Является ли это действительно хорошей идеей, обсуждать здесь не стоит, я просто использую это как пример для понимания событий AppleScript.)
Это возможно? Если нет, то для чего предназначены записи о событиях в sdef?
Обновление: вот введение в обработчики в AppleScript: MacScripter: Начало работы с обработчиками
1 ответ
Сложность реализации обработчиков событий AppleScript заключается в том, что приложение должно иметь постоянную ссылку на сценарий.
Например, сценарии для обработки обработчиков событий в Finder, Messages, Mail должны быть зарегистрированы в целевом приложении, чтобы сохранить ссылку на сценарий.
Когда сценарий реализует один из предоставленных обработчиков событий, целевое приложение создает NSAppleEventDescriptor
с
initWithEventClass:kHandlerEventClass
eventID:kEventID
targetDescriptor:kEventTargetDescriptor
returnID:kAutoGenerateReturnID // predefined constant in CarbonCore.h
transactionID:kAnyTransactionID]; // predefined constant in CarbonCore.h
включая под-дескрипторы для параметров, и отправить его через executeAppleEvent
на ссылку на целевой скрипт.
kEventID
это 4 младших значащих бита кода из 8 символов в файле sdef ('EfgH').kHandlerEventClass
являются наиболее 4 значащими битами 8-символьного кода в файле sdef ('abcD').kEventTargetDescriptor
являетсяNSAppleEventDescriptor
представление клиента или целевого приложения в качестве обратного адреса.
Обработчик событий работает аналогично команде, вот очень простой пример
<event name="did appear something" code="abcDEfgH" description="This handler is called when something appears.">
<direct-parameter description="The names of the appeared something.">
<type type="text" list="yes"/>
</direct-parameter>
<parameter name="with result" code="smTS" description="A record of some information about the names" type="something reply"/>
</event>
в AppleScript реализован обработчик
on did appear something theNames with result theResult
theNames
это список текстаtheResult
это пользовательский тип записиsomething reply