2009-02-24 8 views
19

Grüße!Mac OS X: Kann man den Prozess zum Fenster eines anderen Prozesses verarbeiten?

Ich portiere derzeit ein Webbrowser-Plugin von Win32 auf MacOSX. Eine der Eigenschaften des Plugins ist, dass beim Laden des Plugins ein separater Prozess erzeugt wird, der als "Engine" des Plugins dient und Zeichnungsoperationen in das Fenster des Plugins ausführt (insbesondere durch Anhängen eines OpenGL - Kontexts an das Plugin) Fenster des übergeordneten Prozesses und Ausführen von OpenGL-Rendering-Befehlen in diesem Kontext). Wir tun dies, weil das Plugin normalerweise als ein Thread innerhalb des Browserprozesses geladen wird, so dass ein Absturz im Plugin den gesamten Browser zum Absturz bringen würde. Indem wir das "Heavy Lifting" in einen separaten Prozess einteilen und den Plugin-Code sehr schlank halten, können wir die Benutzer vor solchen Abstürzen schützen.

Ich möchte diese Kind-Prozess-Renderer-Architektur auf MacOSX beibehalten, aber ich habe ein hässliches Gerücht gehört (in Bezug auf den Google Chrome-Webbrowser), dass MacOSX einem Prozess nicht erlaubt, Zugriff darauf zu gewähren Fenster zu einem anderen Prozess. Meine eigene Suche in diesem Raum war nicht eindeutig; Wenn jemand etwas über dieses Problem weiß und entweder einen Ratschlag geben könnte, wie man dieses Ziel erreicht, oder ein schlüssigeres "kann nicht gemacht werden", wäre das äußerst hilfreich.

Vielen Dank für Ihre Hilfe!

+0

Dies gefunden werden könnte für Sie von Interesse sein. http://developer.apple.com/DOCUMENTATION/CoreFoundation/Conceptual/CFPlugIns/CFPlugIns.html – Jonathan

+2

Das hat nichts wirklich mit etwas zu tun, das das ursprüngliche Plakat fragte. –

+0

hi - wo ist die Dokumentation darüber für Win32? Ich würde gerne die Grenzen des Besitzes von Multiprozessfenstern kennenlernen. – drudru

Antwort

9

Ich habe vor fast einem Jahr eine Lösung zu diesem Thema untersucht. Ich begann ein paar Threads auf den Apfelmailinglisten:

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

Ich musste zu einer Lösung zurückkehren, die CGWindowListCreateImage verwendete, die einen Bildschirmgriff des opengl-Prozessfensters nahm und ihn in eine Bitmap für die Anzeige im Hauptprozessfenster umwandelte. Dies ist bei weitem nicht effektiv, da Pixeldaten vom Video-RAM zum System-RAM übertragen werden.

Ich habe auch eine Floating-Window-Lösung versucht. Das OpenGL-Prozessfenster schwebte über dem Hauptprozessfenster und reagierte auf Mausbewegungen aus dem Hauptfenster. Aber ich hatte Probleme mit der Verzögerung und der Reihenfolge der Fenster z.

Sie würden denken, NSWindowSharingReadWrite würde tun, was Sie benötigen, aber Doumentation/Beispiele damals waren praktisch nicht existent.

Aber vielleicht haben sich die Dinge im letzten Jahr geändert. Halten Sie mich auf dem Laufenden, wenn Sie etwas Neues finden!

Viel Glück

JC

+0

Nachdem ich ungefähr eine Woche lang dieses Problem untersucht hatte, bin ich mehr oder weniger hier gelandet. Ich habe ausstehende Anfragen an Apple zu dem Problem, aber niemand hat mir mitgeteilt, wie ich ein Fenster mit NSWindowSharingType nutzen kann, das auf NSWindowSharingReadWrite gesetzt ist. Ab Mac OS 10.5 muss ich "When-to-Windows" entweder "nicht vorhanden" oder "zu schlecht dokumentiert, um es zu beachten" aufrufen. Die Lösung, die ich verwendete, war, einen shared Memory-Puffer mit shm_open und mmap, glReadPixels in das von Prozess A zu erstellen, und dann glTexImage2D und rendern zu einem Quad in Prozess B. Es ist schnell genug. – fixermark

+0

Ich habe auch den Ansatz versucht, bei dem das OpenGL-Prozessfenster über dem Hauptprozess schwebt. Der Umgang mit Spaces erfordert, dass Sie eine private API verwenden, die Ihnen Benachrichtigungen gibt, wenn der Benutzer zwischen Bildschirmen wechselt oder Expose verwendet. Der schlimmste Teil ist der Umgang mit Klicks, der dazu führt, dass die z-Position des Hauptfensters vor das OpenGL-Fenster geht, aber ich habe in [NSWindow sendEvent] eine private Funktion gefunden, die sie teilweise gelöst hat. Das ist hässlich und ich suche nach einer besseren Lösung. – neoneye

3

Ein Fenster in einem Prozess kann von einem anderen Prozess beschrieben werden, scheinbar, wenn NSWindowSharingType auf NSWindowSharingReadWrite gesetzt ist. Das wurde in Leopard hinzugefügt. Beachten Sie, dass ich das selbst nicht benutzt habe, aber ich würde sagen, dass es das "Kann nicht machbar" Hindernis für Sie beseitigt ;-)

5

Hier ist die allgemeine Antwort von der Apple-Entwicklerteam erhalten.

Es gibt im Wesentlichen keine Möglichkeit, dies in MacOSX 10.5 und früher zu tun, das ist so sauber wie das Anfügen eines OpenGL-Renderkontexts an das Fenster eines anderen Prozesses. Die Hacks, die Leute entwickelt haben, mögen in diesen Fällen die besten Lösungen sein.

Das nächste, was wir in MacOS 10.6 haben, ist the IOSurface system; die Verwendung in 10.6 scheint die sauberste Lösung zu sein. Wenn Sie möchten, dass Klicks im gerenderten Prozess vom Renderprozess abgefangen werden, müssen Sie die Ereignisse selbst bündeln und an den Renderprozess übergeben, wobei Sie die Methode verwenden, die Sie am besten finden.

Mehr Informationen über IOSurface könnte in this StackOverflow entry

Verwandte Themen