2

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要素をクラックしてウィンドウハンドルを取得するには、プライベートXULヘッダーの一部を含める必要があるため、これにはある程度のハッカーが必要です。ただし、それを取得したら、子ウィンドウを作成できます。

次の課題は、子ウィンドウをXULのレイアウトマネージャーに従わせることです。このウィンドウはXUL要素として存在しないため、レイアウトマネージャーの影響はまったく受けません。回避策は、ネイティブウィンドウをオーバーレイするプレースホルダーとして機能するXUL要素を作成することです。この要素については、「サイズ変更」イベントのコールバックを登録する必要があります。イベントハンドラーでは、カスタムウィンドウのサイズと位置をXUL要素と同じにすることができます。

XBLを使用して、「video」という名前の要素タイプを定義します。サブ要素としてのみXULラベルが含まれています。この要素は、上記のレイアウトと同様に、私のXPCOMプラグインで使用されます。

このソリューションは非常にうまく機能します。

クレジットはSongbirdチームのMichaelSmithにあります。彼はGStreamerメーリングリストで私の質問に答えました。興味があれば、このコードを見ることができます。

4

2 に答える 2

3

XPCOM を使用して新しい XUL 要素を実装することはできません。オプションは次のとおりです。

  • HTML5 <video> や <canvas> などの既存の要素を使用します。これは、2 人が一緒に遊んでいるデモです。JS エンジンの速度が向上したため、必要に応じて十分に高速になる可能性があります。
  • XBL を使用して新しい要素を実装する (そのコンテンツは、他の要素とカスタム API およびスタイルの組み合わせのみにすることができます)
  • NPAPI プラグインを実装し、<object> を介して埋め込みます。これにより、C コードで描画とイベントを処理できます。このようなプラグインの例には、Komodo Edit および IDE の Flash および編集コンポーネント (scintilla) が含まれます。
于 2010-01-06T14:47:34.883 に答える
0

この最も簡単な方法は、新しい XPCom (C++) Canvas コンテキスト (「webcam」) を作成し、Thebes API を介してこのコンテキストにフレームを挿入することだと思います。そして、より「美しい」ものにするために、すべてを XBL に埋め込むことをお勧めします。

于 2010-01-22T11:09:38.887 に答える