Как создать окно в браузере с дескриптором NSWindow?

Я делаю плагин для сафари на Mac. Я застрял в том, как создать окно над окном браузера, в котором может отображаться видео.

Ранее мы использовали модель Cocoa Event, в которой указатель окна, полученный в NPWindow в функции NPP_SetWindow, равен нулю. Затем мы переключились на модель Carbon Event и получили указатель на NP_CGContext через указатель окна, присутствующий в структуре NPWindow, с помощью которого мы получили указатель на WindowRef и получили указатель на NSWindow следующим образом:

NP_CGContext* npContext = (NP_CGContext*)npWindow->window;
WindowRef window = npContext->window;
NSWindow* browserWindow = [[[NSWindow alloc] initWithWindowRef:window] autorelease];

Наш потоковый движок принимает указатель на NSWindow. Мы не знаем, как создать окно в пространстве нашего браузера.

Поэтому любая помощь в создании окна будет оценена по достоинству.


person user2632126    schedule 31.10.2015    source источник
comment
Я не могу убедительно сообщить вам, что предпосылка вашей серии вопросов — желание создать плагин NPAPI для потоковой передачи видео — глубоко и фундаментально ошибочна. Chrome удалил поддержку плагинов NPAPI, Mozilla объявила, что прекратит поддержку к концу 2016 года, и, хотя Apple не объявила о каких-либо планах, они обычно не известны своей расширенной поддержкой устаревших технологий. Вы выбрали технологию, которая с наименьшей вероятностью продолжит свое существование для этого проекта. Я настоятельно рекомендую либо использовать веб-стандарты для видео, либо сделать приложение, а не плагин.   -  person smorgan    schedule 31.10.2015


Ответы (1)


Наш потоковый движок принимает указатель на NSWindow. Мы не знаем, как создать окно в пространстве нашего браузера.

Вы не должны этого делать, как описано в предыдущий ответы.

Механизм потоковой передачи, требующий указателя NSWindow, очень плохо подходит для создания плагина NPAPI. Вы должны, если это вообще возможно, искать что-то, что принимает или продает CALayer, или, если это не удается, что может рисовать кадры в CGContextRef (но это будет намного медленнее в плагинах вне процесса).

Если вам абсолютно необходимо использовать NSWindow, вам нужно создать новый в процессе вашего плагина, который совершенно не связан с окном браузера, и отобразить его где-нибудь на экране. Пользовательский опыт будет относительно плохим, потому что он не будет перемещаться вместе с окном, может оказаться за окном браузера и т. д. Это явно не рекомендуется производителями браузеров. Но если у вас нет другого выбора, кроме как использовать NSWindow, то это ваш единственный вариант с современными браузерами.

person smorgan    schedule 31.10.2015
comment
Он абсолютно прав (если вам по каким-то причинам нужно второе мнение) - person taxilian; 03.11.2015