2011-12-27 1 views
0

Я пытаюсь создать плагин NPAPI для прослушивания мультимедийных клавиш на macbook и передать его в javascript для управления такими вещами, как pandora или soundcloud. Я использую Spomify в библиотеке SPMediaKeyTap, которая просто завершает работу CGEventTap в отдельном потоке.Обработка CGEventTaps в плагине NPAPI

Моя проблема в том, что я использую npn_invoke для обращения к javascript. Это работает нормально, но когда он запускается из обратного вызова CGEventTap, он выдает плагин. Я понимаю, что это нужно запускать из потока плагина, и я попытался передать его обратно в основной поток как с помощью [NSObject performSelectorOnMainThread], так и [NSObject performSelector: onThread] с потоком, который я сохранил в главном потоке метод создания плагинов. Оба этих решения по-прежнему терпят крах при любом вызове npn. Есть ли что-нибудь еще, что происходит при обработке события CGEventTap, которое приводит к тому, что состояние недействительно для вызовов взаимодействия с браузером NPN?

+2

есть ли трассировка стека, где он разбился? и пример кода того, как вы вызываете NPN_Invoke? – taxilian

+0

Итак, в NPP_New я сохраняю поток с помощью main_thread = [NSThread currentThread]; затем в обработчике SPMediaKeyTap, я назвать [само performSelector: onThread: blahblah:] с main_thread и он выходит из строя на этой линии: browser-> GetValue (экземпляр, NPNVWindowNPObject, и окна); Я точно не знаю, как получить трассировку стека в плагине NPAPI ... – msfeldstein

+0

Кажется, что я сбой при доступе к этому объекту браузера (NPNetscapeFuncs *). Я думаю, что происходит то, что ключевые события входят в основной процесс Chrome, который не может получить доступ к переменной браузера, которая находится в процессе плагина. Я получаю EXC_BAD_ACCESS/KERN_PROTECTION_FAILURE на этой строке. Если я сохраню команду в статической переменной, тогда проверьте ее в HandleEvent и вызовите функцию JS там, она работает нормально. Мне просто нужно каким-то образом сказать плагину что-то сделать в процессе плагина из процесса пользовательского интерфейса. – msfeldstein

ответ

0

Не пытайтесь догадываться о моделирование резьбы, сохраняя поток, как и вы; просто используйте performSelectorOnMainThread для вызова методов NPN. Я делаю это все время, и он отлично работает, поэтому я предполагаю, что что-то с вашим методом кросс-нити-сортировки не работает так, как ему нужно.