X-Git-Url: https://ncurses.scripts.mit.edu/?a=blobdiff_plain;f=ncurses%2Fbase%2Flib_addch.c;h=3accc043d9bc0d528e74ad88db406d9e5d877f74;hb=e9d205b51699dd452427c908758daa13cccfe2f6;hp=489dd23e887d3582be7ac40742460419a21a8090;hpb=920d493ac02ed9bbbe1e5472e665c718bfdee471;p=ncurses.git diff --git a/ncurses/base/lib_addch.c b/ncurses/base/lib_addch.c index 489dd23e..3accc043 100644 --- a/ncurses/base/lib_addch.c +++ b/ncurses/base/lib_addch.c @@ -36,7 +36,7 @@ #include #include -MODULE_ID("$Id: lib_addch.c,v 1.110 2008/03/22 23:18:28 tom Exp $") +MODULE_ID("$Id: lib_addch.c,v 1.114 2008/11/29 21:02:10 tom Exp $") static const NCURSES_CH_T blankchar = NewChar(BLANK_TEXT); @@ -210,14 +210,14 @@ _nc_build_wch(WINDOW *win, ARG_CH_T ch) WINDOW_EXT(win, addch_y) = y; init_mb(state); - buffer[WINDOW_EXT(win, addch_used)] = CharOf(CHDEREF(ch)); + buffer[WINDOW_EXT(win, addch_used)] = (char) CharOf(CHDEREF(ch)); WINDOW_EXT(win, addch_used) += 1; buffer[WINDOW_EXT(win, addch_used)] = '\0'; if ((len = mbrtowc(&result, buffer, WINDOW_EXT(win, addch_used), &state)) > 0) { attr_t attrs = AttrOf(CHDEREF(ch)); - int pair = GetPair(CHDEREF(ch)); + if_EXT_COLORS(int pair = GetPair(CHDEREF(ch))); SetChar(CHDEREF(ch), result, attrs); if_EXT_COLORS(SetPair(CHDEREF(ch), pair)); WINDOW_EXT(win, addch_used) = 0; @@ -265,15 +265,25 @@ waddch_literal(WINDOW *win, NCURSES_CH_T ch) int len = _nc_build_wch(win, CHREF(ch)); if (len >= -1) { - /* handle EILSEQ */ + attr_t attr = AttrOf(ch); + + /* handle EILSEQ (i.e., when len >= -1) */ if (is8bits(CharOf(ch))) { + int rc = OK; const char *s = unctrl((chtype) CharOf(ch)); - if (s[1] != 0) { - return waddstr(win, s); + + if (s[1] != '\0') { + while (*s != '\0') { + rc = waddch(win, UChar(*s) | attr); + if (rc != OK) + break; + ++s; + } + return rc; } } if (len == -1) - return waddch(win, ' '); + return waddch(win, ' ' | attr); } else { return OK; } @@ -290,12 +300,15 @@ waddch_literal(WINDOW *win, NCURSES_CH_T ch) int len = wcwidth(CharOf(ch)); int i; int j; + wchar_t *chars; if (len == 0) { /* non-spacing */ if ((x > 0 && y >= 0) - || ((y = win->_cury - 1) >= 0 && - (x = win->_maxx) > 0)) { - wchar_t *chars = (win->_line[y].text[x - 1].chars); + || (win->_maxx >= 0 && win->_cury >= 1)) { + if (x > 0 && y >= 0) + chars = (win->_line[y].text[x - 1].chars); + else + chars = (win->_line[y - 1].text[win->_maxx].chars); for (i = 0; i < CCHARW_MAX; ++i) { if (chars[i] == 0) { TR(TRACE_VIRTPUT,