#include #include #include /* compile with * gcc -Wall -g -o cairotest `pkg-config --libs --cflags cairo gtk+-2.0` cairotest.c */ void draw (GtkWidget *darea) { GtkAllocation *alloc; gdouble scaling; cairo_t *cr; gdouble dx = 1.0, dy = 1.0; cr = gdk_cairo_create (darea->window); alloc = &darea->allocation; scaling = MIN (alloc->width, alloc->height) / 2.2; #if 0 cairo_new_path (cr); cairo_rectangle (cr, 0, 0, alloc->width, alloc->height); cairo_clip (cr); cairo_stroke (cr); #endif cairo_translate (cr, alloc->width / 2, alloc->height / 2); cairo_scale (cr, scaling, -scaling); cairo_device_to_user_distance (cr, &dx, &dy); cairo_set_line_width (cr, MAX (dx, dy)); cairo_set_source_rgba (cr, 1.0, 0.0, 0.0, 1.0); /* this goes across the origin in the center of the window */ cairo_new_path (cr); cairo_move_to (cr, -1000.0, -1000.0); cairo_line_to (cr, 1000.0, 1000.0); cairo_stroke (cr); /* this is a unit-box around the center of the window */ cairo_set_source_rgba (cr, 0.0, 0.0, 1.0, 1.0); cairo_new_path (cr); cairo_rectangle (cr, -1, -1, 2, 2); cairo_stroke (cr); cairo_destroy (cr); } gboolean expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer *data) { GtkWidget *darea = GTK_WIDGET (data); draw (darea); return FALSE; } void create_window (void) { GtkWidget *window, *darea; window = g_object_new (GTK_TYPE_WINDOW, "title", "Test", "default-width", 800, "default-height", 600, "visible", TRUE, NULL); g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); darea = g_object_new (GTK_TYPE_DRAWING_AREA, "width-request", 100, "height-request", 100, "visible", TRUE, "parent", window, NULL); g_object_connect (G_OBJECT (darea), "signal::expose-event", G_CALLBACK (expose_event), darea, NULL); } gint main (gint argc, char *argv[]) { gtk_init (&argc, &argv); create_window (); gtk_main (); return 0; }