Можно ли программно сделать плагин (для сафари на Mac) оконным или безоконным?

Мы делаем плагин для браузера Safari на Mac.

После просмотра в Интернете я обнаружил, что обычно плагины на Mac не имеют окон, но мне нужен оконный плагин. Даже в функции NPP_SetWindow я попытался напечатать значение переменной type (которая имеет тип NPWindowType) следующим образом:

NPError NPP_SetWindow(NPP instance, NPWindow * pNPWindow)
{
...
printf("....: %d",pNPWindow->type);
...
}

Он печатает 2, т. е. его значение NPWindowTypeDrawable означает отсутствие окон.

Более того, я где-то читал следующий код:

NPError NPP_New(NPMIMEType pluginType,
        NPP instance, uint16 mode,
        int16 argc, char *argn[],
        char *argv[], NPSavedData *saved)
{
 ...
 NPError result = NPN_SetValue(instance, NPPVpluginWindowBool, (void*)false);
}

Здесь говорится, что плагин можно сделать без окон, передав значение для NPPVpluginWindowBool как false в вызове функции NPN_SetValue. Если плагин не выполняет этот вызов, он считается оконным плагином. Но затем он также говорит, что «плагины в Mac OS X всегда без окон». Я еще не был уверен в этом.

У меня вопрос: будет ли передача значения true для NPPVpluginWindowBool здесь делать плагин оконным? Я еще не пробовал.

Пожалуйста, предложите, как сделать его оконным плагином программно или любым другим способом, чтобы pNPWindow->type (в первом фрагменте кода) также печатал 1, т.е. NPWindowTypeWindow означает оконный плагин.

Спасибо.


person user2181750    schedule 27.10.2015    source источник


Ответы (1)


На Mac нет оконных плагинов; когда-то были, сейчас нет.

Теперь у вас есть только чертежные модели, а их три:

  • CoreGraphics
  • CoreAnimation
  • Инвалидация ядра анимации

Первые два — единственные, которые работают в Safari. Невозможно получить объект окна на Mac. Раньше было несколько хаков, которые можно было использовать с Quartz и QuickDraw, возможно, также с Carbon и CoreGraphics, но этих моделей уже давно нет.

Смотрите также:

person taxilian    schedule 27.10.2015
comment
Привет @taxilian, спасибо за ответ. Не могли бы вы поделиться примером кода, касающегося того, что вы можете получить CGContextRef, а затем создать свои собственные внеэкранные NSWindow и NSView и отобразить их в CGContextRef, прочитав одну из ссылок, опубликованных выше? - person user2181750; 27.10.2015
comment
Кроме того, есть ли способ получить NSWindow из объекта CGContextRef? - person user2181750; 27.10.2015
comment
Вы не можете получить NSWindow из CGContextRef. Предвосхищая будущие вопросы: нет способа получить NSWindow браузера в процессе плагина. Это не вопрос ума или поиска лазейки, вы не можете ее получить, потому что указатели окон в OS X зависят от процесса, а вы находитесь в другом процессе (как я сказал в ответ на еще один ваш вопрос). То, что вы пытаетесь сделать, не может быть сделано. Я рекомендую задавать вопрос, который выражает цель более высокого уровня, чтобы кто-то мог попытаться указать вам правильное направление, а не спрашивать о деталях неправильного пути. - person smorgan; 27.10.2015
comment
Привет @smorgan, не могли бы вы рассказать, что именно сделано в плагинах NPAPI для сафари на Mac для отображения видео в браузере? Моя основная цель - передать что-то вроде указателя окна, т.е. указателя на окно браузера, на нижний механизм потоковой передачи, который будет использовать этот указатель для отображения видео в браузере. Если бы вы могли поделиться кодом, это было бы большим подспорьем........ Спасибо. - person user2181750; 30.10.2015
comment
Более того, если это должно быть задано в отдельном вопросе, то опять же было бы хорошо .... :) - person user2181750; 30.10.2015
comment
Это должен быть другой вопрос, но видео можно сделать с помощью CoreAnimation или CoreGraphics. С CoreAnimation вы получаете CALayer, CoreGraphics дает вам CGContextRef. Либо можно использовать для рисования видеокадров. - person taxilian; 30.10.2015
comment
Пожалуйста, прочитайте мой комментарий выше еще раз. Вы не можете этого сделать. Если вашему потоковому движку требуется указатель окна, вы не можете отображать его в окне браузера в современных браузерах Mac. - person smorgan; 31.10.2015
comment
поверьте мне, @smorgan знает, о чем говорит. Вы не можете получить указатель/ссылку окна. Попробуйте один из предложенных мной вариантов. Самое близкое, что вы могли бы сделать, это нарисовать свой собственный указатель окна, удалить биты, а затем рисовать с помощью CoreAnimation или CoreGraphics. Это было бы очень некрасиво. - person taxilian; 02.11.2015