Создать GStreamer XUL элемент?

Я хотел бы создать пользовательский элемент XUL с именем "video" для приложения для редактирования видео на основе XULRunner. В документации XPCOM объясняется, как получить доступ к вашему компоненту из Javascript, но я не могу найти никакой документации о том, как объявить новый элемент XUL. Где я могу найти это? Может кто-то указать мне верное направление?

осветление
Я хочу иметь возможность подключить конвейер GStreamer к виджету XUL. Это должно быть сделано из C++ части моего приложения. По сути это сводится к вызову:

gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(mOverlay), (gulong)windowId);

Так что мне нужно добиться способа доступа к windowId (HWND в Windows) из виджета XUL. Действительно ли такое минимальное требование (доступ к идентификатору окна для компонента XUL) действительно требует от меня создания плагина NPAPI? Создание плагина NPAPI кажется несколько сложным (но, вероятно, выполнимым благодаря этому проекту). Я бы хотел избежать излишеств, поэтому, если будет достаточно компонента XPCOM, это будет здорово.

Решено!
Я нашел способ сделать это в плагине XPCOM. Я обнаружил, что можно получить собственный дескриптор окна XUL верхнего уровня. Это требует некоторого взлома, потому что вам нужно включить некоторые из частных заголовков XUL, чтобы взломать элемент de XUL и получить дескриптор окна. Но как только вы это сделаете, вы можете создать дочернее окно.

Следующая задача - заставить дочернее окно подчиняться диспетчеру компоновки XUL. Поскольку это окно не существует как элемент XUL, оно не будет затронуто менеджером макета. Обходной путь - создать элемент XUL, который будет служить заполнителем для наложения собственного окна. Для этого элемента вам необходимо зарегистрировать обратный вызов для события "resize". В обработчике событий вы можете сделать размер и положение своего пользовательского окна таким же, как у элемента XUL.

Я использую XBL для определения типа элемента с именем "видео". Он содержит метку XUL как единственный подэлемент. Этот элемент используется в моем плагине XPCOM, как для макета, описанного выше.

Это решение работает довольно хорошо.

Кредит принадлежит Майклу Смиту из команды Songbird. Он ответил на мой вопрос в списке рассылки GStreamer. Если вы заинтересованы, вы можете посмотреть на этот код.

2 ответа

Решение

Вы не можете реализовать новый элемент XUL, используя XPCOM. Ваши варианты:

  • Используйте существующий элемент, такой как HTML5
  • реализовать новый элемент с использованием XBL (его содержимое может быть только комбинацией других элементов, плюс пользовательские API и стиль)
  • реализовать плагин NPAPI и внедрить его через <объект>. Это позволяет вам обрабатывать рисование и события в вашем C-коде. Примеры таких плагинов включают Flash и компонент редактирования (scintilla) в Komodo Edit и IDE.

Я думаю, что это самый простой способ - создать новый контекст Ca nvas в XPCom (C++) ("веб-камера") и через API Thebes внедрить фрейм в этом контексте. И чтобы было что-то более "красивое", я бы предложил встраивать все в XBL.

Другие вопросы по тегам