/* Public Domain Curses */ #include RCSID("$Id: border.c,v 1.53 2008/07/13 16:08:18 wmcbrine Exp $") /*man-start************************************************************** Name: border Synopsis: int border(chtype ls, chtype rs, chtype ts, chtype bs, chtype tl, chtype tr, chtype bl, chtype br); int wborder(WINDOW *win, chtype ls, chtype rs, chtype ts, chtype bs, chtype tl, chtype tr, chtype bl, chtype br); int box(WINDOW *win, chtype verch, chtype horch); int hline(chtype ch, int n); int vline(chtype ch, int n); int whline(WINDOW *win, chtype ch, int n); int wvline(WINDOW *win, chtype ch, int n); int mvhline(int y, int x, chtype ch, int n); int mvvline(int y, int x, chtype ch, int n); int mvwhline(WINDOW *win, int y, int x, chtype ch, int n); int mvwvline(WINDOW *win, int y, int x, chtype ch, int n); int border_set(const cchar_t *ls, const cchar_t *rs, const cchar_t *ts, const cchar_t *bs, const cchar_t *tl, const cchar_t *tr, const cchar_t *bl, const cchar_t *br); int wborder_set(WINDOW *win, const cchar_t *ls, const cchar_t *rs, const cchar_t *ts, const cchar_t *bs, const cchar_t *tl, const cchar_t *tr, const cchar_t *bl, const cchar_t *br); int box_set(WINDOW *win, const cchar_t *verch, const cchar_t *horch); int hline_set(const cchar_t *wch, int n); int vline_set(const cchar_t *wch, int n); int whline_set(WINDOW *win, const cchar_t *wch, int n); int wvline_set(WINDOW *win, const cchar_t *wch, int n); int mvhline_set(int y, int x, const cchar_t *wch, int n); int mvvline_set(int y, int x, const cchar_t *wch, int n); int mvwhline_set(WINDOW *win, int y, int x, const cchar_t *wch, int n); int mvwvline_set(WINDOW *win, int y, int x, const cchar_t *wch, int n); Description: border(), wborder(), and box() draw a border around the edge of the window. If any argument is zero, an appropriate default is used: ls left side of border ACS_VLINE rs right side of border ACS_VLINE ts top side of border ACS_HLINE bs bottom side of border ACS_HLINE tl top left corner of border ACS_ULCORNER tr top right corner of border ACS_URCORNER bl bottom left corner of border ACS_LLCORNER br bottom right corner of border ACS_LRCORNER hline() and whline() draw a horizontal line, using ch, starting from the current cursor position. The cursor position does not change. The line is at most n characters long, or as many as will fit in the window. vline() and wvline() draw a vertical line, using ch, starting from the current cursor position. The cursor position does not change. The line is at most n characters long, or as many as will fit in the window. Return Value: These functions return OK on success and ERR on error. Portability X/Open BSD SYS V border Y - 4.0 wborder Y - 4.0 box Y Y Y hline Y - 4.0 vline Y - 4.0 whline Y - 4.0 wvline Y - 4.0 mvhline Y mvvline Y mvwhline Y mvwvline Y border_set Y wborder_set Y box_set Y hline_set Y vline_set Y whline_set Y wvline_set Y mvhline_set Y mvvline_set Y mvwhline_set Y mvwvline_set Y **man-end****************************************************************/ /* _attr_passthru() -- Takes a single chtype 'ch' and checks if the current attribute of window 'win', as set by wattrset(), and/or the current background of win, as set by wbkgd(), should by combined with it. Attributes set explicitly in ch take precedence. */ static chtype _attr_passthru(WINDOW *win, chtype ch) { chtype attr; /* If the incoming character doesn't have its own attribute, then use the current attributes for the window. If the incoming character has attributes, but not a color component, OR the attributes to the current attributes for the window. If the incoming character has a color component, use only the attributes from the incoming character. */ attr = ch & A_ATTRIBUTES; if (!(attr & A_COLOR)) attr |= win->_attrs; /* wrs (4/10/93) -- Apply the same sort of logic for the window background, in that it only takes precedence if other color attributes are not there. */ if (!(attr & A_COLOR)) attr |= win->_bkgd & A_ATTRIBUTES; else attr |= win->_bkgd & (A_ATTRIBUTES ^ A_COLOR); ch = (ch & A_CHARTEXT) | attr; return ch; } int wborder(WINDOW *win, chtype ls, chtype rs, chtype ts, chtype bs, chtype tl, chtype tr, chtype bl, chtype br) { int i, ymax, xmax; PDC_LOG(("wborder() - called\n")); if (!win) return ERR; ymax = win->_maxy - 1; xmax = win->_maxx - 1; ls = _attr_passthru(win, ls ? ls : ACS_VLINE); rs = _attr_passthru(win, rs ? rs : ACS_VLINE); ts = _attr_passthru(win, ts ? ts : ACS_HLINE); bs = _attr_passthru(win, bs ? bs : ACS_HLINE); tl = _attr_passthru(win, tl ? tl : ACS_ULCORNER); tr = _attr_passthru(win, tr ? tr : ACS_URCORNER); bl = _attr_passthru(win, bl ? bl : ACS_LLCORNER); br = _attr_passthru(win, br ? br : ACS_LRCORNER); for (i = 1; i < xmax; i++) { win->_y[0][i] = ts; win->_y[ymax][i] = bs; } for (i = 1; i < ymax; i++) { win->_y[i][0] = ls; win->_y[i][xmax] = rs; } win->_y[0][0] = tl; win->_y[0][xmax] = tr; win->_y[ymax][0] = bl; win->_y[ymax][xmax] = br; for (i = 0; i <= ymax; i++) { win->_firstch[i] = 0; win->_lastch[i] = xmax; } PDC_sync(win); return OK; } int border(chtype ls, chtype rs, chtype ts, chtype bs, chtype tl, chtype tr, chtype bl, chtype br) { PDC_LOG(("border() - called\n")); return wborder(stdscr, ls, rs, ts, bs, tl, tr, bl, br); } int box(WINDOW *win, chtype verch, chtype horch) { PDC_LOG(("box() - called\n")); return wborder(win, verch, verch, horch, horch, 0, 0, 0, 0); } int whline(WINDOW *win, chtype ch, int n) { chtype *dest; int startpos, endpos; PDC_LOG(("whline() - called\n")); if (!win || n < 1) return ERR; startpos = win->_curx; endpos = min(startpos + n, win->_maxx) - 1; dest = win->_y[win->_cury]; ch = _attr_passthru(win, ch ? ch : ACS_HLINE); for (n = startpos; n <= endpos; n++) dest[n] = ch; n = win->_cury; if (startpos < win->_firstch[n] || win->_firstch[n] == _NO_CHANGE) win->_firstch[n] = startpos; if (endpos > win->_lastch[n]) win->_lastch[n] = endpos; PDC_sync(win); return OK; } int hline(chtype ch, int n) { PDC_LOG(("hline() - called\n")); return whline(stdscr, ch, n); } int mvhline(int y, int x, chtype ch, int n) { PDC_LOG(("mvhline() - called\n")); if (move(y, x) == ERR) return ERR; return whline(stdscr, ch, n); } int mvwhline(WINDOW *win, int y, int x, chtype ch, int n) { PDC_LOG(("mvwhline() - called\n")); if (wmove(win, y, x) == ERR) return ERR; return whline(win, ch, n); } int wvline(WINDOW *win, chtype ch, int n) { int endpos, x; PDC_LOG(("wvline() - called\n")); if (!win || n < 1) return ERR; endpos = min(win->_cury + n, win->_maxy); x = win->_curx; ch = _attr_passthru(win, ch ? ch : ACS_VLINE); for (n = win->_cury; n < endpos; n++) { win->_y[n][x] = ch; if (x < win->_firstch[n] || win->_firstch[n] == _NO_CHANGE) win->_firstch[n] = x; if (x > win->_lastch[n]) win->_lastch[n] = x; } PDC_sync(win); return OK; } int vline(chtype ch, int n) { PDC_LOG(("vline() - called\n")); return wvline(stdscr, ch, n); } int mvvline(int y, int x, chtype ch, int n) { PDC_LOG(("mvvline() - called\n")); if (move(y, x) == ERR) return ERR; return wvline(stdscr, ch, n); } int mvwvline(WINDOW *win, int y, int x, chtype ch, int n) { PDC_LOG(("mvwvline() - called\n")); if (wmove(win, y, x) == ERR) return ERR; return wvline(win, ch, n); } #ifdef PDC_WIDE int wborder_set(WINDOW *win, const cchar_t *ls, const cchar_t *rs, const cchar_t *ts, const cchar_t *bs, const cchar_t *tl, const cchar_t *tr, const cchar_t *bl, const cchar_t *br) { PDC_LOG(("wborder_set() - called\n")); return wborder(win, ls ? *ls : 0, rs ? *rs : 0, ts ? *ts : 0, bs ? *bs : 0, tl ? *tl : 0, tr ? *tr : 0, bl ? *bl : 0, br ? *br : 0); } int border_set(const cchar_t *ls, const cchar_t *rs, const cchar_t *ts, const cchar_t *bs, const cchar_t *tl, const cchar_t *tr, const cchar_t *bl, const cchar_t *br) { PDC_LOG(("border_set() - called\n")); return wborder_set(stdscr, ls, rs, ts, bs, tl, tr, bl, br); } int box_set(WINDOW *win, const cchar_t *verch, const cchar_t *horch) { PDC_LOG(("box_set() - called\n")); return wborder_set(win, verch, verch, horch, horch, (const cchar_t *)NULL, (const cchar_t *)NULL, (const cchar_t *)NULL, (const cchar_t *)NULL); } int whline_set(WINDOW *win, const cchar_t *wch, int n) { PDC_LOG(("whline_set() - called\n")); return wch ? whline(win, *wch, n) : ERR; } int hline_set(const cchar_t *wch, int n) { PDC_LOG(("hline_set() - called\n")); return whline_set(stdscr, wch, n); } int mvhline_set(int y, int x, const cchar_t *wch, int n) { PDC_LOG(("mvhline_set() - called\n")); if (move(y, x) == ERR) return ERR; return whline_set(stdscr, wch, n); } int mvwhline_set(WINDOW *win, int y, int x, const cchar_t *wch, int n) { PDC_LOG(("mvwhline_set() - called\n")); if (wmove(win, y, x) == ERR) return ERR; return whline_set(win, wch, n); } int wvline_set(WINDOW *win, const cchar_t *wch, int n) { PDC_LOG(("wvline_set() - called\n")); return wch ? wvline(win, *wch, n) : ERR; } int vline_set(const cchar_t *wch, int n) { PDC_LOG(("vline_set() - called\n")); return wvline_set(stdscr, wch, n); } int mvvline_set(int y, int x, const cchar_t *wch, int n) { PDC_LOG(("mvvline_set() - called\n")); if (move(y, x) == ERR) return ERR; return wvline_set(stdscr, wch, n); } int mvwvline_set(WINDOW *win, int y, int x, const cchar_t *wch, int n) { PDC_LOG(("mvwvline_set() - called\n")); if (wmove(win, y, x) == ERR) return ERR; return wvline_set(win, wch, n); } #endif