# HG changeset patch # User Ethan Blanton # Date 1157216132 0 # Node ID b50aa149e09d6b69546cfcedb4ab507c24d8a127 # Parent 010d8433db81086cd3c741c47cacc550afd5e539 [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 diff -r 010d8433db81 -r b50aa149e09d console/libgnt/configure.ac --- 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([ diff -r 010d8433db81 -r b50aa149e09d console/libgnt/gntutils.c --- 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 - 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; }