Index: gnopernicus/srlow/libsrlow/SRLow.c
===================================================================
RCS file: /cvs/gnome/gnopernicus/srlow/libsrlow/SRLow.c,v
retrieving revision 1.104.2.9
diff -u -r1.104.2.9 SRLow.c
--- gnopernicus/srlow/libsrlow/SRLow.c	21 Jan 2005 08:01:42 -0000	1.104.2.9
+++ gnopernicus/srlow/libsrlow/SRLow.c	10 Feb 2005 11:13:11 -0000
@@ -172,6 +172,7 @@
     SRLEventType    type;
     Accessible	    *acc;
     AccessibleEvent *acc_ev;
+    gchar	    *line;
 }SRLEvent;
 
 typedef struct _SRLLastInfo
@@ -202,6 +203,7 @@
 Accessible 			*srl_last_edit		= NULL;
 
 extern gboolean sro_set_difference (SRObject *obj, gchar *difference);
+extern gboolean sro_set_line (SRObject *obj, gchar *line);
 extern gboolean sro_set_name (SRObject *obj, gchar *name);
 extern gboolean sro_get_from_accessible_event (Accessible *acc, gchar *reason, 
 						SRObject **obj);
@@ -514,7 +516,8 @@
     if (event->acc)
 	Accessible_unref (event->acc);
     if (event->acc_ev)
-    AccessibleEvent_unref (event->acc_ev);
+	AccessibleEvent_unref (event->acc_ev);
+    g_free (event->line);
     g_free (event);
 }
 
@@ -534,7 +537,8 @@
     }
     ev->acc_ev = event->acc_ev;
     AccessibleEvent_ref (ev->acc_ev);
-
+    if (event->line)
+	ev->line = g_strdup (event->line);
     return ev;
 }
 
@@ -1029,6 +1033,8 @@
 		sro_set_difference (obj, diff);
 	    SPI_freeString (diff);
 	}
+	if (srle_has_type (event, SRL_EVENT_TEXT_CHANGED_DELETE) && event->line)
+	    sro_set_line (obj, event->line);
 	if (srl_is_window_event (event) && event->type != SRL_EVENT_CONTEXT_SWITCHED)
 	{
 	    gchar *name = AccessibleWindowEvent_getTitleString (event->acc_ev);
@@ -1964,6 +1970,40 @@
     return process;
 }
 
+static gchar*
+srl_event_compute_line (const AccessibleEvent *event)
+{
+    gchar *rv = NULL, *line;
+    AccessibleText *text;
+    long len;
+
+    srl_assert (event);
+
+    if (!srl_acc_has_state (event->source, SPI_STATE_SINGLE_LINE))
+	return NULL;
+
+    text = Accessible_getText (event->source);
+    if (!text)
+	return NULL;
+
+    line = AccessibleText_getText (text, 0, -1);
+    AccessibleText_unref (text);
+    if (!line)
+	return NULL;
+	
+    len = strlen (line);
+    if (event->detail1)
+	rv = g_strndup (line, event->detail1);
+    if (event->detail1 + event->detail2 < len)
+    {
+	gchar *tmp = rv;
+	rv = g_strconcat (rv ? rv : "", line + event->detail1 + event->detail2, NULL);
+	g_free (tmp);
+    }
+    SPI_freeString (line);
+    return rv;    
+}
+
 static void 
 srl_event_listener (const AccessibleEvent *event,
 		    void *data)
@@ -1977,6 +2017,8 @@
     ev = srle_new ();
     ev->type = GPOINTER_TO_INT (data);
     ev->acc_ev = (AccessibleEvent*)event;
+    if (GPOINTER_TO_INT (data) == SRL_EVENT_TEXT_CHANGED_DELETE)
+	ev->line = srl_event_compute_line (event);
     AccessibleEvent_ref (ev->acc_ev);
     g_queue_push_head (srl_event_queue, ev);
     srl_log_at_spi_event (event);
Index: gnopernicus/srlow/libsrlow/SRObject.c
===================================================================
RCS file: /cvs/gnome/gnopernicus/srlow/libsrlow/SRObject.c,v
retrieving revision 1.113.2.7
diff -u -r1.113.2.7 SRObject.c
--- gnopernicus/srlow/libsrlow/SRObject.c	17 Jan 2005 17:42:43 -0000	1.113.2.7
+++ gnopernicus/srlow/libsrlow/SRObject.c	10 Feb 2005 11:13:22 -0000
@@ -340,6 +340,7 @@
     GArray			*children;
     gchar			*text;
     gchar			*name;
+    gchar			*line;
     guint                       manages_descendants:1;
 };
 
@@ -560,6 +561,8 @@
 	SR_freeString (obj->text);
     if (obj->name)
 	SR_freeString (obj->name);
+    if (obj->line)
+	SR_freeString (obj->line);
 }
 
 
@@ -4285,7 +4288,12 @@
 	*text = NULL;
     srl_return_val_if_fail (obj && text, FALSE);
     srl_return_val_if_fail (sro_is_text (obj, index), FALSE);
-    
+
+    if (type == SR_TEXT_BOUNDARY_LINE && obj->line)
+    {
+	*text = SR_strdup (obj->line);
+	return TRUE;
+    }
     acc = sro_get_acc_at_index (obj, index);
     if (!acc)
 	return FALSE;
@@ -6083,6 +6091,18 @@
 	obj->text = SR_strdup (difference);
     return TRUE;
 }		 
+
+
+gboolean
+sro_set_line (SRObject *obj,
+	      gchar *line)
+{
+    srl_return_val_if_fail (obj, FALSE);
+    
+    if (line)
+	obj->line = SR_strdup (line);
+    return TRUE;
+}
 
 gboolean
 sro_set_name (SRObject *obj,
