Mercurial > pidgin
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; }