Сценарии Какао: Как я могу использовать обработчики 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
Другие вопросы по тегам