#include #include static cairo_surface_t *_create_gradient_surface(int width, int height) { cairo_surface_t *resultant_surface = NULL; cairo_t *temp_cr; resultant_surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, width, height); temp_cr = cairo_create(resultant_surface); cairo_rectangle(temp_cr, 0, 0, width, height); cairo_set_source_rgb(temp_cr, 0, 0, 0); cairo_paint(temp_cr); cairo_destroy(temp_cr); return resultant_surface; } static gboolean expose_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data) { cairo_surface_t *tmp = _create_gradient_surface(widget->allocation.width, widget->allocation.height); cairo_t *cr = gdk_cairo_create (widget->window); cairo_set_source_surface (cr, tmp, 0, 0); cairo_paint(cr); cairo_destroy(cr); cairo_surface_destroy(tmp); return TRUE; } int main(int argc, char **argv) { /* GtkWidget is the storage type for widgets */ GtkWidget *window; GtkWidget *button; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect (window, "delete-event", G_CALLBACK (gtk_main_quit), NULL); g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); button = gtk_drawing_area_new(); g_signal_connect (G_OBJECT (button), "expose_event", G_CALLBACK (expose_event_callback), NULL); gtk_container_add (GTK_CONTAINER (window), button); gtk_widget_show (button); gtk_widget_show (window); gtk_main (); return 0; }