Revert part of "textview: Remove extra magic for drawing children"

This partially reverts commit df37446f9b.
The commit changed API that was public (or at least semi-public) and
it's not worth changing that.

The original bug should still be fixed.

https://bugzilla.gnome.org/show_bug.cgi?id=673839
This commit is contained in:
Benjamin Otte
2012-04-10 16:14:59 +02:00
parent 8b5910f8d7
commit 3610ef90c3
4 changed files with 26 additions and 7 deletions

View File

@ -108,6 +108,7 @@ struct _GtkTextRenderer
cairo_t *cr; cairo_t *cr;
GdkRGBA *error_color; /* Error underline color for this widget */ GdkRGBA *error_color; /* Error underline color for this widget */
GList *widgets; /* widgets encountered when drawing */
GdkRGBA rgba[4]; GdkRGBA rgba[4];
guint8 rgba_set[4]; guint8 rgba_set[4];
@ -422,7 +423,12 @@ gtk_text_renderer_draw_shape (PangoRenderer *renderer,
} }
else if (GTK_IS_WIDGET (attr->data)) 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 else
g_assert_not_reached (); /* not a pixbuf or widget */ 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. /* Returns a GSList of (referenced) widgets encountered while drawing.
*/ */
static void static GList *
text_renderer_end (GtkTextRenderer *text_renderer) text_renderer_end (GtkTextRenderer *text_renderer)
{ {
GtkStyleContext *context; GtkStyleContext *context;
GList *widgets = text_renderer->widgets;
cairo_restore (text_renderer->cr); cairo_restore (text_renderer->cr);
@ -505,11 +512,15 @@ text_renderer_end (GtkTextRenderer *text_renderer)
text_renderer->widget = NULL; text_renderer->widget = NULL;
text_renderer->cr = NULL; text_renderer->cr = NULL;
text_renderer->widgets = NULL;
if (text_renderer->error_color) if (text_renderer->error_color)
{ {
gdk_rgba_free (text_renderer->error_color); gdk_rgba_free (text_renderer->error_color);
text_renderer->error_color = NULL; text_renderer->error_color = NULL;
} }
return widgets;
} }
static cairo_region_t * static cairo_region_t *
@ -805,7 +816,8 @@ get_text_renderer (void)
void void
gtk_text_layout_draw (GtkTextLayout *layout, gtk_text_layout_draw (GtkTextLayout *layout,
GtkWidget *widget, GtkWidget *widget,
cairo_t *cr) cairo_t *cr,
GList **widgets)
{ {
GtkStyleContext *context; GtkStyleContext *context;
gint offset_y; gint offset_y;
@ -814,6 +826,7 @@ gtk_text_layout_draw (GtkTextLayout *layout,
gboolean have_selection; gboolean have_selection;
GSList *line_list; GSList *line_list;
GSList *tmp_list; GSList *tmp_list;
GList *tmp_widgets;
GdkRectangle clip; GdkRectangle clip;
g_return_if_fail (GTK_IS_TEXT_LAYOUT (layout)); 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); 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); g_slist_free (line_list);
} }

View File

@ -92,7 +92,8 @@ G_BEGIN_DECLS
*/ */
void gtk_text_layout_draw (GtkTextLayout *layout, void gtk_text_layout_draw (GtkTextLayout *layout,
GtkWidget *widget, GtkWidget *widget,
cairo_t *cr); cairo_t *cr,
GList **widgets);
G_END_DECLS G_END_DECLS

View File

@ -398,7 +398,7 @@ _gtk_text_util_create_rich_drag_icon (GtkWidget *widget,
cairo_save (cr); cairo_save (cr);
cairo_translate (cr, 1 + DRAG_ICON_LAYOUT_BORDER, 1 + DRAG_ICON_LAYOUT_BORDER); 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); cairo_restore (cr);

View File

@ -4836,7 +4836,8 @@ gtk_text_view_paint (GtkWidget *widget,
gtk_text_layout_draw (priv->layout, gtk_text_layout_draw (priv->layout,
widget, widget,
cr); cr,
NULL);
cairo_restore (cr); cairo_restore (cr);
} }