c++ - 创建 GStreamer XUL 元素?

标签 c++ xul xpcom

我想为基于 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 插件似乎有点令人畏惧(但由于 this project 可能是可行的)。我想避免过度杀伤,所以如果 XPCOM 组件就足够了,那就太好了。

解决了!
我在 XPCOM 插件中找到了一种方法。我发现可以获得顶级 XUL 窗口的 native 句柄。这需要一些技巧,因为您需要包含一些私有(private) XUL header 才能破解打开 XUL 元素并获取窗口句柄。但是一旦拥有它,您就可以创建一个子窗口。

下一个挑战是让子窗口服从XUL的布局管理器。由于此窗口不作为 XUL 元素存在,因此它根本不会受到布局管理器的影响。解决方法是创建一个 XUL 元素,用作覆盖 native 窗口的占位符。对于此元素,您需要为“调整大小”事件注册回调。在事件处理程序中,您可以使自定义窗口的大小和位置与 XUL 元素相同。

我使用 XBL 定义名为“video”的元素类型。它包含一个 XUL 标签作为唯一的子元素。该元素在我的 XPCOM 插件中用于上述布局。

这个解决方案效果很好。

感谢 Songbird 团队的 Michael Smith。他回答my question on the GStreamer mailing列表。有兴趣的话可以看this code .

最佳答案

您无法使用 XPCOM 实现新的 XUL 元素。您的选择是: