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メーリングリストで私の質問に答えました。興味があれば、このコードを見ることができます。