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.
This commit is contained in:
Matthias Clasen 2018-01-01 09:15:59 -05:00
parent 4d6fbdd19e
commit bb568a51d4

View File

@ -17,39 +17,44 @@ clear_surface (void)
} }
/* Create a new surface of the appropriate size to store our scribbles */ /* Create a new surface of the appropriate size to store our scribbles */
static gboolean static void
configure_event_cb (GtkWidget *widget, size_allocate_cb (GtkWidget *widget,
GdkEventConfigure *event, GtkAllocation *alloc,
gpointer data) int baseline,
GdkRectangle *clip,
gpointer data)
{ {
if (surface) if (surface)
cairo_surface_destroy (surface); {
cairo_surface_destroy (surface);
surface = NULL;
}
surface = gdk_window_create_similar_surface (gtk_widget_get_window (widget), if (gtk_widget_get_window (widget))
CAIRO_CONTENT_COLOR, {
gtk_widget_get_width (widget), surface = gdk_window_create_similar_surface (gtk_widget_get_window (widget),
gtk_widget_get_height (widget)); CAIRO_CONTENT_COLOR,
gtk_widget_get_width (widget),
gtk_widget_get_height (widget));
/* Initialize the surface to white */ /* Initialize the surface to white */
clear_surface (); clear_surface ();
}
/* We've handled the configure event, no need for further processing. */
return TRUE;
} }
/* Redraw the screen from the surface. Note that the ::draw /* Redraw the screen from the surface. Note that the ::draw
* signal receives a ready-to-be-used cairo_t that is already * signal receives a ready-to-be-used cairo_t that is already
* clipped to only draw the exposed areas of the widget * clipped to only draw the exposed areas of the widget
*/ */
static gboolean static void
draw_cb (GtkWidget *widget, draw_cb (GtkDrawingArea *drawing_area,
cairo_t *cr, cairo_t *cr,
gpointer data) int width,
int height,
gpointer data)
{ {
cairo_set_source_surface (cr, surface, 0, 0); cairo_set_source_surface (cr, surface, 0, 0);
cairo_paint (cr); cairo_paint (cr);
return FALSE;
} }
/* Draw a rectangle on the surface at the given position */ /* 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); gtk_container_add (GTK_CONTAINER (frame), drawing_area);
/* Signals used to handle the backing surface */ gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (drawing_area), draw_cb, NULL, NULL);
g_signal_connect (drawing_area, "draw",
G_CALLBACK (draw_cb), NULL); g_signal_connect_after (drawing_area, "size-allocate",
g_signal_connect (drawing_area,"configure-event", G_CALLBACK (size_allocate_cb), NULL);
G_CALLBACK (configure_event_cb), NULL);
/* Event signals */ /* Event signals */
g_signal_connect (drawing_area, "motion-notify-event", g_signal_connect (drawing_area, "motion-notify-event",