#include static gboolean on_alpha_window_expose (GtkWidget *widget, GdkEventExpose *expose) { cairo_pattern_t *pt; cairo_t *cr = gdk_cairo_create (widget->window); cairo_set_line_width (cr, 1); cairo_rectangle (cr, 10.5, 10, 20, 20); pt = cairo_pattern_create_linear (10, 10, 10, 20); cairo_pattern_add_color_stop_rgb (pt, 0, 1, 0, 0); cairo_pattern_add_color_stop_rgb (pt, 1, 0, 1, 0); cairo_set_source (cr, pt); cairo_fill (cr); cairo_pattern_destroy (pt); cairo_destroy (cr); return FALSE; } static void on_alpha_screen_changed (GtkWidget *widget, GdkScreen *old_screen, GtkWidget *label) { GdkScreen *screen = gtk_widget_get_screen (widget); GdkColormap *colormap = gdk_screen_get_rgba_colormap (screen); if (!colormap) { colormap = gdk_screen_get_rgb_colormap (screen); printf("screen does NOT support alpha\n"); } else { printf("screen supports alpha!\n"); } gtk_widget_set_colormap (widget, colormap); } int main(int argc, char **argv) { GtkWidget *window; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER_ALWAYS); gtk_widget_set_app_paintable (window, TRUE); gtk_widget_set_size_request (window, 100, 100); on_alpha_screen_changed (window, NULL, NULL); g_signal_connect (window, "screen-changed", G_CALLBACK (on_alpha_screen_changed), NULL); g_signal_connect (window, "expose-event", G_CALLBACK (on_alpha_window_expose), NULL); if (!GTK_WIDGET_VISIBLE (window)) gtk_widget_show_all (window); gtk_main (); return 0; }