textview: Remove extra magic for drawing children

Instead, just draw the children. The cairo code will keep track of
things, so there's no need to track things.
Also, the old code was doing it wrong.

https://bugzilla.gnome.org/show_bug.cgi?id=672544
This commit is contained in:
Benjamin Otte 2012-04-03 18:41:25 +02:00
parent 7a7e2ed92b
commit df37446f9b
4 changed files with 10 additions and 50 deletions

View File

@ -108,7 +108,6 @@ 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];
@ -423,12 +422,7 @@ gtk_text_renderer_draw_shape (PangoRenderer *renderer,
}
else if (GTK_IS_WIDGET (attr->data))
{
GtkWidget *widget;
widget = GTK_WIDGET (attr->data);
text_renderer->widgets = g_list_prepend (text_renderer->widgets,
g_object_ref (widget));
/* nothing to do */
}
else
g_assert_not_reached (); /* not a pixbuf or widget */
@ -497,11 +491,10 @@ text_renderer_begin (GtkTextRenderer *text_renderer,
/* Returns a GSList of (referenced) widgets encountered while drawing.
*/
static GList *
static void
text_renderer_end (GtkTextRenderer *text_renderer)
{
GtkStyleContext *context;
GList *widgets = text_renderer->widgets;
cairo_restore (text_renderer->cr);
@ -512,15 +505,11 @@ 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 *
@ -816,8 +805,7 @@ get_text_renderer (void)
void
gtk_text_layout_draw (GtkTextLayout *layout,
GtkWidget *widget,
cairo_t *cr,
GList **widgets)
cairo_t *cr)
{
GtkStyleContext *context;
gint offset_y;
@ -826,7 +814,6 @@ 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));
@ -931,11 +918,7 @@ gtk_text_layout_draw (GtkTextLayout *layout,
gtk_text_layout_wrap_loop_end (layout);
tmp_widgets = text_renderer_end (text_renderer);
if (widgets)
*widgets = tmp_widgets;
else
g_list_free_full (tmp_widgets, g_object_unref);
text_renderer_end (text_renderer);
g_slist_free (line_list);
}

View File

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

View File

@ -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, NULL);
gtk_text_layout_draw (layout, widget, cr);
cairo_restore (cr);

View File

@ -4804,8 +4804,6 @@ gtk_text_view_paint (GtkWidget *widget,
{
GtkTextView *text_view;
GtkTextViewPrivate *priv;
GList *child_exposes;
GList *tmp_list;
text_view = GTK_TEXT_VIEW (widget);
priv = text_view->priv;
@ -4833,33 +4831,14 @@ gtk_text_view_paint (GtkWidget *widget,
area->width, area->height);
#endif
child_exposes = NULL;
cairo_save (cr);
cairo_translate (cr, -priv->xoffset, -priv->yoffset);
gtk_text_layout_draw (priv->layout,
widget,
cr,
&child_exposes);
cr);
cairo_restore (cr);
tmp_list = child_exposes;
while (tmp_list != NULL)
{
GtkWidget *child = tmp_list->data;
gtk_container_propagate_draw (GTK_CONTAINER (text_view),
child,
cr);
g_object_unref (child);
tmp_list = tmp_list->next;
}
g_list_free (child_exposes);
}
static gboolean
@ -4894,10 +4873,9 @@ gtk_text_view_draw (GtkWidget *widget,
/* propagate_draw checks that event->window matches
* child->window
*/
if (!vc->anchor)
gtk_container_propagate_draw (GTK_CONTAINER (widget),
vc->widget,
cr);
gtk_container_propagate_draw (GTK_CONTAINER (widget),
vc->widget,
cr);
tmp_list = tmp_list->next;
}