changeset 14419:b50aa149e09d

[gaim-migrate @ 17127] This fixes titles containing double-column wide characters for me. Editing of double-column characters in gntentry remains a bit bustinated (though it is my recollection that it worked at one time). This additionally does not require wcwidth() and its attendant funkiness. The version of gnt_util_onscreen_width_to_pointer in this commit *appears* to do what the extant version was supposed to do, though I'm not sure I grokked it fully; it does correct the rendering glitches for me. I'm not at all comfortable with the de-constification of the input string and attendant return of the de-constified pointer. Sadrul will have to let me know what is supposed to happen there. Output on non-UTF-8 terminals is not correct, but was not correct before, either. committer: Tailor Script <tailor@pidgin.im>
author Ethan Blanton <elb@pidgin.im>
date Sat, 02 Sep 2006 16:55:32 +0000
parents 010d8433db81
children c4a32405af68
files console/libgnt/configure.ac console/libgnt/gntutils.c
diffstat 2 files changed, 8 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/console/libgnt/configure.ac	Sat Sep 02 07:38:08 2006 +0000
+++ b/console/libgnt/configure.ac	Sat Sep 02 16:55:32 2006 +0000
@@ -198,7 +198,7 @@
 AC_CHECK_HEADERS(sys/file.h sys/filio.h sys/ioctl.h sys/msgbuf.h)
 AC_CHECK_HEADERS(sys/select.h sys/uio.h sys/utsname.h sys/wait.h)
 AC_CHECK_HEADERS(termios.h)
-AC_CHECK_FUNC(wcwidth, [AC_DEFINE([HAVE_WCWIDTH], [1], [Define to 1 if you have wcwidth function.])])
+#AC_CHECK_FUNC(wcwidth, [AC_DEFINE([HAVE_WCWIDTH], [1], [Define to 1 if you have wcwidth function.])])
 #AC_VAR_TIMEZONE_EXTERNALS
 
 AC_CHECK_LIB(ncursesw, initscr, , [AC_MSG_ERROR([
--- a/console/libgnt/gntutils.c	Sat Sep 02 07:38:08 2006 +0000
+++ b/console/libgnt/gntutils.c	Sat Sep 02 16:55:32 2006 +0000
@@ -5,14 +5,6 @@
 
 #include "config.h"
 
-#ifndef HAVE_WCWIDTH
-#define wcwidth(X) 1
-#else
-#define __USE_XOPEN
-#endif
-
-#include <wchar.h>
-
 void gnt_util_get_text_bound(const char *text, int *width, int *height)
 {
 	const char *s = text, *last;
@@ -49,47 +41,30 @@
 
 int gnt_util_onscreen_width(const char *start, const char *end)
 {
-	wchar_t wch;
-	int size;
 	int width = 0;
 
 	while (start < end) {
-		if ((size = mbtowc(&wch, start, end - start)) > 0) {
-			start += size;
-			width += wcwidth(wch);
-		} else {
-			++width;
-			++start;
-		}
+		width += g_unichar_iswide(g_utf8_get_char(start)) ? 2 : 1;
+		start = g_utf8_next_char(start);
 	}
 	return width;
 }
 
 char *gnt_util_onscreen_width_to_pointer(const char *string, int len, int *w)
 {
-	wchar_t wch;
 	int size;
 	int width = 0;
 	char *str = (char*)string;
-	int slen = strlen(string);  /* Yeah, no. of bytes */
 
 	while (width < len && *str) {
-		if ((size = mbtowc(&wch, str, slen)) > 0) {
-			if (width + wcwidth(wch) > len)
-				break;
-			str += size;
-			width += wcwidth(wch);
-			slen -= size;
-		} else {
-			++str;
-			++width;
-			--slen;
-		}
+		size = g_unichar_iswide(g_utf8_get_char(str)) ? 2 : 1;
+		if (width + size > len)
+			break;
+		str = g_utf8_next_char(str);
+		width += size;
 	}
-
 	if (w)
 		*w = width;
-
 	return str;
 }