Hi adlo, With the event box you can draw with transparency. If you want to get the CSS and combine that with a cairo drawing and have transparency so that you can see the background window through the event box window, all that can be done.
Eric //gcc -Wall render_css1.c -o render_css1 `pkg-config --cflags --libs gtk+-3.0` //Tested with GTK3.18 and GTK3.22 #include<gtk/gtk.h> static gboolean draw_event_box(GtkWidget *event_box, cairo_t *cr, gpointer user_data) { gint width=gtk_widget_get_allocated_width(event_box); gint height=gtk_widget_get_allocated_height(event_box); //Draw from CSS. GtkStyleContext *context=gtk_widget_get_style_context(event_box); gtk_render_background(context, cr, 0, 0, width, height); gtk_render_frame(context, cr, 0, 0, width, height); //Draw with cairo also. cairo_set_source_rgba(cr, 0.0, 1.0, 1.0, 1.0); cairo_set_line_width(cr, 10); cairo_translate(cr, width/2, height/2); cairo_arc(cr, 0, 0, 0.3*width, 0.0, 2.0*G_PI); cairo_stroke(cr); return FALSE; } int main(int argc, char *argv[]) { gtk_init(&argc, &argv); GtkWidget *window=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "Event Box"); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(window), 300, 300); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); GtkWidget *event_box=gtk_event_box_new(); gtk_widget_set_app_paintable(event_box, TRUE); gtk_widget_set_hexpand(event_box, TRUE); gtk_widget_set_vexpand(event_box, TRUE); gtk_widget_set_name(event_box, "event1"); g_signal_connect(event_box, "draw", G_CALLBACK(draw_event_box), NULL); GtkWidget *label=gtk_label_new("Label"); gtk_container_add(GTK_CONTAINER(event_box), label); GtkWidget *grid=gtk_grid_new(); gtk_grid_attach(GTK_GRID(grid), event_box, 0, 0, 1, 1); gtk_container_add(GTK_CONTAINER(window), grid); GError *css_error=NULL; gchar *css_string=NULL; //Set background alpha. css_string=g_strdup("#event1{background: rgba(255,0,255,0.3); border: solid 20px yellow;}"); GtkCssProvider *provider=gtk_css_provider_new(); GdkDisplay *display=gdk_display_get_default(); GdkScreen *screen=gdk_display_get_default_screen(display); gtk_style_context_add_provider_for_screen(screen, GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); gtk_css_provider_load_from_data(provider, css_string, -1, &css_error); if(css_error!=NULL) { g_print("CSS loader error %s\n", css_error->message); g_error_free(css_error); } g_object_unref(provider); if(css_string!=NULL) g_free(css_string); gtk_widget_show_all(window); gtk_main(); return 0; }
_______________________________________________ gtk-list mailing list gtk-list@gnome.org https://mail.gnome.org/mailman/listinfo/gtk-list