我想为基于 XULRunner 的视频编辑应用程序创建一个名为“video”的自定义 XUL 元素。在 XPCOM 文档中解释了如何从 Javascript 访问您的组件,但我似乎找不到任何关于如何声明新 XUL 元素的文档。我在哪里可以找到这个?谁能指出我正确的方向?
澄清
我希望能够将 GStreamer 管道连接到 XUL 小部件。这需要从我的应用程序的 C++ 部分完成。本质上,它归结为调用:
gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(mOverlay), (gulong)windowId);
所以我需要实现的是一种从 XUL 小部件访问 windowId(Windows 上的 HWND)的方法。这样的最低要求(访问 XUL 组件的窗口 ID)真的需要我创建 NPAPI 插件吗?创建一个 NPAPI 插件似乎有些令人生畏(但由于这个项目可能是可行的)。我想避免矫枉过正,所以如果 XPCOM 组件就足够了,那就太好了。
解决了!
我在 XPCOM 插件中找到了一种方法。我发现可以获得顶级 XUL 窗口的本机句柄。这需要一些技巧,因为您需要包含一些私有 XUL 标头才能破解打开 de XUL 元素并获取窗口句柄。但是一旦你有了它,你就可以创建一个子窗口。
下一个挑战是让子窗口服从 XUL 的布局管理器。由于此窗口不作为 XUL 元素存在,因此它根本不受布局管理器的影响。解决方法是创建一个 XUL 元素,该元素将用作覆盖本机窗口的占位符。对于这个元素,您需要为“resize”事件注册一个回调。在事件处理程序中,您可以使自定义窗口的大小和位置与 XUL 元素相同。
我使用 XBL 来定义一个名为“video”的元素类型。它包含一个 XUL 标签作为唯一的子元素。这个元素在我的 XPCOM 插件中用于上述布局。
这个解决方案效果很好。
这要归功于 Songbird 团队的 Michael Smith。他在 GStreamer 邮件列表上回答了我的问题。如果你有兴趣可以看看这段代码。