1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| #include <gtk/gtk.h>
#include <gdk/gdkscreen.h>
#include <cairo.h>
gboolean supports_alpha = FALSE;
static void screen_changed (GtkWidget *widget, GdkScreen *old_screen,
gpointer userdata)
{
GdkScreen *screen = NULL;
GdkColormap *colormap = NULL;
screen = gtk_widget_get_screen (widget);
colormap = gdk_screen_get_rgba_colormap (screen);
if (colormap == NULL)
{
g_message ("Your screen does not support alpha channels!\n");
colormap = gdk_screen_get_rgb_colormap(screen);
supports_alpha = FALSE;
}
else
{
g_message ("Your screen supports alpha channels!\n");
supports_alpha = TRUE;
}
gtk_widget_set_colormap (widget, colormap);
}
static gboolean expose (GtkWidget *widget, GdkEventExpose *event,
gpointer userdata)
{
gint width;
gint height;
cairo_t *cr = NULL;
cr = gdk_cairo_create(widget->window);
if (supports_alpha)
{
cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0);
}
else
{
cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
}
cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
cairo_paint (cr);
gtk_window_get_size (GTK_WINDOW (widget), &width, &height);
cairo_set_source_rgba (cr, 1, 0.2, 0.2, 0.6);
cairo_arc (cr, width / 2, height / 2,
(width < height ? width : height) / 2 - 8 , 0, 2 * 3.14);
cairo_fill (cr);
cairo_stroke (cr);
cairo_destroy (cr);
return FALSE;
}
int main (int argc, char **argv)
{
GtkWidget *window = NULL;
gtk_init(&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW(window), "Alpha Demo");
g_signal_connect (G_OBJECT(window), "delete-event", gtk_main_quit, NULL);
gtk_widget_set_app_paintable (window, TRUE);
g_signal_connect (G_OBJECT (window), "expose-event", G_CALLBACK (expose),
NULL);
g_signal_connect (G_OBJECT (window), "screen-changed",
G_CALLBACK (screen_changed), NULL);
screen_changed (window, NULL, NULL);
gtk_widget_show_all (window);
gtk_main();
return 0;
} |
Partager