2009-02-24 4 views
19

Salutations!Mac OS X: Un processus peut-il être rendu dans la fenêtre d'un autre processus?

Je suis actuellement en train de porter un plugin de navigateur Web de Win32 à MacOSX. Une des caractéristiques du plugin est que lorsque le plugin est chargé, il engendre un processus séparé qui sert de "moteur" du plugin et exécute des opérations de dessin dans la fenêtre du plugin (en particulier, en attachant un contexte OpenGL au fenêtre du processus parent et exécution des commandes de rendu OpenGL dans ce contexte). Nous faisons cela parce que le plugin est généralement chargé comme un thread dans le processus du navigateur, de sorte que les plantages dans le plugin enlèvent tout le navigateur. En partitionnant le 'heavy lifting' dans un processus séparé et en gardant le code du plugin très mince, nous pouvons protéger les utilisateurs contre de tels accidents. Je souhaite préserver cette architecture enfant-processus-rendu sur MacOSX, mais j'ai entendu une mauvaise rumeur (liée au navigateur Web Google Chrome) selon laquelle MacOSX ne permet pas à un processus de donner accès à ses fenêtres à un autre processus. Ma propre recherche dans cet espace n'a pas été concluante; Si quelqu'un a des connaissances sur ce problème et pourrait soit donner des conseils sur la façon d'atteindre cet objectif ou un plus concluant «ne peut pas être fait», il serait extrêmement utile.

Nous vous remercions de votre aide!

+0

Cela pourrait être vous intéresser. http://developer.apple.com/DOCUMENTATION/CoreFoundation/Conceptual/CFPlugIns/CFPlugIns.html – Jonathan

+2

Cela n'a rien à voir avec ce que l'affiche originale demandait. –

+0

salut - où est la documentation à ce sujet pour win32? Je voudrais apprendre les limites de la propriété de fenêtres multi-processus. – drudru

Répondre

9

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

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

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

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

Je devais revenir à une solution qui utilisait CGWindowListCreateImage qui prenait une capture d'écran de la fenêtre de processus opengl et la convertissait en bitmap pour l'afficher dans la fenêtre de processus principale. C'est loin d'être efficace puisque les données de pixel sont transférées du RAM vidéo au RAM du système.

J'ai également essayé une solution de fenêtre flottante. La fenêtre de processus opengl flottait au-dessus de la fenêtre de processus principale et répondait aux mouvements de la souris depuis la fenêtre principale. Mais j'ai eu des problèmes avec le décalage traînant et l'ordre de fenêtre z.

Vous penseriez que NSWindowSharingReadWrite ferait ce dont vous aviez besoin, mais à l'époque les douditions/exemples étaient pratiquement inexistants.

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

Bonne chance

JC

+0

Après avoir étudié ce problème pendant environ une semaine, j'ai atterri plus ou moins ici. J'ai des demandes en suspens à Apple sur le problème, mais personne ne m'a demandé comment tirer parti d'une fenêtre avec NSWindowSharingType définie sur NSWindowSharingReadWrite. À partir de Mac OS 10.5, je vais devoir appeler write-to-windows soit «inexistant» soit «trop peu documenté pour s'en soucier». La solution que j'ai utilisée était de créer un tampon de mémoire partagée avec shm_open et mmap, glReadPixels dans celui du processus A, puis glTexImage2D et de rendre à un quad dans le processus B. C'est assez rapide. – fixermark

+0

J'ai également essayé l'approche où la fenêtre de processus opengl flotte au-dessus du processus principal. Traiter les espaces nécessite que vous utilisiez une API privée qui vous envoie des notifications lorsque l'utilisateur change d'écran ou utilise l'option d'exposition. Le pire est de gérer les clics, qui font passer la position z de la fenêtre principale devant la fenêtre opengl, mais j'ai trouvé une fonction privée dans [NSWindow sendEvent] qui la résout partiellement. C'est moche et je cherche une meilleure solution aussi. – neoneye

3

Une fenêtre dans un processus peut être écrite par un autre processus, apparemment si le NSWindowSharingType est défini sur NSWindowSharingReadWrite. Cela a été ajouté dans Leopard. Notez que je ne l'ai pas utilisé moi-même, mais je dirais qu'il supprime au moins l'obstacle "ne peut pas être fait" pour vous ;-)

5

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

Il n'existe pour l'essentiel aucun moyen de le faire dans MacOSX 10.5 et versions antérieures, aussi propre que de lier un contexte de rendu OpenGL à la fenêtre d'un autre processus. Les personnes hacks ont développé peut-être les meilleures solutions dans ces cas.Le plus proche de MacOS 10.6 est the IOSurface system; l'utiliser dans 10.6 semble être la solution la plus propre. Si vous souhaitez que les clics dans le processus de rendu soient interceptés par le processus de rendu, vous devrez regrouper les événements vous-même et les transmettre au processus de rendu en utilisant la méthode que vous jugerez la plus appropriée.

Plus d'informations sur IOSurface pourrait être trouvée dans this StackOverflow entry

Questions connexes