1
0
mirror of https://github.com/irssi/irssi.git synced 2024-06-30 02:45:25 -04:00

Merge pull request #318 from LemonBoy/fix-utf8-elements

Fix the display of utf8 sequences in the gui
This commit is contained in:
ailin-nemui 2015-10-04 20:22:36 +02:00
commit 79fa2fcb59
3 changed files with 29 additions and 9 deletions

View File

@ -220,16 +220,15 @@ static void sig_gui_print_text(WINDOW_REC *window, void *fgcolor,
get_colors(flags, &fg, &bg, &attr);
if (window == NULL) {
g_return_if_fail(next_xpos != -1);
g_return_if_fail(next_xpos != -1);
term_set_color2(root_window, attr, fg, bg);
term_move(root_window, next_xpos, next_ypos);
if (flags & GUI_PRINT_FLAG_CLRTOEOL)
term_clrtoeol(root_window);
term_addstr(root_window, str);
next_xpos += strlen(str); /* FIXME utf8 or big5 */
return;
next_xpos += term_addstr(root_window, str);
return;
}
lineinfo.level = dest == NULL ? 0 : dest->level;

View File

@ -522,15 +522,36 @@ void term_add_unichar(TERM_WINDOW *window, unichar chr)
}
}
void term_addstr(TERM_WINDOW *window, const char *str)
int term_addstr(TERM_WINDOW *window, const char *str)
{
int len;
int len, raw_len;
unichar tmp;
const char *ptr;
if (vcmove) term_move_real();
len = strlen(str); /* FIXME utf8 or big5 */
len = 0;
raw_len = strlen(str);
/* The string length depends on the terminal encoding */
ptr = str;
if (term_type == TERM_TYPE_UTF8) {
while (*ptr != '\0') {
tmp = g_utf8_get_char(ptr);
len += unichar_isprint(tmp) ? mk_wcwidth(tmp) : 1;
ptr = g_utf8_next_char(ptr);
}
} else
len = raw_len;
term_printed_text(len);
fwrite(str, 1, len, window->term->out);
/* Use strlen() here since we need the number of raw bytes */
fwrite(str, 1, raw_len, window->term->out);
return len;
}
void term_clrtoeol(TERM_WINDOW *window)

View File

@ -83,7 +83,7 @@ void term_set_color(TERM_WINDOW *window, int col);
void term_move(TERM_WINDOW *window, int x, int y);
void term_addch(TERM_WINDOW *window, char chr);
void term_add_unichar(TERM_WINDOW *window, unichar chr);
void term_addstr(TERM_WINDOW *window, const char *str);
int term_addstr(TERM_WINDOW *window, const char *str);
void term_clrtoeol(TERM_WINDOW *window);
void term_move_cursor(int x, int y);