diff options
author | Matthias Clasen <mclasen@redhat.com> | 2018-01-01 09:15:59 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2018-01-02 18:14:13 -0500 |
commit | bb568a51d4108bb5eb12f0b6f58b09fdec13e05c (patch) | |
tree | 28d51513a85651faf1418774327315ce43c0b443 /examples | |
parent | 4d6fbdd19ea5752850cd696a67573fb5c18f3046 (diff) | |
download | gtk+-bb568a51d4108bb5eb12f0b6f58b09fdec13e05c.tar.gz |
Make drawing example work again
Using ::configure-event and ::draw on a drawing area
doesn't work anymore. Use ::size-allocate and a
draw function instead.
Diffstat (limited to 'examples')
-rw-r--r-- | examples/drawing.c | 54 |
1 files changed, 29 insertions, 25 deletions
diff --git a/examples/drawing.c b/examples/drawing.c index 54d608ea37..8712bdf47d 100644 --- a/examples/drawing.c +++ b/examples/drawing.c @@ -17,39 +17,44 @@ clear_surface (void) } /* Create a new surface of the appropriate size to store our scribbles */ -static gboolean -configure_event_cb (GtkWidget *widget, - GdkEventConfigure *event, - gpointer data) +static void +size_allocate_cb (GtkWidget *widget, + GtkAllocation *alloc, + int baseline, + GdkRectangle *clip, + gpointer data) { if (surface) - cairo_surface_destroy (surface); - - surface = gdk_window_create_similar_surface (gtk_widget_get_window (widget), - CAIRO_CONTENT_COLOR, - gtk_widget_get_width (widget), - gtk_widget_get_height (widget)); + { + cairo_surface_destroy (surface); + surface = NULL; + } - /* Initialize the surface to white */ - clear_surface (); + if (gtk_widget_get_window (widget)) + { + surface = gdk_window_create_similar_surface (gtk_widget_get_window (widget), + CAIRO_CONTENT_COLOR, + gtk_widget_get_width (widget), + gtk_widget_get_height (widget)); - /* We've handled the configure event, no need for further processing. */ - return TRUE; + /* Initialize the surface to white */ + clear_surface (); + } } /* Redraw the screen from the surface. Note that the ::draw * signal receives a ready-to-be-used cairo_t that is already * clipped to only draw the exposed areas of the widget */ -static gboolean -draw_cb (GtkWidget *widget, - cairo_t *cr, - gpointer data) +static void +draw_cb (GtkDrawingArea *drawing_area, + cairo_t *cr, + int width, + int height, + gpointer data) { cairo_set_source_surface (cr, surface, 0, 0); cairo_paint (cr); - - return FALSE; } /* Draw a rectangle on the surface at the given position */ @@ -162,11 +167,10 @@ activate (GtkApplication *app, gtk_container_add (GTK_CONTAINER (frame), drawing_area); - /* Signals used to handle the backing surface */ - g_signal_connect (drawing_area, "draw", - G_CALLBACK (draw_cb), NULL); - g_signal_connect (drawing_area,"configure-event", - G_CALLBACK (configure_event_cb), NULL); + gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (drawing_area), draw_cb, NULL, NULL); + + g_signal_connect_after (drawing_area, "size-allocate", + G_CALLBACK (size_allocate_cb), NULL); /* Event signals */ g_signal_connect (drawing_area, "motion-notify-event", |