changeset 16011:1f24fd9a6237

word wrapping, fix \r\n newlines
author Richard Nelson <wabz@pidgin.im>
date Mon, 09 Apr 2007 10:03:48 +0000
parents eae8e127e4fb
children 326e6a503724
files finch/libgnt/gnttextview.c
diffstat 1 files changed, 18 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/finch/libgnt/gnttextview.c	Sat Apr 07 22:46:39 2007 +0000
+++ b/finch/libgnt/gnttextview.c	Mon Apr 09 10:03:48 2007 +0000
@@ -483,9 +483,12 @@
 	start = end = view->string->str + len;
 
 	while (*start) {
+		GntTextLine *oldl;
 		GntTextSegment *seg = NULL;
 
 		if (*end == '\n' || *end == '\r') {
+			if (!strncmp(end, "\r\n", 2))
+				end++;
 			end++;
 			start = end;
 			gnt_text_view_next_line(view);
@@ -501,8 +504,8 @@
 			view->list = g_list_prepend(view->list, line);
 		}
 
-		if ((end = strchr(start, '\n')) != NULL ||
-			(end = strchr(start, '\r')) != NULL) {
+		if ((end = strchr(start, '\r')) != NULL ||
+			(end = strchr(start, '\n')) != NULL) {
 			len = gnt_util_onscreen_width(start, end - 1);
 			if (len >= widget->priv.width - line->length - 1) {
 				end = NULL;
@@ -527,15 +530,25 @@
 			seg->flags = fl;
 			line->segments = g_list_append(line->segments, seg);
 		}
-		seg->end = end - view->string->str;
-		line->length += len;
 
-		start = end;
+		oldl = line;
 		if (*end && *end != '\n' && *end != '\r') {
+			const char *tmp = end;
+			while (end && *end != '\n' && *end != '\r' && !g_ascii_isspace(*end)) {
+				end = g_utf8_find_prev_char(seg->start + view->string->str, end);
+			}
+			if (!end || !g_ascii_isspace(*end))
+				end = tmp;
+			else
+				end++; /* Remove the space */
+
 			line = g_new0(GntTextLine, 1);
 			line->soft = TRUE;
 			view->list = g_list_prepend(view->list, line);
 		}
+		seg->end = end - view->string->str;
+		oldl->length += len;
+		start = end;
 	}
 
 	view->list = list;