<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -415,23 +415,22 @@ create_pixbuf_from_image (cairo_surface_t *image)
 					 (GdkPixbufDestroyNotify) g_free, NULL);
 }
 
-static GdkPixbuf *
-render_category_icon (GiggleViewFilePriv *priv,
-		      const char         *name)
+static void
+render_chunk_marker (cairo_t    *cr,
+		     const char *name,
+		     int         width,
+		     int         height,
+		     GdkColor   *color)
 {
 	double           r, g, b;
 	double           x0, y0, x1, y1;
-	int              width, height;
-	double           alpha = 0.4;
+	double           alpha = 0.5;
 	gboolean         start = FALSE;
 	gboolean         end = FALSE;
-	GdkPixbuf       *pixbuf;
 	cairo_pattern_t *gradient;
-	cairo_surface_t *image;
-	cairo_t         *canvas;
 
 	if (!g_str_has_prefix (name, &quot;giggle-chunk-&quot;))
-		return NULL;
+		return;
 
 	if (strstr (name, &quot;-selected&quot;))
 		alpha = 1.0;
@@ -440,55 +439,52 @@ render_category_icon (GiggleViewFilePriv *priv,
 	if (strstr (name, &quot;-end&quot;))
 		end = TRUE;
 
-	gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, &amp;width, &amp;height); //--height; /* FIXME */
-
-	image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
-	gradient = cairo_pattern_create_linear (0, 0, 0, height - 1);
-	canvas = cairo_create (image);
-
 	x0 = 2;
 	y0 = 0;
 	x1 = width - 3;
 	y1 = height - 1;
 
-	r = priv-&gt;source_view-&gt;style-&gt;base[GTK_STATE_SELECTED].red   / 65535.0;
-	g = priv-&gt;source_view-&gt;style-&gt;base[GTK_STATE_SELECTED].green / 65535.0;
-	b = priv-&gt;source_view-&gt;style-&gt;base[GTK_STATE_SELECTED].blue  / 65535.0;
+	r = color-&gt;red   / 65535.0;
+	g = color-&gt;green / 65535.0;
+	b = color-&gt;blue  / 65535.0;
+
+	gradient = cairo_pattern_create_linear (0, 0, 0, height);
 
 	if (start) {
-		cairo_pattern_add_color_stop_rgba (gradient, 0.0, r, g, b, 0.00 * alpha);
-		cairo_pattern_add_color_stop_rgba (gradient, 0.1, r, g, b, 0.15 * alpha);
-		cairo_pattern_add_color_stop_rgba (gradient, 0.4, r, g, b, 0.45 * alpha);
-
-		cairo_move_to  (canvas, x0,     y0 + 9);
-		cairo_curve_to (canvas, x0,     y0 + 1, x0, y0 + 1, x0 + 8, y0 + 1);
-		cairo_line_to  (canvas, x1 - 8, y0 + 1);
-		cairo_curve_to (canvas, x1,     y0 + 1, x1, y0 + 1, x1,     y0 + 9);
+		cairo_pattern_add_color_stop_rgba (gradient, 0.0, r, g, b, 0.0 * alpha);
+		cairo_pattern_add_color_stop_rgba (gradient, 0.1, r, g, b, 0.3 * alpha);
+		cairo_pattern_add_color_stop_rgba (gradient, 0.4, r, g, b, 0.8 * alpha);
+
+		cairo_move_to  (cr, x0,     y0 + 9);
+		cairo_curve_to (cr, x0,     y0 + 1, x0, y0 + 1, x0 + 8, y0 + 1);
+		cairo_line_to  (cr, x1 - 8, y0 + 1);
+		cairo_curve_to (cr, x1,     y0 + 1, x1, y0 + 1, x1,     y0 + 9);
 	} else {
-		cairo_pattern_add_color_stop_rgba (gradient, 0.0, r, g, b, 0.30 * alpha);
+		cairo_pattern_add_color_stop_rgba (gradient, 0.0, r, g, b, 0.6 * alpha);
 
-		cairo_move_to (canvas, x0, y0);
-		cairo_line_to (canvas, x1, y0);
+		cairo_move_to (cr, x0, y0);
+		cairo_line_to (cr, x1, y0);
 	}
 
 	if (end) {
-		cairo_pattern_add_color_stop_rgba (gradient, 1.0, r, g, b, 0.00 * alpha);
-		cairo_pattern_add_color_stop_rgba (gradient, 0.9, r, g, b, 0.15 * alpha);
-		cairo_pattern_add_color_stop_rgba (gradient, 0.6, r, g, b, 0.30 * alpha);
-
-		cairo_line_to  (canvas, x1,     y1 - 9);
-		cairo_curve_to (canvas, x1,     y1 - 1, x1, y1 - 1, x1 - 8, y1 - 1);
-		cairo_line_to  (canvas, x0 + 8, y1 - 1);
-		cairo_curve_to (canvas, x0,     y1 - 1, x0, y1 - 1, x0,     y1 - 9);
+		cairo_pattern_add_color_stop_rgba (gradient, 1.0, r, g, b, 0.0 * alpha);
+		cairo_pattern_add_color_stop_rgba (gradient, 0.9, r, g, b, 0.3 * alpha);
+		cairo_pattern_add_color_stop_rgba (gradient, 0.6, r, g, b, 0.6 * alpha);
+
+		cairo_line_to  (cr, x1,     y1 - 9);
+		cairo_curve_to (cr, x1,     y1 - 1, x1, y1 - 1, x1 - 8, y1 - 1);
+		cairo_line_to  (cr, x0 + 8, y1 - 1);
+		cairo_curve_to (cr, x0,     y1 - 1, x0, y1 - 1, x0,     y1 - 9);
 	} else {
-		cairo_pattern_add_color_stop_rgba (gradient, 1.0, r, g, b, 0.30 * alpha);
+		cairo_pattern_add_color_stop_rgba (gradient, 1.0, r, g, b, 0.6 * alpha);
 
-		cairo_line_to (canvas, x1, y1);
-		cairo_line_to (canvas, x0, y1);
+		cairo_line_to (cr, x1, y1 + 1);
+		cairo_line_to (cr, x0, y1 + 1);
 	}
 
-	cairo_set_source (canvas, gradient);
-	cairo_fill (canvas);
+	cairo_set_source (cr, gradient);
+	cairo_pattern_destroy (gradient);
+	cairo_fill (cr);
 
 	x0 += 0.5;
 	y0 += 0.5;
@@ -497,39 +493,54 @@ render_category_icon (GiggleViewFilePriv *priv,
 
 	if (start) {
 		if (end) {
-			cairo_move_to  (canvas, x0, y0 + 9);
+			cairo_move_to  (cr, x0, y0 + 9);
 		} else {
-			cairo_move_to  (canvas, x0, y1);
-			cairo_line_to  (canvas, x0, y0 + 8);
+			cairo_move_to  (cr, x0, y1);
+			cairo_line_to  (cr, x0, y0 + 8);
 		}
 
-		cairo_curve_to (canvas, x0,     y0 + 1, x0, y0 + 1, x0 + 8, y0 + 1);
-		cairo_line_to  (canvas, x1 - 8, y0 + 1);
-		cairo_curve_to (canvas, x1,     y0 + 1, x1, y0 + 1, x1,     y0 + 9);
+		cairo_curve_to (cr, x0,     y0 + 1, x0, y0 + 1, x0 + 8, y0 + 1);
+		cairo_line_to  (cr, x1 - 8, y0 + 1);
+		cairo_curve_to (cr, x1,     y0 + 1, x1, y0 + 1, x1,     y0 + 9);
 	} else {
-		cairo_move_to (canvas, x1, y0);
+		cairo_move_to (cr, x1, y0);
 	}
 
 	if (end) {
-		cairo_line_to  (canvas, x1,     y1 - 9);
-		cairo_curve_to (canvas, x1,     y1 - 1, x1, y1 - 1, x1 - 8, y1 - 1);
-		cairo_line_to  (canvas, x0 + 8, y1 - 1);
-		cairo_curve_to (canvas, x0,     y1 - 1, x0, y1 - 1, x0,     y1 - 9);
+		cairo_line_to  (cr, x1,     y1 - 9);
+		cairo_curve_to (cr, x1,     y1 - 1, x1, y1 - 1, x1 - 8, y1 - 1);
+		cairo_line_to  (cr, x0 + 8, y1 - 1);
+		cairo_curve_to (cr, x0,     y1 - 1, x0, y1 - 1, x0,     y1 - 9);
 	} else {
-		cairo_line_to (canvas, x1, y1 + 1);
-		cairo_move_to (canvas, x0, y1);
+		cairo_line_to (cr, x1, y1 + 1);
+		cairo_move_to (cr, x0, y1);
 	}
 
 	if (!start)
-		cairo_line_to (canvas, x0, y0);
+		cairo_line_to (cr, x0, y0);
 
-	cairo_set_line_width (canvas, 1);
-	cairo_set_source_rgba (canvas, r, g, b, 0.9 * alpha);
-	cairo_stroke (canvas);
+	cairo_set_line_width (cr, 1);
+	cairo_set_source_rgba (cr, r, g, b, alpha);
+	cairo_stroke (cr);
+}
 
+static GdkPixbuf *
+create_category_icon (GiggleViewFilePriv *priv,
+		      const char         *name)
+{
+	int              width, height;
+	GdkColor        *color;
+	GdkPixbuf       *pixbuf;
+	cairo_surface_t *image;
+	cairo_t         *canvas;
+
+	gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, &amp;width, &amp;height);
+	image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
+
+	canvas = cairo_create (image);
+	color = &amp;priv-&gt;source_view-&gt;style-&gt;base[GTK_STATE_SELECTED];
 	pixbuf = create_pixbuf_from_image (image);
 
-	cairo_pattern_destroy (gradient);
 	cairo_surface_destroy (image);
 	cairo_destroy (canvas);
 
@@ -546,7 +557,7 @@ create_category (GiggleViewFilePriv *priv,
 					 GTK_ICON_SIZE_MENU, NULL);
 
 	if (!pixbuf)
-		pixbuf = render_category_icon (priv, name);
+		pixbuf = create_category_icon (priv, name);
 	
 	if (pixbuf) {
 		gtk_source_view_set_mark_category_pixbuf
@@ -558,13 +569,11 @@ create_category (GiggleViewFilePriv *priv,
 }
 
 static void
-view_file_style_set (GtkWidget *widget,
-		     GtkStyle  *prev)
+source_view_style_set_cb (GtkWidget      *widget,
+			  GtkStyle       *prev,
+			  GiggleViewFile *view)
 {
-	GiggleViewFilePriv *priv = GET_PRIV (widget);
-
-	if (GTK_WIDGET_CLASS (giggle_view_file_parent_class)-&gt;style_set)
-		GTK_WIDGET_CLASS (giggle_view_file_parent_class)-&gt;style_set (widget, prev);
+	GiggleViewFilePriv *priv = GET_PRIV (view);
 
 	create_category (priv, &quot;giggle-chunk-start&quot;);
 	create_category (priv, &quot;giggle-chunk-start-end&quot;);
@@ -577,11 +586,76 @@ view_file_style_set (GtkWidget *widget,
 	create_category (priv, &quot;giggle-chunk-selected-end&quot;);
 }
 
+static gboolean
+source_view_expose_event_cb (GtkTextView    *text_view,
+			     GdkEventExpose *event,
+			     GiggleViewFile *view)
+{
+	GiggleViewFilePriv *priv = GET_PRIV (view);
+	GtkSourceBuffer    *buffer;
+	GdkRectangle        visible_rect;
+	int                 y, height;
+	int                 margin_width;
+	GdkWindow          *left_margin;
+	GSList             *markers;
+	const char         *name;
+	GdkColor           *color;
+	GtkTextIter         iter;
+	cairo_t            *cr;
+
+	left_margin = gtk_text_view_get_window (text_view, GTK_TEXT_WINDOW_LEFT);
+
+	if (left_margin != event-&gt;window)
+		return FALSE;
+
+	buffer = GTK_SOURCE_BUFFER (gtk_text_view_get_buffer (text_view));
+	color = &amp;priv-&gt;source_view-&gt;style-&gt;base[GTK_STATE_SELECTED];
+
+	cr = gdk_cairo_create (event-&gt;window);
+	gdk_cairo_region (cr, event-&gt;region);
+	cairo_clip (cr);
+
+	gtk_text_view_get_visible_rect (text_view, &amp;visible_rect);
+	gtk_text_view_get_iter_at_location (text_view, &amp;iter, visible_rect.x, visible_rect.y);
+	visible_rect.y += visible_rect.height;
+
+	gdk_drawable_get_size (left_margin, &amp;margin_width, NULL);
+	cairo_translate (cr, margin_width - 16, 0); /* FIXME: see GB#572785 */
+
+	do {
+		gtk_text_view_get_line_yrange (text_view, &amp;iter, &amp;y, &amp;height);
+
+		if (y &gt;= visible_rect.y)
+			break;
+
+		markers = gtk_source_buffer_get_source_marks_at_iter (buffer, &amp;iter, NULL);
+
+		for (name = NULL; markers; name = NULL) {
+			name = gtk_source_mark_get_category (markers-&gt;data);
+
+			if (name &amp;&amp; g_str_has_prefix (name, &quot;giggle-chunk-&quot;))
+				break;
+
+			markers = g_slist_delete_link (markers, markers);
+		}
+
+		if (name) /* FIXME: see GB#572785 */
+			render_chunk_marker (cr, name, 16, height, color);
+
+		g_slist_free (markers);
+
+		cairo_translate (cr, 0, height);
+	} while (gtk_text_iter_forward_line (&amp;iter));
+
+	cairo_destroy (cr);
+
+	return FALSE;
+}
+
 static void
 giggle_view_file_class_init (GiggleViewFileClass *class)
 {
 	GObjectClass    *object_class = G_OBJECT_CLASS (class);
-	GtkWidgetClass  *widget_class = GTK_WIDGET_CLASS (class);
 	GiggleViewClass *view_class   = GIGGLE_VIEW_CLASS (class);
 
 	object_class-&gt;get_property = view_file_get_property;
@@ -589,8 +663,6 @@ giggle_view_file_class_init (GiggleViewFileClass *class)
 	object_class-&gt;finalize     = view_file_finalize;
 	object_class-&gt;dispose      = view_file_dispose;
 
-	widget_class-&gt;style_set    = view_file_style_set;
-
 	view_class-&gt;add_ui         = view_file_add_ui;
 	view_class-&gt;remove_ui      = view_file_remove_ui;
 
@@ -1440,6 +1512,10 @@ giggle_view_file_init (GiggleViewFile *view)
 
 	g_signal_connect (priv-&gt;source_view, &quot;query-tooltip&quot;,
 			  G_CALLBACK (source_view_query_tooltip_cb), view);
+	g_signal_connect (priv-&gt;source_view, &quot;style-set&quot;,
+			  G_CALLBACK (source_view_style_set_cb), view);
+	g_signal_connect (priv-&gt;source_view, &quot;expose-event&quot;,
+			  G_CALLBACK (source_view_expose_event_cb), view);
 
 	monospaced = pango_font_description_from_string (&quot;Mono&quot;);
 	gtk_widget_modify_font (priv-&gt;source_view, monospaced);</diff>
      <filename>src/giggle-view-file.c</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>61d02cfcf5ef6e2ad108fbe7714fdb2d076f9f99</id>
    </parent>
  </parents>
  <author>
    <name>Mathias Hasselmann</name>
    <email>hasselmm@gnome.org</email>
  </author>
  <url>http://github.com/hasselmm/giggle/commit/790f54ed3705b70869f91da7fe3ad120f5bbcb42</url>
  <id>790f54ed3705b70869f91da7fe3ad120f5bbcb42</id>
  <committed-date>2009-03-03T13:39:33-08:00</committed-date>
  <authored-date>2009-03-03T13:39:33-08:00</authored-date>
  <message>Improve rendering of annotation markers; Fixes: GB#572666

Signed-off-by: Mathias Hasselmann &lt;hasselmm@gnome.org&gt;</message>
  <tree>98f1125cb3dd0486c508e3b3ad1c374aa663ca90</tree>
  <committer>
    <name>Mathias Hasselmann</name>
    <email>hasselmm@gnome.org</email>
  </committer>
</commit>
