diff --git a/src/display/display.c b/src/display/display.c index 0da45b6..0ff032f 100644 --- a/src/display/display.c +++ b/src/display/display.c @@ -150,8 +150,18 @@ void make_backing_image() { * Copy the backing image onto the window. */ void update_window() { if (backing_image) { - cairo_t *cr = gdk_cairo_create(drawable); + cairo_region_t *cairoRegion = cairo_region_create(); + + /* the pointer to GdkWindow hold in global variable `drawable` */ + GdkDrawingContext *drawingContext = gdk_window_begin_draw_frame (drawable, cairoRegion); + + { + /* say: "I want to start drawing" */ + cairo_t *cr = gdk_drawing_context_get_cairo_context (drawingContext); + + { + /* do actual drawing here */ cairo_set_source_rgb(cr, 0.0, 0.0, 1.0); cairo_rectangle(cr, 0.0, 0.0, width, height); cairo_fill(cr); @@ -165,8 +175,14 @@ void update_window() { cairo_set_source_surface(cr, pSurface, 0.0, 0.0); cairo_paint(cr); + } + + /* say: "I'm finished drawing */ + gdk_window_end_draw_frame(drawable,drawingContext); + } - cairo_destroy(cr); + /* clean up */ + cairo_region_destroy(cairoRegion); } } @@ -318,25 +334,49 @@ void button_release_event(GtkWidget *widget, GdkEventButton *event) { struct imgrect *ir; ir = find_image_rectangle(click.x, click.y); if (ir && ir == find_image_rectangle((int)event->x, (int)event->y)) { + + // "convert" the G*t*kWidget to G*d*kWindow (no, it's not a GtkWindow!) + GdkWindow* window = gtk_widget_get_window(widget); + + cairo_region_t *cairoRegion = cairo_region_create(); + + GdkDrawingContext *drawingContext = gdk_window_begin_draw_frame (window,cairoRegion); + + { + /* say: "I want to start drawing" */ + cairo_t *cr = gdk_drawing_context_get_cairo_context (drawingContext); + + { /* We draw a little frame around the image while we're saving it, to * give some visual feedback. */ - cairo_t *cr = gdk_cairo_create(drawable); - cairo_set_line_width (cr, 1.0); cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); cairo_rectangle(cr, ir->x, ir->y, ir->w+3, ir->h + 3); cairo_stroke(cr); + } + + /* say: "I'm finished drawing */ + gdk_window_end_draw_frame(window, drawingContext); - gdk_flush(); /* force X to actually draw the damn thing. */ save_image(ir); xnanosleep(100000000); + /* say: "I want to start drawing" one more time */ + cr = gdk_drawing_context_get_cairo_context (drawingContext); + + { + /* Draw more ... */ cairo_set_line_width (cr, 1.0); cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); cairo_rectangle(cr, ir->x, ir->y, ir->w+3, ir->h + 3); cairo_stroke(cr); + } + + /* say: "I'm finished drawing one more time */ + gdk_window_end_draw_frame(window, drawingContext); + } - cairo_destroy(cr); + cairo_region_destroy(cairoRegion); } }