Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to render web content over a clear background using WebKit?

I'm trying to gauge the possibility of a patch to WebKit which would allow all rendered graphics to be rendered onto a fully transparent background.

The desired effect is to render web content without any background at all, it should appear to float over the desktop (or whatever is displayed behind the browser window).

Has anyone seen an app do this? (I can think of some terminal emulators that can.) If anyone has worked inside of WebKit (or possibly Gecko?) do you think it would be possible to do this?


Update: I've come to realize that Mac OSX dashboard widgets use this exact technique. So, this must be possible.


Update 2: I've compiled WebKit on linux and noticed the configure options include:

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

I'm getting closer. Can anyone help?


Update 3: I continue to find references to this in posts on various related mailing lists.

  • https://lists.webkit.org/pipermail/webkit-dev/2008-September/005019.html
  • https://lists.webkit.org/pipermail/webkit-dev/2009-June/008182.html
like image 630
Mark Renouf Avatar asked Nov 28 '08 01:11

Mark Renouf


People also ask

How do I make the background of a Web page transparent?

You can easily make a transparent web page using the opacity property in HTML. You simply need to adjust the opacity value between 0.0 to 1.0 where a low value represents high transparency and a high value represents low transparency.

Can you have transparent videos?

The only way to create a video with a transparent background is to have it initially shot in front of a green screen. Once you upload a green screen video to VSDC (or any other video editor that has the Chroma Key tool), you can remove the green color from it, thus leaving the background transparent.


1 Answers

Solved!

Through ongoing research, scouring forums and source code repositories, I peiced together the necessary steps to accomplish this using only libwebkit and a standard compiz desktop (any Xorg desktop with compositing should do).

For a current libwebkit (1.1.10-SVN), there is an 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 

As far as the code goes, the key is calling webkit_web_view_set_transparent.

And of course the system you're running it on should have a capable graphics card (intel, radeon, or nvidia) and be running a compositing window manager (like Compiz).

And finally, to actually see transparency, the content you're viewing must set a transparent background using CSS3, otherwise it's still completely opaque.

It's as simple as:

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

Here' is the full sample for the simplest possible webkit browser app, with transparency support:

#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; } 

Screenshot!

like image 196
Mark Renouf Avatar answered Sep 25 '22 02:09

Mark Renouf