# HG changeset patch # User Richard Nelson # Date 1176113028 0 # Node ID 1f24fd9a6237ae8bda0c716b99083078528ee2fd # Parent eae8e127e4fbf422400e885cf6ec5d67374086d5 word wrapping, fix \r\n newlines diff -r eae8e127e4fb -r 1f24fd9a6237 finch/libgnt/gnttextview.c --- 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;