2008-11-28 25 views
32

Tôi đang cố gắng đánh giá khả năng của một bản vá cho WebKit, điều này sẽ cho phép tất cả đồ họa được hiển thị trên nền hoàn toàn trong suốt.Có thể hiển thị nội dung web trên nền rõ ràng bằng WebKit không?

Hiệu ứng mong muốn là hiển thị nội dung web mà không có bất kỳ nền nào, nó sẽ xuất hiện trôi nổi trên màn hình (hoặc bất kỳ thứ gì được hiển thị phía sau cửa sổ trình duyệt).

Có ai nhìn thấy ứng dụng thực hiện việc này không? (Tôi có thể nghĩ về một số trình giả lập thiết bị đầu cuối có thể.) Nếu ai đó đã làm việc bên trong WebKit (hoặc có thể là Gecko?) Bạn có nghĩ rằng nó có thể thực hiện được điều này không?


Cập nhật: Tôi đã nhận ra rằng Mac OSX widget bảng điều khiển sử dụng kỹ thuật này chính xác. Vì vậy, điều này phải có thể.


Cập nhật 2: tôi đã biên soạn WebKit trên linux và nhận thấy các tùy chọn cấu hình bao gồm:

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

tôi nhận được gần hơn. Có ai giúp được không?


Cập nhật 3: tôi tiếp tục tìm tài liệu tham khảo này trong bài viết trên danh sách gửi thư khác nhau có liên quan.

+0

Bạn có thể thử xây dựng nền tảng Adobe AIR nếu đó là một tùy chọn. Có một vài cách để làm điều đó ở đó. http://theflexmagazine.com/2009/01/29/transparent-application-window-with-adobe-air/ và http://www.adobe.com/cfusion/communityengine/index.cfm?event=showdetails&productId=4&postId = 8226 –

+0

Tôi nhận thấy điều này là có thể, nhưng không lý tưởng do yêu cầu cấp phép (mục tiêu là trình phát được nhúng), chúng tôi đang cố gắng duy trì trạng thái không mong muốn nhất có thể. Tôi nhận ra rằng có những bản vá lỗi từ Adobe mà dường như đã không tìm đường trở lại vào WebKit. (Hỗ trợ plugin không cửa sổ trong bản dựng Gtk là bản chính). –

Trả lời

24

Giải Quyết!

Thông qua nghiên cứu đang diễn ra, các diễn đàn cọ rửa và kho mã nguồn, tôi đã ghép các bước cần thiết để thực hiện điều này bằng cách sử dụng chỉ libwebkit và máy tính để bàn compiz chuẩn (bất kỳ máy tính để bàn Xorg nào có tính năng tổng hợp).

Đối với một libwebkit hiện tại (1.1.10-SVN), có một PPA Ubuntu:

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

Theo mã đi, phím được gọi webkit_web_view_set_transparent.

Và dĩ nhiên, hệ thống bạn đang chạy trên đó phải có thẻ đồ họa có khả năng (intel, radeon hoặc nvidia) và đang chạy trình quản lý cửa sổ tổng hợp (như Compiz).

Và cuối cùng, để thực sự thấy độ trong suốt, nội dung bạn đang xem phải đặt nền trong suốt bằng CSS3, nếu không nó vẫn hoàn toàn mờ đục.

Nó đơn giản như:

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

Dưới đây là toàn bộ mẫu cho ứng dụng trình duyệt webkit đơn giản nhất có thể, với sự hỗ trợ minh bạch:

#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! http://i27.tinypic.com/2qntlxl.jpg

+3

Làm tốt lắm. Tôi không chắc chắn CSS3 là cần thiết cho nền trong suốt; Tôi sẽ có mặc dù cũ CSS1 'BODY {background-color: transparent; } 'sẽ hoạt động. Đã không thử nó mặc dù. –

+2

Một điều cần lưu ý, điều này gây ra sự cố khi tải các plugin như Flash không mong đợi vùng màu của ARGB. Ứng dụng gặp sự cố khi họ cố gắng vẽ màn hình trên API XEmbed (X11: Lỗi BadMatch). –

+1

Flash vẫn hút. Điều này có hoạt động với HTML5/WebGL không? –

1

Về cơ bản bạn muốn được thiết lập không gian màu ARGB được gửi tới người quản lý cửa sổ. Rõ ràng chỉ những người quản lý cửa sổ có hỗ trợ tổng hợp mới có thể tận dụng điều này.

Bạn có thể muốn nói chuyện với các nhà phát triển screenlet và compiz, họ sẽ có thể trợ giúp thêm.

+0

Tôi đồng ý, một nửa số đó. Nhưng làm thế nào để tôi thiết lập một màu nền trong trang web để hình ảnh kết xuất cuối cùng không được thực hiện để luôn luôn mờ đục. Nó đơn giản như thiết lập BODY {opacity: 0; }? –

+0

Nên, không chắc chắn. Các chàng trai compiz/screenlet đã làm hiển thị các loại cửa sổ tiện ích của máy tính để bàn. – ewanm89

+0

Tôi nghĩ rằng họ thậm chí còn sử dụng webkit (trên thực tế tôi nghĩ đã có một giải pháp dựng hình tiện ích con cho mọi công cụ hiển thị chính chấp nhận có thể là tắc kè bây giờ). – ewanm89

2

Quay lại Safari 1.3 và 2, đã có menu gỡ lỗi ẩn (được gọi qua Thiết bị đầu cuối: defaults write com.apple.Safari IncludeDebugMenu 1) bao gồm tùy chọn "Sử dụng Cửa sổ trong suốt".

Không chắc nếu điều này là một điều WebKit hoặc một điều Safari mặc dù.

(Trong Safari 3, debug đơn dường như đã được thay thế bằng “Phát triển” menu (cho phép trong Preferences> Advanced) mà không có tùy chọn cửa sổ trong suốt.)

+0

Cảm ơn mẹo. Điều này đặt tôi vào đường mòn bên phải. Tôi đặt cược cuộc gọi đến set_transparent chức năng đã được kiểm soát bởi trình đơn gỡ lỗi tùy chọn trở lại khi nó đã có sẵn. –

1

Tôi có một giải pháp mới thực sự dễ thực hiện đối với một ảnh chụp màn hình. Nó đang sử dụng node.js với thư viện phantom.js.

  1. cài đặt Node.js
  2. chạy 'NPM cài đặt phantomjs -g' trong giao diện điều khiển/thiết bị đầu cuối
  3. lưu sau khi script.js và chạy nó từ giao diện điều khiển '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. lợi nhuận? :) tận hưởng
Các vấn đề liên quan