#include #include #include /* compile with * gcc -o inputshapedemo `pkg-config --libs --cflags gtk+-3.0` inputshapedemo.c */ static void screen_changed (GtkWidget *widget, GdkScreen *old_screen, gpointer user_data); static gboolean draw (GtkWidget *widget, cairo_t *cr, gpointer user_data); #define LATE_INPUT_SHAPE static void screen_changed (GtkWidget *widget, GdkScreen *old_screen, gpointer userdata) { GdkScreen *screen = gtk_widget_get_screen(widget); GdkVisual *visual = gdk_screen_get_rgba_visual(screen); if (visual) { gtk_widget_set_visual (widget, visual); } else { g_printerr ("Your screen does not support alpha channels!\n"); exit (-1); } } static gboolean draw (GtkWidget *widget, cairo_t *cr, gpointer userdata) { gint width, height; #ifdef LATE_INPUT_SHAPE static gboolean have_input_shape = FALSE; if (!have_input_shape) { cairo_rectangle_int_t rect = { 0, 0, 0, 0 }; cairo_region_t *reg = cairo_region_create_rectangle (&rect); gtk_widget_input_shape_combine_region (widget, reg); cairo_region_destroy (reg); have_input_shape = TRUE; } #endif cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0); /* transparent */ 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.5); cairo_arc (cr, width / 2, height / 2, MIN (width, height) / 2 - 8 , 0, 2 * 3.14); cairo_fill(cr); return FALSE; } int main (int argc, char *argv[]) { GtkWindow *window; gtk_init (&argc, &argv); window = GTK_WINDOW (gtk_window_new (GTK_WINDOW_TOPLEVEL)); gtk_window_set_title (window, "Alpha Demo"); gtk_window_resize (window, 300, 300); gtk_window_set_position (window, GTK_WIN_POS_CENTER); gtk_widget_set_app_paintable (GTK_WIDGET (window), TRUE); g_signal_connect (window, "delete-event", gtk_main_quit, NULL); g_signal_connect (window, "draw", G_CALLBACK (draw), NULL); g_signal_connect (window, "screen-changed", G_CALLBACK (screen_changed), NULL); gtk_window_set_decorated (window, FALSE); if (!gdk_display_supports_input_shapes (gdk_display_get_default ())) { g_printerr ("shapes are unsupported - aborting.\n"); exit (-1); } screen_changed (GTK_WIDGET (window), NULL, NULL); gtk_widget_realize (GTK_WIDGET (window)); #ifndef LATE_INPUT_SHAPE cairo_rectangle_int_t rect = { 0, 0, 0, 0 }; cairo_region_t *reg = cairo_region_create_rectangle (&rect); gtk_widget_input_shape_combine_region (GTK_WIDGET (window), reg); cairo_region_destroy (reg); #endif /* Run the program */ gtk_widget_show_all (GTK_WIDGET (window)); gtk_main (); return 0; }