Можно ли отображать веб-контент на чистом фоне с помощью WebKit?

Я пытаюсь оценить возможность патча для WebKit, который позволил бы отображать всю отображаемую графику на полностью прозрачном фоне.

Желаемый эффект заключается в отображении веб-контента вообще без фона, он должен плавать по рабочему столу (или тому, что отображается за окном браузера).

Кто-нибудь видел приложение, делающее это? (Я могу придумать некоторые эмуляторы терминала, которые могут это сделать.) Если бы кто-нибудь работал внутри WebKit (или, возможно, Gecko?), как вы думаете, было бы возможно сделать это?


Обновление: я понял, что виджеты инструментальной панели Mac OSX используют именно этот метод. Итак, это должно быть возможно.


Обновление 2: я скомпилировал WebKit для Linux и заметил, что параметры настройки включают:

--enable-dashboard-support
enable Dashboard support default=yes

Я приближаюсь. Кто-нибудь может помочь?


Обновление 3: я продолжаю находить упоминания об этом в сообщениях в различных соответствующих списках рассылки.


person Mark Renouf    schedule 28.11.2008    source источник
comment
Возможно, вы захотите попробовать выполнить сборку для платформы Adobe AIR, если это возможно. Есть несколько способов сделать это там. theflexmagazine.com/2009/01/29/ и adobe.com/cfusion/communityengine/   -  person Joey Robert    schedule 28.04.2009
comment
Я понимаю, что это возможно, но не идеально из-за лицензионных требований (целью является встроенный проигрыватель), мы стараемся оставаться как можно более свободными. Я понимаю, что есть патчи от Adobe, которые, похоже, еще не вернулись в WebKit. (Поддержка плагинов без окон в сборке Gtk является основной).   -  person Mark Renouf    schedule 28.04.2009


Ответы (5)


Решено!

В ходе продолжающихся исследований, изучения форумов и репозиториев исходного кода я собрал воедино необходимые шаги для достижения этой цели, используя только libwebkit и стандартный рабочий стол compiz (подойдет любой рабочий стол Xorg с композитингом).

Для текущего libwebkit (1.1.10-SVN) есть Ubuntu PPA:

deb http://ppa.launchpad.net/webkit-team/ppa/ubuntu jaunty main
deb-src http://ppa.launchpad.net/webkit-team/ppa/ubuntu jaunty main

Что касается кода, ключ вызывает webkit_web_view_set_transparent.

И, конечно же, система, на которой вы его запускаете, должна иметь подходящую видеокарту (intel, radeon или nvidia) и работать с композитным оконным менеджером (например, Compiz).

И, наконец, чтобы действительно увидеть прозрачность, просматриваемый контент должен установить прозрачный фон с помощью CSS3, иначе он все еще будет полностью непрозрачным.

Это так же просто, как:

BODY { background-color: rgba(0,0,0,0); }

Вот полный пример простейшего браузерного приложения webkit с поддержкой прозрачности:

#include <gtk/gtk.h>
#include <webkit/webkit.h>

static void destroy_cb(GtkWidget* widget, gpointer data) {
  gtk_main_quit();
}

int main(int argc, char* argv[]) {
  gtk_init(&argc, &argv);

  if(!g_thread_supported())
    g_thread_init(NULL);

  // Create a Window, set colormap to RGBA
  GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  GdkScreen *screen = gtk_widget_get_screen(window);
  GdkColormap *rgba = gdk_screen_get_rgba_colormap (screen);

  if (rgba && gdk_screen_is_composited (screen)) {
    gtk_widget_set_default_colormap(rgba);
    gtk_widget_set_colormap(GTK_WIDGET(window), rgba);
  }

  gtk_window_set_default_size(GTK_WINDOW(window), 800, 800);
  g_signal_connect(window, "destroy", G_CALLBACK(destroy_cb), NULL);

  // Optional: for dashboard style borderless windows
  gtk_window_set_decorated(GTK_WINDOW(window), FALSE);


  // Create a WebView, set it transparent, add it to the window
  WebKitWebView* web_view = web_view = WEBKIT_WEB_VIEW(webkit_web_view_new());
  webkit_web_view_set_transparent(web_view, TRUE);
  gtk_container_add (GTK_CONTAINER(window), GTK_WIDGET(web_view));

  // Load a default page
  webkit_web_view_load_uri(web_view, "http://stackoverflow.com/");

  // Show it and continue running until the window closes
  gtk_widget_grab_focus(GTK_WIDGET(web_view));
  gtk_widget_show_all(window);
  gtk_main();
  return 0;
}

Скриншот!

person Mark Renouf    schedule 15.07.2009
comment
Хорошо сделано. Я не уверен, что CSS3 необходим для прозрачного фона; Я бы хотел, чтобы старый CSS1 BODY{ background-color: transparent; } работал. Хотя не пробовал. - person Paul D. Waite; 22.07.2009
comment
Следует отметить, что это происходит при загрузке плагинов, таких как Flash, которые не ожидают цветового пространства ARGB. Приложение аварийно завершает работу, когда они пытаются рисовать на экране через XEmbed API (X11: ошибка BadMatch). - person Mark Renouf; 22.07.2009
comment
Возможно, я больше не занимаюсь этой работой, так как сменил место работы и больше не занимаюсь разработкой продукта, для которого она предназначалась. Вы можете забрать его. - person Mark Renouf; 19.08.2011
comment
Это компилируется для меня на 64-битном Arch Linux с clang main.c -o program `pkg-config --cflags --libs gtk+-2.0 webkit-1.0`, но когда я указываю на локальный веб-сервер, обслуживающий страницу с прозрачным фоном, он отображается темно-серым. - person Anko; 18.06.2014

Еще в Safari 1.3 и 2 было скрытое меню отладки (вызывается через Терминал: defaults write com.apple.Safari IncludeDebugMenu 1), которое включало параметр «Использовать прозрачное окно».

Не уверен, что это было связано с WebKit или Safari.

(В Safari 3 меню отладки, кажется, было заменено меню «Разработка» (включено в «Настройки»> «Дополнительно»), в котором нет опции прозрачного окна.)

person Paul D. Waite    schedule 09.05.2009
comment
Спасибо за совет. Это поставило меня на правильный путь. Бьюсь об заклад, вызов функции set_transparent контролировался этой опцией меню отладки, когда она была доступна. - person Mark Renouf; 15.07.2009

По сути, вы хотите настроить цветовое пространство ARGB для отправки диспетчеру окон. Очевидно, что только оконные менеджеры, поддерживающие композитинг, смогут воспользоваться этим преимуществом.

Возможно, вы захотите поговорить с разработчиками screenlet и compiz, они должны помочь больше.

person ewanm89    schedule 26.04.2009
comment
Согласен, это половина дела. Но как мне установить цвет фона на веб-странице, чтобы окончательное визуализированное изображение не всегда было непрозрачным. Это так же просто, как установить BODY { opacity: 0; } ? - person Mark Renouf; 27.04.2009
comment
Должно быть, не уверен. Ребята из compiz/screenlet уже делают рендеринг виджетов на рабочем столе. - person ewanm89; 27.04.2009
comment
Я думаю, что они даже используют webkit (на самом деле, я думаю, что уже есть решение для рендеринга виджетов на рабочем столе для каждого основного движка рендеринга, который, возможно, сейчас принимает gecko). - person ewanm89; 27.04.2009
comment
Насколько я знаю, все экранные файлы напрямую управляются Gtk/Cairo под управлением Python. Я не могу найти никаких ссылок на WebKit в их документации. - person Mark Renouf; 05.05.2009
comment
Что касается веб-страницы, свойство opacity применяется к содержимому HTML-элемента, а также к его фону, поэтому BODY {opacity: 0;} сделает невидимым все, что находится внутри вашего тега body. Я думаю, что WebKit поддерживает значения цвета с альфа-прозрачностью, поэтому вы должны сделать body { background-color: rgba(0,0,0,0); }. Я думаю, что значение цвета фона по умолчанию прозрачно, поэтому вам, вероятно, не нужно его устанавливать. - person Paul D. Waite; 09.05.2009
comment
Спасибо за помощь... ваша информация была ключевой частью решения! - person Mark Renouf; 15.07.2009

Этот смысл работает для меня по состоянию на 2013 год, проверен только с Ubuntu:

https://gist.github.com/pouria-mellati/7771779

person Pouria    schedule 03.12.2013

У меня есть новое решение, которое действительно легко сделать для одного снимка экрана. Он использует node.js с библиотекой phantom.js.

  1. установить node.js
  2. запустите «npm install -g phantomjs» в консоли/терминале
  3. сохраните следующее как script.js и запустите его из консоли 'phantomjs script.js'

    var page = require('webpage').create();
    page.viewportSize = { width: 1920, height: 1500 };
    page.open("http://www.theWebYouWantToRender");
    page.onLoadFinished = function(status) {
        page.evaluate(function() {
            document.body.style.background = 'transparent';
        });
    
        page.render('render.png');
        phantom.exit();
    };
    
  4. выгода? :) наслаждаться
person Eskel    schedule 29.03.2016