2009-02-24 41 views
19

Chúc mừng!Mac OS X: Có thể một quá trình hiển thị cửa sổ của một quá trình khác không?

Tôi hiện đang chuyển một plugin trình duyệt web từ Win32 sang MacOSX. Một trong những tính năng của plugin là khi plugin được tải, nó sẽ sinh ra một quá trình riêng biệt đóng vai trò là "công cụ" của plugin và thực hiện thao tác vẽ vào cửa sổ của plugin (cụ thể, bằng cách đính kèm ngữ cảnh OpenGL vào cửa sổ của quá trình cha mẹ và thực hiện các lệnh kết xuất OpenGL vào ngữ cảnh đó). Chúng tôi làm điều này vì plugin thường được tải dưới dạng một chuỗi trong quá trình trình duyệt, do đó, sự cố trong plugin sẽ làm giảm toàn bộ trình duyệt. Bằng cách phân vùng 'nâng hạng nặng' thành một quy trình riêng biệt và giữ mã plugin rất mỏng, chúng tôi có thể bảo vệ người dùng chống lại các sự cố như vậy.

Tôi muốn giữ lại kiến ​​trúc trình xử lý con này trên MacOSX, nhưng tôi đã nghe một tin đồn khó chịu (liên quan đến trình duyệt web Google Chrome) mà MacOSX không cho phép quá trình truy cập vào cửa sổ cho quá trình khác. Tìm kiếm của riêng tôi trong không gian này đã không được kết luận; nếu bất cứ ai có bất kỳ kiến ​​thức nào về vấn đề này và có thể cung cấp một số lời khuyên về cách thực hiện mục tiêu này hoặc kết luận "không thể thực hiện được", điều đó sẽ cực kỳ hữu ích.

Cảm ơn sự giúp đỡ của bạn!

+0

Điều này có thể bạn quan tâm. http://developer.apple.com/DOCUMENTATION/CoreFoundation/Conceptual/CFPlugIns/CFPlugIns.html – Jonathan

+2

Điều đó không thực sự liên quan đến bất kỳ nội dung nào mà người đăng ban đầu yêu cầu. –

+0

hi - tài liệu về điều này cho win32 ở đâu? Tôi muốn tìm hiểu các giới hạn về quyền sở hữu cửa sổ đa quy trình. – drudru

Trả lời

9

Tôi đã điều tra một giải pháp này gần một năm trước đây. Tôi bắt đầu một vài chủ đề trên danh sách gửi thư táo:

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

Tôi đã phải quay trở lại một giải pháp mà sử dụng CGWindowListCreateImage mà lấy một màn hình lấy của cửa sổ quá trình opengl và chuyển đổi nó thành một bitmap để hiển thị trong cửa sổ quá trình chính. Điều này là xa effeicient kể từ khi dữ liệu pixel được chuyển từ ram video để ram hệ thống.

Tôi cũng đã thử một giải pháp cửa sổ nổi. Cửa sổ quá trình opengl trôi nổi trên cửa sổ chính và phản ứng với chuyển động của chuột từ cửa sổ chính. Nhưng tôi đã có vấn đề với kéo lag và cửa sổ z thứ tự.

Bạn sẽ nghĩ rằng NSWindowSharingReadWrite sẽ làm những gì bạn yêu cầu, nhưng doumentation/ví dụ trở lại sau đó là thực tế không tồn tại.

Nhưng có thể mọi thứ đã thay đổi trong năm qua. Hãy để tôi đăng nếu bạn tìm thấy bất cứ điều gì mới!

Chúc may mắn

JC

+0

Sau khi điều tra vấn đề này trong khoảng một tuần, tôi đã hạ cánh nhiều hơn hoặc ít hơn ở đây. Tôi có những yêu cầu nổi bật đối với Apple về vấn đề này, nhưng không ai đã lấy lại cho tôi về cách tận dụng lợi thế của một cửa sổ với NSWindowSharingType được đặt thành NSWindowSharingReadWrite. Kể từ Mac OS 10.5, tôi sẽ phải gọi cho các cửa sổ viết là "không tồn tại" hoặc "quá kém tài liệu để quan tâm". Giải pháp tôi đã sử dụng là tạo bộ đệm chia sẻ bộ nhớ với shm_open và mmap, glReadPixels vào đó từ tiến trình A và sau đó là glTexImage2D và hiển thị cho quad trong tiến trình B. Đủ nhanh. – fixermark

+0

Tôi cũng đã thử cách tiếp cận nơi cửa sổ quy trình opengl nổi trên quá trình chính. Đối phó với Spaces yêu cầu bạn sử dụng API riêng cung cấp cho bạn thông báo khi người dùng chuyển đổi màn hình hoặc sử dụng hiển thị. Phần tồi tệ nhất là xử lý các nhấp chuột, điều đó làm cho vị trí z của cửa sổ chính đi trước cửa sổ opengl, nhưng tôi đã tìm thấy một hàm riêng tư trong [NSWindow sendEvent] đã giải quyết được một phần. Điều này là xấu xí và tôi đang tìm kiếm một giải pháp tốt hơn là tốt. – neoneye

3

Một cửa sổ trong một quy trình có thể được viết bởi một quy trình khác, dường như nếu NSWindowSharingType được đặt thành NSWindowSharingReadWrite. Điều đó đã được thêm vào trong Leopard. Lưu ý rằng tôi đã không sử dụng này bản thân mình, nhưng tôi sẽ nói rằng nó ít nhất loại bỏ những trở ngại "không thể được thực hiện" cho bạn ;-)

5

Dưới đây là câu trả lời chung nhận được từ đội ngũ phát triển của Apple.

Về cơ bản không có cách nào để thực hiện việc này trong MacOSX 10.5 và trước đó là sạch sẽ như đính kèm ngữ cảnh hiển thị OpenGL vào cửa sổ của quá trình khác. Các hacks người đã phát triển có thể là giải pháp tốt nhất trong những trường hợp.

Điều gần nhất chúng tôi có trong MacOS 10.6 là the IOSurface system; sử dụng trong 10.6 có vẻ là giải pháp sạch nhất. Nếu bạn muốn các nhấp chuột trong quá trình kết xuất bị chặn bởi quá trình kết xuất, bạn sẽ phải tự mình sắp xếp các sự kiện và chuyển chúng đến quá trình kết xuất bằng bất kỳ phương pháp nào bạn thấy phù hợp nhất.

Bạn có thể tìm thêm thông tin trên IOSurface trong this StackOverflow entry

Các vấn đề liên quan