summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2018-01-01 09:15:59 -0500
committerMatthias Clasen <mclasen@redhat.com>2018-01-02 18:14:13 -0500
commitbb568a51d4108bb5eb12f0b6f58b09fdec13e05c (patch)
tree28d51513a85651faf1418774327315ce43c0b443 /examples
parent4d6fbdd19ea5752850cd696a67573fb5c18f3046 (diff)
downloadgtk+-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.c54
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",