Question

Bonjour!

Je suis actuellement le portage d'un plugin de navigateur Web de Win32 à MacOSX. L'une des caractéristiques du plugin est que, lorsque le module est chargé, il génère un processus distinct qui sert de « moteur » de l'extension et exécute les opérations de dessin dans la fenêtre du module d'extension (en particulier, en attachant un contexte OpenGL pour la la fenêtre de processus parent et l'exécution de rendu OpenGL commandes dans ce contexte). Nous faisons cela parce que le plug-in est généralement chargé en tant que thread dans le processus de navigateur, si plantages dans le plug-in prendraient sur le navigateur entier. En divisant le « levage de charges lourdes » dans un processus distinct et en gardant le code du plugin très mince, nous pouvons protéger les utilisateurs contre de tels accidents.

Je voudrais préserver cette architecture enfant processus sur MacOSX renderer, mais je l'ai entendu une rumeur méchante (en rapport avec le navigateur Web Google Chrome) que MacOSX ne permet pas un processus d'accès à la main à ses fenêtres à un autre processus. Ma propre recherche dans cet espace a été peu concluante; si quelqu'un a connaissance de ce problème et pourrait soit donner des conseils sur la façon d'atteindre cet objectif ou une plus concluante « ne peut pas être fait, » il serait extrêmement utile.

Merci pour votre aide!

Était-ce utile?

La solution

J'enquêtait sur une solution à ce presque il y a un an. J'ai commencé quelques discussions sur les listes de diffusion de pomme:

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

I eu à revenir à une solution qui utilise CGWindowListCreateImage qui a pris une capture d'écran de la fenêtre de processus d'OpenGL et le convertir en une image bitmap pour l'affichage dans la fenêtre principale de traitement. Ceci est loin d'être effeicient puisque les données de pixel est transféré de RAM vidéo à la RAM système.

J'ai essayé aussi une solution de fenêtre flottante. La fenêtre de processus d'OpenGL flottait au-dessus de la fenêtre principale de traitement et de répondre à des mouvements de souris dans la fenêtre principale. Mais j'avais des problèmes avec glisser le décalage et la fenêtre pour z.

On pourrait penser NSWindowSharingReadWrite ferait ce que vous avez besoin, mais doumentation / exemples étaient alors pratiquement inexistante.

Mais peut-être les choses ont changé au cours de l'année dernière. Tenez-moi si vous trouvez posté quelque chose de nouveau!

Bonne chance

JC

Autres conseils

Voici la réponse globale reçue de l'équipe de développement d'Apple.

Il n'y a pratiquement aucun moyen de le faire dans MacOSX 10.5 et versions antérieures qui est aussi propre que la fixation d'un contexte de rendu OpenGL à la fenêtre d'un autre processus. Les personnes hacks ont mis au point peuvent être les meilleures solutions dans ces cas.

La chose la plus proche que nous avons sous MacOS 10.6 est cette entrée StackOverflow

Une fenêtre en un seul processus peut être écrit par un autre processus, apparemment si le NSWindowSharingType est réglé sur NSWindowSharingReadWrite. Cela a été ajouté dans Leopard. Notez que je ne l'ai pas utilisé moi-même, mais je dirais que au moins l'enlève « ne peut pas être fait » obstacle pour vous; -)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top