2010-01-05 66 views
2

我想爲基於XULRunner的視頻編輯應用程序創建一個名爲'video'的自定義XUL元素。在XPCOM文檔中解釋瞭如何從Javascript訪問你的組件,但我似乎無法找到關於如何聲明一個新的XUL元素的任何文檔。我在哪裏可以找到這個?任何人都可以將我指向正確的方向嗎?創建GStreamer XUL元素?

澄清
我希望能夠將GStreamer管道連接到XUL小部件。這需要從我的應用程序的C++部分完成。它在本質上歸結於調用:

gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(mOverlay), (gulong)windowId); 

所以我要實現的是從XUL控件訪問一個WINDOWID(HWND在Windows上)的方式。這樣的最低要求(訪問XUL組件的窗口ID)是否真的需要我創建NPAPI插件?創建一個NPAPI插件似乎有點令人生畏(但可能是this project感謝)。我想避免矯枉過正,所以如果一個XPCOM組件就足夠了,那就太棒了。

解決!
我在XPCOM插件中找到了一種方法。我發現可以獲得頂級XUL窗口的本地句柄。這需要一些hackery,因爲你需要包含一些私有的XUL頭文件來破解de XUL元素並獲得窗口句柄。但是一旦擁有了它,你就可以創建一個子窗口。

下一個挑戰是讓子窗口服從XUL的佈局管理器。由於該窗口不作爲XUL元素存在,因此根本不會受到佈局管理器的影響。解決方法是創建一個XUL元素作爲佔位符來覆蓋本機窗口。對於此元素,您需要爲「調整大小」事件註冊一個回調。在事件處理程序中,您可以使自定義窗口的大小和位置與XUL元素相同。

我使用XBL定義名稱爲「video」的元素類型。它僅包含一個XUL標籤作爲子元素。對於上述佈局,此元素用於我的XPCOM插件中。

該解決方案工作得很好。

功勞歸於Songbird團隊的Michael Smith。他回答了my question on the GStreamer mailing名單。如果你有興趣,你可以看看this code

+0

澄清是好的,你應該問在mozilla.dev.platform新聞組,因爲你可能不會在這裏得到更好的答案。在這種情況下,我仍然主要選擇NPAPI,但問題在於我的舒適區。 – Nickolay 2010-01-09 09:28:54

回答

3

您不能使用XPCOM實現新的XUL元素。您的選擇是:

  • 使用像HTML5的現有元素<視頻>或<畫布>。這裏的a demo一起玩耍。隨着JS引擎速度的提高,它可能足夠滿足您的需求。
  • 實現使用XBL一個新元素(其內容也只能是其它元素的組合,再加上定製API和樣式)
  • 實施NPAPI插件並經由<對象中嵌入它>。這允許您在C代碼中處理繪畫和事件。這種插件的例子包括Flash和Komodo Edit和IDE中的編輯組件(scintilla)。
+0

我想在XUL元素上渲染GStreamer管道。似乎視頻或畫布元素不會允許這種靈活性。所以我會開始檢查NPAPI。 – StackedCrooked 2010-01-06 16:56:34

+0

我覺得有些買家因爲在這個問題上花費了300分,而感到懊悔。但是,它們是給你的,因爲你幫助我更清楚地瞭解問題的本質,這幫助我更接近解決方案。 – StackedCrooked 2010-01-09 18:17:18

0

我認爲這最簡單的方法是創建一個新的XPCom(C++)Canvas上下文(「webcam」)並通過Thebes API在此上下文中注入框架。爲了讓事情更「美好」,我建議將所有內容都嵌入到XBL中。