Advertisement
Guest User

transparent webkitgtk

a guest
Dec 11th, 2013
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.63 KB | None | 0 0
  1. #include <gtk/gtk.h>
  2. #include <gdk/gdkx.h>
  3. #include <gdk/gdkscreen.h>
  4. #include <cairo.h>
  5. #include <webkit/webkit.h>
  6.  
  7. static void screen_changed(GtkWidget *widget, GdkScreen *old_screen, gpointer user_data);
  8. static gboolean expose(GtkWidget *widget, GdkEventExpose *event, gpointer user_data);
  9. static void clicked(GtkWindow *win, GdkEventButton *event, gpointer user_data);
  10.  
  11. static void location_cb(WebKitWebView *view, const char *uri, gpointer user_data)
  12. {
  13.     if(webkit_web_view_get_transparent(view)){
  14.       fprintf(stdout,"TRANSPARENT\n");
  15.     }else{
  16.       fprintf(stdout,"NOT TRANSPARENT\n");
  17.     }
  18.     fprintf(stdout,"loaded\n");
  19.     fflush(stdout);
  20.  
  21. }
  22.  
  23.  
  24. int main(int argc, char **argv)
  25. {
  26.     gtk_init(&argc, &argv);
  27.  
  28.     GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  29.     GdkWindow *gwin;
  30.     GtkWidget* webkit_player = NULL;
  31.  
  32.     gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  33.     gtk_window_set_default_size(GTK_WINDOW(window), 400, 400);
  34.     gtk_window_set_title(GTK_WINDOW(window), "Alpha Demo");
  35.     g_signal_connect(G_OBJECT(window), "delete-event", gtk_main_quit, NULL);
  36.  
  37.     gtk_widget_set_app_paintable(window, TRUE);
  38.  
  39.     g_signal_connect(G_OBJECT(window), "expose-event", G_CALLBACK(expose), NULL);
  40.     g_signal_connect(G_OBJECT(window), "screen-changed", G_CALLBACK(screen_changed), NULL);
  41.  
  42.     gtk_window_set_decorated(GTK_WINDOW(window), FALSE);
  43.     gtk_widget_add_events(window, GDK_BUTTON_PRESS_MASK);
  44.     g_signal_connect(G_OBJECT(window), "button-press-event", G_CALLBACK(clicked), NULL);
  45.  
  46.  
  47.     webkit_player = webkit_web_view_new();
  48.     webkit_web_view_set_transparent(WEBKIT_WEB_VIEW(webkit_player), TRUE);
  49.     g_signal_connect(webkit_player, "load-finished", G_CALLBACK(location_cb), "file://test.html");
  50.  
  51.     gtk_container_add(GTK_CONTAINER(window), webkit_player);
  52.  
  53.     screen_changed(window, NULL, NULL);
  54.     // load the uri
  55.     webkit_web_view_load_string(WEBKIT_WEB_VIEW(webkit_player), "<html><style type='text/css'>body {background: rgba(0,255,0,0.1);}</style><head></head><body><h1>Hello World!</h1></body></html>", NULL, NULL, "file://");
  56.  
  57.     gtk_widget_show_all(window);
  58.     gwin = gtk_widget_get_window(GTK_WIDGET(window));
  59.     printf("the X11 id is %u\n", GDK_DRAWABLE_XID(gwin));
  60.  
  61.     gtk_main();
  62.  
  63.     return 0;
  64. }
  65.  
  66.  
  67. gboolean supports_alpha = TRUE;
  68. static void screen_changed(GtkWidget *widget, GdkScreen *old_screen, gpointer userdata)
  69. {
  70.     /* To check if the display supports alpha channels, get the colormap */
  71.     GdkScreen *screen = gtk_widget_get_screen(widget);
  72.     GdkColormap *colormap = gdk_screen_get_rgba_colormap(screen);
  73.  
  74.     if (!colormap)
  75.     {
  76.         printf("Your screen does not support alpha channels!\n");
  77.         colormap = gdk_screen_get_rgb_colormap(screen);
  78.         supports_alpha = FALSE;
  79.     }
  80.     else
  81.     {
  82.         printf("Your screen supports alpha channels!\n");
  83.         supports_alpha = TRUE;
  84.     }
  85.  
  86.     gtk_widget_set_colormap(widget, colormap);
  87. }
  88.  
  89. static gboolean expose(GtkWidget *widget, GdkEventExpose *event, gpointer userdata)
  90. {
  91.    cairo_t *cr = gdk_cairo_create(widget->window);
  92.  
  93.     if (supports_alpha)
  94.         cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0); /* transparent */
  95.     else
  96.         cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* opaque white */
  97.  
  98.     /* draw the background */
  99.     cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
  100.     cairo_paint (cr);
  101.  
  102.     cairo_destroy(cr);
  103.  
  104.     return FALSE;
  105. }
  106.  
  107. static void clicked(GtkWindow *win, GdkEventButton *event, gpointer user_data)
  108. {
  109.     /* toggle window manager frames */
  110.     gtk_window_set_decorated(win, !gtk_window_get_decorated(win));
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement