whline_set(WINDOW *win, const cchar_t * ch, int n) { int code = ERR; NCURSES_SIZE_T start; NCURSES_SIZE_T end; T((T_CALLED("whline_set(%p,%s,%d)"), win, _tracecchar_t(ch), n)); if (win) { struct ldat *line = &(win->_line[win->_cury]); NCURSES_CH_T wch; start = win->_curx; end = start + n - 1; if (end > win->_maxx) end = win->_maxx; CHANGED_RANGE(line, start, end); if (ch == 0) wch = *WACS_HLINE; else wch = *ch; wch = _nc_render(win, wch); while (end >= start) { line->text[end] = wch; end--; } _nc_synchook(win); code = OK; } returnCode(code); }
wvline_set(WINDOW *win, const cchar_t * ch, int n) { int code = ERR; NCURSES_SIZE_T row, col; NCURSES_SIZE_T end; T((T_CALLED("wvline(%p,%s,%d)"), win, _tracecchar_t(ch), n)); if (win) { NCURSES_CH_T wch; row = win->_cury; col = win->_curx; end = row + n - 1; if (end > win->_maxy) end = win->_maxy; if (ch == 0) wch = *WACS_VLINE; else wch = *ch; wch = _nc_render(win, wch); while (end >= row) { struct ldat *line = &(win->_line[end]); line->text[col] = wch; CHANGED_CELL(line, col); end--; } _nc_synchook(win); code = OK; } returnCode(code); }
wadd_wch(WINDOW *win, const cchar_t *wch) { int code = ERR; TR(TRACE_VIRTPUT | TRACE_CCALLS, (T_CALLED("wadd_wch(%p, %s)"), (void *) win, _tracecchar_t(wch))); if (win && (wadd_wch_nosync(win, *wch) != ERR)) { _nc_synchook(win); code = OK; } TR(TRACE_VIRTPUT | TRACE_CCALLS, (T_RETURN("%d"), code)); return (code); }
setcchar(cchar_t *wcval, const wchar_t *wch, const attr_t attrs, short color_pair, const void *opts) { unsigned i; unsigned len; int code = OK; TR(TRACE_CCALLS, (T_CALLED("setcchar(%p,%s,%lu,%d,%p)"), (void *) wcval, _nc_viswbuf(wch), (unsigned long) attrs, color_pair, opts)); len = (unsigned) wcslen(wch); if (opts != NULL || (len > 1 && wcwidth(wch[0]) < 0)) { code = ERR; } else { if (len > CCHARW_MAX) len = CCHARW_MAX; /* * If we have a following spacing-character, stop at that point. We * are only interested in adding non-spacing characters. */ for (i = 1; i < len; ++i) { if (wcwidth(wch[i]) != 0) { len = i; break; } } memset(wcval, 0, sizeof(*wcval)); if (len != 0) { SetAttr(*wcval, attrs | (attr_t) ColorPair(color_pair)); SetPair(CHDEREF(wcval), color_pair); memcpy(&wcval->chars, wch, len * sizeof(wchar_t)); TR(TRACE_CCALLS, ("copy %d wchars, first is %s", len, _tracecchar_t(wcval))); } } TR(TRACE_CCALLS, (T_RETURN("%d"), code)); return (code); }
wecho_wchar(WINDOW *win, const cchar_t *wch) { int code = ERR; TR(TRACE_VIRTPUT | TRACE_CCALLS, (T_CALLED("wechochar(%p, %s)"), (void *) win, _tracecchar_t(wch))); if (win && (wadd_wch_nosync(win, *wch) != ERR)) { bool save_immed = win->_immed; win->_immed = TRUE; _nc_synchook(win); win->_immed = save_immed; code = OK; } TR(TRACE_VIRTPUT | TRACE_CCALLS, (T_RETURN("%d"), code)); return (code); }
wins_wch(WINDOW *win, const cchar_t *wch) { NCURSES_SIZE_T oy; NCURSES_SIZE_T ox; int code = ERR; T((T_CALLED("wins_wch(%p, %s)"), (void *) win, _tracecchar_t(wch))); if (win != 0) { oy = win->_cury; ox = win->_curx; code = _nc_insert_wch(win, wch); win->_curx = ox; win->_cury = oy; _nc_synchook(win); } returnCode(code); }
setcchar(cchar_t * wcval, const wchar_t * wch, const attr_t attrs, short color_pair, const void *opts) { int i; int len; int code = OK; TR(TRACE_CCALLS, (T_CALLED("setcchar(%p,%s,%ld,%d,%p)"), wcval, _nc_viswbuf(wch), attrs, color_pair, opts)); if (opts != NULL || (len = wcslen(wch)) > CCHARW_MAX || (len > 0 && wcwidth(wch[0]) < 0)) { code = ERR; } else { for (i = 1; i < len; ++i) { if (wcwidth(wch[i]) != 0) { code = ERR; break; } } if (code != ERR) { memset(wcval, 0, sizeof(*wcval)); if (len != 0) { SetAttr(*wcval, attrs | color_pair); memcpy(&wcval->chars, wch, len * sizeof(wchar_t)); TR(TRACE_CCALLS, ("copy %d wchars, first is %s", len, _tracecchar_t(wcval))); } } } TR(TRACE_CCALLS, (T_RETURN("%d"), code)); return (code); }
_nc_init_wacs(void) { /* *INDENT-OFF* */ static const struct { int map; int value[2]; } table[] = { /* VT100 symbols */ { 'l', { '+', 0x250c }}, /* upper left corner */ { 'm', { '+', 0x2514 }}, /* lower left corner */ { 'k', { '+', 0x2510 }}, /* upper right corner */ { 'j', { '+', 0x2518 }}, /* lower right corner */ { 't', { '+', 0x251c }}, /* tee pointing left */ { 'u', { '+', 0x2524 }}, /* tee pointing right */ { 'v', { '+', 0x2534 }}, /* tee pointing up */ { 'w', { '+', 0x252c }}, /* tee pointing down */ { 'q', { '-', 0x2500 }}, /* horizontal line */ { 'x', { '|', 0x2502 }}, /* vertical line */ { 'n', { '+', 0x253c }}, /* large plus or crossover */ { 'o', { '~', 0x23ba }}, /* scan line 1 */ { 's', { '_', 0x23bd }}, /* scan line 9 */ { '`', { '+', 0x25c6 }}, /* diamond */ { 'a', { ':', 0x2592 }}, /* checker board (stipple) */ { 'f', { '\'', 0x00b0 }}, /* degree symbol */ { 'g', { '#', 0x00b1 }}, /* plus/minus */ { '~', { 'o', 0x00b7 }}, /* bullet */ /* Teletype 5410v1 symbols */ { ',', { '<', 0x2190 }}, /* arrow pointing left */ { '+', { '>', 0x2192 }}, /* arrow pointing right */ { '.', { 'v', 0x2193 }}, /* arrow pointing down */ { '-', { '^', 0x2191 }}, /* arrow pointing up */ { 'h', { '#', 0x2592 }}, /* board of squares */ { 'i', { '#', 0x2603 }}, /* lantern symbol */ { '0', { '#', 0x25ae }}, /* solid square block */ /* these defaults were invented for ncurses */ { 'p', { '-', 0x23bb }}, /* scan line 3 */ { 'r', { '-', 0x23bc }}, /* scan line 7 */ { 'y', { '<', 0x2264 }}, /* less-than-or-equal-to */ { 'z', { '>', 0x2265 }}, /* greater-than-or-equal-to */ { '{', { '*', 0x03c0 }}, /* greek pi */ { '|', { '!', 0x2260 }}, /* not-equal */ { '}', { 'f', 0x00a3 }}, /* pound-sterling symbol */ }; /* *INDENT-ON* */ unsigned n, m; int active = _nc_unicode_locale(); /* * If we're running in a UTF-8 locale, will use the Unicode equivalents * rather than the terminfo information. Actually the terminfo should * be the rule, but there are people who are offended by the notion that * a Unicode-capable terminal would have something resembling a mode. * So the smacs/rmacs may be disabled -- sometime. */ T(("initializing WIDE-ACS map (Unicode is%s active)", active ? "" : " not")); _nc_wacs = typeCalloc(cchar_t, ACS_LEN); for (n = 0; n < SIZEOF(table); ++n) { int wide = wcwidth(table[n].value[active]); m = table[n].map; if (active && (wide == 1)) { SetChar(_nc_wacs[m], table[n].value[active], A_NORMAL); } else if (acs_map[m] & A_ALTCHARSET) { SetChar(_nc_wacs[m], m, A_ALTCHARSET); } else { SetChar(_nc_wacs[m], table[n].value[0], A_NORMAL); } T(("#%d, SetChar(%c, %#04x) = %s", n, m, table[n].value[active], _tracecchar_t(&_nc_wacs[m]))); } }