| 
      
      
      From: <ebl...@us...> - 2006-09-02 16:55:47
      
     | 
| Revision: 17127
          http://svn.sourceforge.net/gaim/?rev=17127&view=rev
Author:   eblanton
Date:     2006-09-02 09:55:32 -0700 (Sat, 02 Sep 2006)
Log Message:
-----------
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.
Modified Paths:
--------------
    trunk/console/libgnt/configure.ac
    trunk/console/libgnt/gntutils.c
Modified: trunk/console/libgnt/configure.ac
===================================================================
--- trunk/console/libgnt/configure.ac	2006-09-02 07:38:08 UTC (rev 17126)
+++ trunk/console/libgnt/configure.ac	2006-09-02 16:55:32 UTC (rev 17127)
@@ -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([
Modified: trunk/console/libgnt/gntutils.c
===================================================================
--- trunk/console/libgnt/gntutils.c	2006-09-02 07:38:08 UTC (rev 17126)
+++ trunk/console/libgnt/gntutils.c	2006-09-02 16:55:32 UTC (rev 17127)
@@ -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;
 }
 
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 |