Подтвердить что ты не робот

Mac OS X: Может ли один процесс визуализировать в другое окно процесса?

Привет!

В настоящее время я переношу плагин веб-браузера с Win32 на MacOSX. Одна из особенностей плагина заключается в том, что при загрузке плагина он запускает отдельный процесс, который служит "двигателем" плагина и выполняет операции рисования в окне плагина (в частности, путем присоединения контекста OpenGL к родительского процесса и выполнения команд рендеринга OpenGL в этом контексте). Мы делаем это, потому что плагин обычно загружается как поток в процессе браузера, поэтому сбой в плагине приведет к удалению всего браузера. Разделяя "тяжелый подъем" на отдельный процесс и сохраняя очень плавный код плагина, мы можем защитить пользователей от таких сбоев.

Я хотел бы сохранить эту архитектуру child-process-renderer на MacOSX, но я слышал неприятный слух (связанный с веб-браузером Google Chrome), что MacOSX не позволяет процессу передавать доступ к его окнам к другому процессу. Мой собственный поиск в этом пространстве был неубедительным; если кто-либо знает об этой проблеме и может либо дать некоторые рекомендации о том, как достичь этой цели, либо более убедительно "не может быть сделано", это было бы очень полезно.

Благодарим за помощь!

4b9b3361

Ответ 1

Я изучал это решение почти год назад. Я начал несколько потоков в списках рассылки Apple:

http://www.mail-archive.com/cocoa [email protected]/msg08056.html

http://www.mail-archive.com/[email protected]/msg01878.html

http://lists.apple.com/archives/mac-opengl/2008/May/msg00099.html

Мне пришлось вернуться к решению, которое использовало CGWindowListCreateImage, который взял захват экрана окна процесса opengl и преобразовал его в растровое изображение для отображения в главном окне процесса. Это далеко не эффективно, поскольку данные пикселей передаются с видеопамяти на системный RAM.

Я также попробовал решение с плавающим окном. Окно процесса opengl проплывало над основным окном процесса и реагировало на движения мыши из главного окна. Но у меня были проблемы с перетаскиванием лага и порядка z.

Вы могли бы подумать, что NSWindowSharingReadWrite будет делать то, что вам нужно, но тогда дамбация/примеры тогда практически не существовали.

Но, возможно, в прошлом году ситуация изменилась. Держите меня в курсе, если найдете что-нибудь новое!

Удачи.

х

Ответ 2

Вот общий ответ, полученный от команды разработчиков Apple.

В MacOSX 10.5 и более ранних версиях практически нет способа сделать это так же чисто, как привязка контекста рендеринга OpenGL к другому окну процесса. Взломы, которые люди разработали, могут быть лучшими решениями в этих случаях.

Самое близкое, что мы имеем в MacOS 10.6, - это система IOSurface; использование в 10.6 кажется самым чистым решением. Если вы хотите, чтобы клики в процессе рендеринга были перехвачены процессом рендеринга, вам нужно связать события самостоятельно и передать их в процесс рендеринга, используя любой метод, который вы считаете наиболее подходящим.

Более подробную информацию о IOSurface можно найти в fooobar.com/questions/266264/...

Ответ 3

Окно в одном процессе может быть записано другим процессом, похоже, если для параметра NSWindowSharingType установлено значение NSWindowSharingReadWrite. Это было добавлено в Leopard. Обратите внимание, что я не использовал это сам, но я бы сказал, что он по крайней мере устраняет препятствие "не может быть сделано" для вас; -)