Mac OS X: может ли один процесс отображаться в окне другого процесса? - PullRequest
20 голосов
/ 24 февраля 2009

Привет!

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

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

Спасибо за помощь!

Ответы [ 3 ]

9 голосов
/ 16 апреля 2009

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

http://www.mail-archive.com/cocoa-dev@lists.apple.com/msg08056.html

http://www.mail-archive.com/quartzcomposer-dev@lists.apple.com/msg01878.html

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

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

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

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

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

Удачи

JC

6 голосов
/ 13 ноября 2009

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

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

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

Более подробную информацию о IOSurface можно найти в этой записи StackOverflow

4 голосов
/ 28 февраля 2009

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

...