From 43029de8f54ecb799de6230ca34d431e6fcb1062 Mon Sep 17 00:00:00 2001 From: Sebastien Helleu Date: Mon, 28 Jul 2008 18:20:13 +0200 Subject: [PATCH] Fix display bug with some weird UTF-8 chars (bugs #19687 and #23943) --- ChangeLog | 3 ++- src/gui/curses/gui-curses-bar.c | 32 +++++++++++++++++--------------- src/gui/curses/gui-curses-chat.c | 15 +++++++++------ src/gui/gui-chat.c | 11 ++++++++--- 4 files changed, 36 insertions(+), 25 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4b7896367..b698e2853 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,10 +1,11 @@ WeeChat - Wee Enhanced Environment for Chat =========================================== -ChangeLog - 2008-07-06 +ChangeLog - 2008-07-28 Version 0.2.7 (under dev!): + * fix display bug with some weird UTF-8 chars (bug #19687) * fix bug with wide chars in input (bug #16356) * add number of lines remaining after last line displayed in "-MORE-" indicator (task #6702) diff --git a/src/gui/curses/gui-curses-bar.c b/src/gui/curses/gui-curses-bar.c index f48af84dc..3d2027480 100644 --- a/src/gui/curses/gui-curses-bar.c +++ b/src/gui/curses/gui-curses-bar.c @@ -787,23 +787,25 @@ gui_bar_window_print_string (struct t_gui_bar_window *bar_window, snprintf (utf_char, sizeof (utf_char), "."); size_on_screen = utf8_char_size_screen (utf_char); - if (*x + size_on_screen > bar_window->width) + if (size_on_screen > 0) { - if (CONFIG_INTEGER(gui_bar_get_option_filling (bar_window->bar)) == GUI_BAR_FILLING_VERTICAL) - return 0; - if (*y >= bar_window->height - 1) - return 0; - *x = 0; - (*y)++; - wmove (bar_window->win_bar, *y, *x); + if (*x + size_on_screen > bar_window->width) + { + if (CONFIG_INTEGER(gui_bar_get_option_filling (bar_window->bar)) == GUI_BAR_FILLING_VERTICAL) + return 0; + if (*y >= bar_window->height - 1) + return 0; + *x = 0; + (*y)++; + wmove (bar_window->win_bar, *y, *x); + } + output = string_iconv_from_internal (NULL, utf_char); + wprintw (bar_window->win_bar, "%s", + (output) ? output : utf_char); + if (output) + free (output); + *x += size_on_screen; } - output = string_iconv_from_internal (NULL, utf_char); - wprintw (bar_window->win_bar, "%s", - (output) ? output : utf_char); - if (output) - free (output); - - *x += size_on_screen; string = next_char; } diff --git a/src/gui/curses/gui-curses-chat.c b/src/gui/curses/gui-curses-chat.c index ce6bfb59f..9459c8e47 100644 --- a/src/gui/curses/gui-curses-chat.c +++ b/src/gui/curses/gui-curses-chat.c @@ -446,18 +446,21 @@ gui_chat_display_word_raw (struct t_gui_window *window, const char *string, utf_char[next_char - string] = '\0'; if (gui_window_utf_char_valid (utf_char)) { + size_on_screen = utf8_strlen_screen (utf_char); if (max_chars_on_screen > 0) { - size_on_screen = utf8_strlen_screen (utf_char); if (chars_displayed + size_on_screen > max_chars_on_screen) return; chars_displayed += size_on_screen; } - output = string_iconv_from_internal (NULL, utf_char); - wprintw (GUI_CURSES(window)->win_chat, - "%s", (output) ? output : utf_char); - if (output) - free (output); + if (size_on_screen > 0) + { + output = string_iconv_from_internal (NULL, utf_char); + wprintw (GUI_CURSES(window)->win_chat, + "%s", (output) ? output : utf_char); + if (output) + free (output); + } } else { diff --git a/src/gui/gui-chat.c b/src/gui/gui-chat.c index 3d4bfd5ba..6e72682ba 100644 --- a/src/gui/gui-chat.c +++ b/src/gui/gui-chat.c @@ -121,7 +121,7 @@ gui_chat_prefix_build () int gui_chat_strlen_screen (const char *string) { - int length; + int length, size_on_screen; length = 0; while (string && string[0]) @@ -129,7 +129,9 @@ gui_chat_strlen_screen (const char *string) string = gui_chat_string_next_char (NULL, (unsigned char *)string, 0); if (string) { - length += utf8_char_size_screen (string); + size_on_screen = utf8_char_size_screen (string); + if (size_on_screen > 0) + length += size_on_screen; string = utf8_next_char (string); } } @@ -167,6 +169,7 @@ int gui_chat_string_real_pos (const char *string, int pos) { const char *real_pos, *ptr_string; + int size_on_screen; if (pos <= 0) return 0; @@ -180,7 +183,9 @@ gui_chat_string_real_pos (const char *string, int pos) 0); if (ptr_string) { - pos -= utf8_char_size_screen (ptr_string); + size_on_screen = utf8_char_size_screen (ptr_string); + if (size_on_screen > 0) + pos -= size_on_screen; ptr_string = utf8_next_char (ptr_string); real_pos = ptr_string; }