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];
PangoRendererClass parent_class;
};
+GType _gtk_text_renderer_get_type (void);
+
G_DEFINE_TYPE (GtkTextRenderer, _gtk_text_renderer, PANGO_TYPE_RENDERER)
static void
}
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 */
/* 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);
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 *
void
gtk_text_layout_draw (GtkTextLayout *layout,
GtkWidget *widget,
- cairo_t *cr)
+ cairo_t *cr,
+ GList **widgets)
{
GtkStyleContext *context;
gint offset_y;
gboolean have_selection;
GSList *line_list;
GSList *tmp_list;
+ GList *tmp_widgets;
GdkRectangle clip;
g_return_if_fail (GTK_IS_TEXT_LAYOUT (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);
}