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