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. |