console/libgnt/gnttextview.c

changeset 14373
609c902d20f5
parent 14284
6c99565d0f50
child 14405
4398121ce889
--- a/console/libgnt/gnttextview.c	Wed Aug 23 12:29:08 2006 +0000
+++ b/console/libgnt/gnttextview.c	Wed Aug 23 13:46:51 2006 +0000
@@ -1,4 +1,5 @@
 #include "gnttextview.h"
+#include "gntutils.h"
 
 enum
 {
@@ -14,7 +15,7 @@
 typedef struct
 {
 	GList *segments;         /* A list of GntTextSegments */
-	int length;              /* The current length of the line so far */
+	int length;              /* The current length of the line so far (ie. onscreen width) */
 } GntTextLine;
 
 static GntWidgetClass *parent_class = NULL;
@@ -236,18 +237,23 @@
 
 		while (iter && *iter)
 		{
-			GntTextSegment *seg = g_new0(GntTextSegment, 1);
-			int len = g_utf8_offset_to_pointer(iter, widget->priv.width - line->length - 1) - iter;
-			seg->flags = fl;
-			seg->text = g_new0(char, len + 1);
-			g_utf8_strncpy(seg->text, iter, widget->priv.width - line->length - 1);
-			line->segments = g_list_append(line->segments, seg);
+			int len;
 
-			prev = g_utf8_strlen(seg->text, -1);
-			line->length += prev;
-			iter = g_utf8_offset_to_pointer(iter, prev);
-			if (line->length >= widget->priv.width - 1 && *iter)
-			{
+			len = gnt_util_onscreen_width_to_pointer(iter, widget->priv.width - line->length - 1, &prev) - iter;
+			if (len) {
+				GntTextSegment *seg = g_new0(GntTextSegment, 1);
+				seg->flags = fl;
+				seg->text = g_new0(char, len + 1);
+				g_utf8_strncpy(seg->text, iter, g_utf8_pointer_to_offset(iter, iter + len));
+				line->segments = g_list_append(line->segments, seg);
+
+				line->length += prev;
+				iter += len;
+				if (line->length >= widget->priv.width - 1 && *iter) {
+					line = g_new0(GntTextLine, 1);
+					view->list = g_list_prepend(g_list_first(view->list), line);
+				}
+			} else {
 				line = g_new0(GntTextLine, 1);
 				view->list = g_list_prepend(g_list_first(view->list), line);
 			}

mercurial