Index: gdk/gdkpango.c
===================================================================
RCS file: /cvs/gnome/gtk+/gdk/gdkpango.c,v
retrieving revision 1.27
diff -u -r1.27 gdkpango.c
--- gdk/gdkpango.c	11 Sep 2003 22:09:37 -0000	1.27
+++ gdk/gdkpango.c	17 Nov 2003 10:43:36 -0000
@@ -186,6 +186,26 @@
 		     start_x, baseline_y + 1,
 		     end_x,   baseline_y + 1);
       break;
+    case PANGO_UNDERLINE_ERROR:
+      {
+        int point_x;
+        int counter = 0;
+
+        for (point_x = start_x;
+             point_x <= end_x;
+             point_x++)
+        {
+          if (counter < 2)
+            gdk_draw_point 
+             (drawable, gc, point_x, baseline_y + 1);
+          else
+            gdk_draw_point 
+             (drawable, gc, point_x, baseline_y + 2);
+
+          counter = (counter + 1) % 4;
+        }
+      }
+      break;
     case PANGO_UNDERLINE_LOW:
       gdk_draw_line (drawable, gc,
 		     start_x, low_y + 1,
Index: gtk/gtktextdisplay.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtktextdisplay.c,v
retrieving revision 1.42
diff -u -r1.42 gtktextdisplay.c
--- gtk/gtktextdisplay.c	4 Jun 2003 23:26:51 -0000	1.42
+++ gtk/gtktextdisplay.c	17 Nov 2003 10:43:37 -0000
@@ -92,6 +92,7 @@
   GtkTextAppearance *last_bg_appearance;
   GdkGC *fg_gc;
   GdkGC *bg_gc;
+  GdkGC *error_gc;
   GdkRectangle clip_rect;
 };
 
@@ -112,10 +113,21 @@
                            GdkRectangle *clip_rect)
 {
   GtkTextRenderState *state = g_new0 (GtkTextRenderState, 1);
+  GdkColor red_color;
 
   state->widget = widget;
   state->fg_gc = gdk_gc_new (drawable);
   state->bg_gc = gdk_gc_new (drawable);
+  state->error_gc = gdk_gc_new (drawable);
+
+  /* FIXME: here, it would be nice to cache the GC in the style.
+     See bug 73310 for what is needed to do that.  */
+
+  if (gdk_color_parse ("red", &red_color))
+  {
+    gdk_gc_set_rgb_fg_color (state->error_gc, &red_color);
+  } 
+  
   state->clip_rect = *clip_rect;
 
   return state;
@@ -126,6 +138,7 @@
 {
   g_object_unref (state->fg_gc);
   g_object_unref (state->bg_gc);
+  g_object_unref (state->error_gc);
 
   g_free (state);
 }
@@ -422,6 +435,27 @@
                          risen_y + 1,
                          x + (x_off + ink_rect.x + ink_rect.width) / PANGO_SCALE,
                          risen_y + 1);
+          break;
+        case PANGO_UNDERLINE_ERROR:
+          g_assert (need_ink);
+          {
+            int point_x;
+            int counter = 0;
+
+            for (point_x = x + (x_off + ink_rect.x) / PANGO_SCALE - 1;
+                 point_x <= x + (x_off + ink_rect.x + ink_rect.width) / PANGO_SCALE;
+                 point_x++)
+            {
+              if (counter < 2)
+                gdk_draw_point 
+                 (drawable, render_state->error_gc, point_x, risen_y + 1);
+              else
+                gdk_draw_point 
+                 (drawable, render_state->error_gc, point_x, risen_y + 2);
+
+              counter = (counter + 1) % 4;
+            }
+          }
           break;
         case PANGO_UNDERLINE_LOW:
           g_assert (need_ink);
Index: tests/testtext.c
===================================================================
RCS file: /cvs/gnome/gtk+/tests/testtext.c,v
retrieving revision 1.73
diff -u -r1.73 testtext.c
--- tests/testtext.c	26 Sep 2003 23:33:45 -0000	1.73
+++ tests/testtext.c	17 Nov 2003 10:43:39 -0000
@@ -493,6 +493,13 @@
                 "strikethrough", TRUE,
                 NULL);
 
+  tag = gtk_text_buffer_create_tag (buffer, "underline_error", NULL);
+
+  setup_tag (tag);
+      
+  g_object_set (tag,
+                "underline", PANGO_UNDERLINE_ERROR,
+                NULL);
 
   tag = gtk_text_buffer_create_tag (buffer, "underline", NULL);
 
@@ -579,6 +586,11 @@
       gtk_text_buffer_get_iter_at_line_offset (buffer, &iter2, 1, 16);
 
       gtk_text_buffer_apply_tag_by_name (buffer, "underline", &iter, &iter2);
+
+      gtk_text_buffer_get_iter_at_line_offset (buffer, &iter, 1, 4);
+      gtk_text_buffer_get_iter_at_line_offset (buffer, &iter2, 1, 7);
+
+      gtk_text_buffer_apply_tag_by_name (buffer, "underline_error", &iter, &iter2);
 
       gtk_text_buffer_get_iter_at_line_offset (buffer, &iter, 1, 14);
       gtk_text_buffer_get_iter_at_line_offset (buffer, &iter2, 1, 24);
