diff --git a/gtk/gtktextdisplay.c b/gtk/gtktextdisplay.c index 863cb3c41b..db88dcab82 100644 --- a/gtk/gtktextdisplay.c +++ b/gtk/gtktextdisplay.c @@ -108,6 +108,7 @@ struct _GtkTextRenderer cairo_t *cr; GdkRGBA *error_color; /* Error underline color for this widget */ + GList *widgets; /* widgets encountered when drawing */ GdkRGBA rgba[4]; guint8 rgba_set[4]; @@ -422,7 +423,12 @@ gtk_text_renderer_draw_shape (PangoRenderer *renderer, } else if (GTK_IS_WIDGET (attr->data)) { - /* nothing to do */ + GtkWidget *widget; + + widget = GTK_WIDGET (attr->data); + + text_renderer->widgets = g_list_prepend (text_renderer->widgets, + g_object_ref (widget)); } else g_assert_not_reached (); /* not a pixbuf or widget */ @@ -491,10 +497,11 @@ text_renderer_begin (GtkTextRenderer *text_renderer, /* Returns a GSList of (referenced) widgets encountered while drawing. */ -static void +static GList * text_renderer_end (GtkTextRenderer *text_renderer) { GtkStyleContext *context; + GList *widgets = text_renderer->widgets; cairo_restore (text_renderer->cr); @@ -505,11 +512,15 @@ text_renderer_end (GtkTextRenderer *text_renderer) text_renderer->widget = NULL; text_renderer->cr = NULL; + text_renderer->widgets = NULL; + if (text_renderer->error_color) { gdk_rgba_free (text_renderer->error_color); text_renderer->error_color = NULL; } + + return widgets; } static cairo_region_t * @@ -805,7 +816,8 @@ get_text_renderer (void) void gtk_text_layout_draw (GtkTextLayout *layout, GtkWidget *widget, - cairo_t *cr) + cairo_t *cr, + GList **widgets) { GtkStyleContext *context; gint offset_y; @@ -814,6 +826,7 @@ gtk_text_layout_draw (GtkTextLayout *layout, gboolean have_selection; GSList *line_list; GSList *tmp_list; + GList *tmp_widgets; GdkRectangle clip; g_return_if_fail (GTK_IS_TEXT_LAYOUT (layout)); @@ -918,7 +931,11 @@ gtk_text_layout_draw (GtkTextLayout *layout, gtk_text_layout_wrap_loop_end (layout); - text_renderer_end (text_renderer); + tmp_widgets = text_renderer_end (text_renderer); + if (widgets) + *widgets = tmp_widgets; + else + g_list_free_full (tmp_widgets, g_object_unref); g_slist_free (line_list); } diff --git a/gtk/gtktextdisplay.h b/gtk/gtktextdisplay.h index c35b133567..3f130b4ba9 100644 --- a/gtk/gtktextdisplay.h +++ b/gtk/gtktextdisplay.h @@ -92,7 +92,8 @@ G_BEGIN_DECLS */ void gtk_text_layout_draw (GtkTextLayout *layout, GtkWidget *widget, - cairo_t *cr); + cairo_t *cr, + GList **widgets); G_END_DECLS diff --git a/gtk/gtktextutil.c b/gtk/gtktextutil.c index f5eae4c6ec..d5a60c492b 100644 --- a/gtk/gtktextutil.c +++ b/gtk/gtktextutil.c @@ -398,7 +398,7 @@ _gtk_text_util_create_rich_drag_icon (GtkWidget *widget, cairo_save (cr); cairo_translate (cr, 1 + DRAG_ICON_LAYOUT_BORDER, 1 + DRAG_ICON_LAYOUT_BORDER); - gtk_text_layout_draw (layout, widget, cr); + gtk_text_layout_draw (layout, widget, cr, NULL); cairo_restore (cr); diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c index c61d0fb130..53e1004d4c 100644 --- a/gtk/gtktextview.c +++ b/gtk/gtktextview.c @@ -4836,7 +4836,8 @@ gtk_text_view_paint (GtkWidget *widget, gtk_text_layout_draw (priv->layout, widget, - cr); + cr, + NULL); cairo_restore (cr); }