X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtktextdisplay.c;h=24cc0ec6b4850970c08c3b46f341184232b7b328;hb=d97861bd8b338c3d25d7ffb5496edee9eee9bfbb;hp=863cb3c41bece0b8dacffe69f9c93483b0b9aa2f;hpb=df37446f9b4116887865b7ecfddeb535fbc0eacb;p=~andy%2Fgtk diff --git a/gtk/gtktextdisplay.c b/gtk/gtktextdisplay.c index 863cb3c41..24cc0ec6b 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]; @@ -120,6 +121,8 @@ struct _GtkTextRendererClass PangoRendererClass parent_class; }; +GType _gtk_text_renderer_get_type (void); + G_DEFINE_TYPE (GtkTextRenderer, _gtk_text_renderer, PANGO_TYPE_RENDERER) static void @@ -422,7 +425,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 +499,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 +514,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 +818,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 +828,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 +933,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); }