]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtktextdisplay.c
GtkTextView: don't popdown a bubble if we don't have one
[~andy/gtk] / gtk / gtktextdisplay.c
index 863cb3c41bece0b8dacffe69f9c93483b0b9aa2f..24cc0ec6b4850970c08c3b46f341184232b7b328 100644 (file)
@@ -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);
 }