123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408 |
- /* PDCurses */
- #include <curspriv.h>
- /*man-start**************************************************************
- addch
- -----
- ### Synopsis
- int addch(const chtype ch);
- int waddch(WINDOW *win, const chtype ch);
- int mvaddch(int y, int x, const chtype ch);
- int mvwaddch(WINDOW *win, int y, int x, const chtype ch);
- int echochar(const chtype ch);
- int wechochar(WINDOW *win, const chtype ch);
- int addrawch(chtype ch);
- int waddrawch(WINDOW *win, chtype ch);
- int mvaddrawch(int y, int x, chtype ch);
- int mvwaddrawch(WINDOW *win, int y, int x, chtype ch);
- int add_wch(const cchar_t *wch);
- int wadd_wch(WINDOW *win, const cchar_t *wch);
- int mvadd_wch(int y, int x, const cchar_t *wch);
- int mvwadd_wch(WINDOW *win, int y, int x, const cchar_t *wch);
- int echo_wchar(const cchar_t *wch);
- int wecho_wchar(WINDOW *win, const cchar_t *wch);
- ### Description
- addch() adds the chtype ch to the default window (stdscr) at the
- current cursor position, and advances the cursor. Note that chtypes
- can convey both text (a single character) and attributes, including a
- color pair. add_wch() is the wide-character version of this function,
- taking a pointer to a cchar_t instead of a chtype.
- waddch() is like addch(), but also lets you specify the window. (This
- is in fact the core output routine.) wadd_wch() is the wide version.
- mvaddch() moves the cursor to the specified (y, x) position, and adds
- ch to stdscr. mvadd_wch() is the wide version.
- mvwaddch() moves the cursor to the specified position and adds ch to
- the specified window. mvwadd_wch() is the wide version.
- echochar() adds ch to stdscr at the current cursor position and calls
- refresh(). echo_wchar() is the wide version.
- wechochar() adds ch to the specified window and calls wrefresh().
- wecho_wchar() is the wide version.
- addrawch(), waddrawch(), mvaddrawch() and mvwaddrawch() are PDCurses-
- specific wrappers for addch() etc. that disable the translation of
- control characters.
- The following applies to all these functions:
- If the cursor moves on to the right margin, an automatic newline is
- performed. If scrollok is enabled, and a character is added to the
- bottom right corner of the window, the scrolling region will be
- scrolled up one line. If scrolling is not allowed, ERR will be
- returned.
- If ch is a tab, newline, or backspace, the cursor will be moved
- appropriately within the window. If ch is a newline, the clrtoeol
- routine is called before the cursor is moved to the beginning of the
- next line. If newline mapping is off, the cursor will be moved to
- the next line, but the x coordinate will be unchanged. If ch is a
- tab the cursor is moved to the next tab position within the window.
- If ch is another control character, it will be drawn in the ^X
- notation. Calling the inch() routine after adding a control
- character returns the representation of the control character, not
- the control character.
- Video attributes can be combined with a character by ORing them into
- the parameter. Text, including attributes, can be copied from one
- place to another by using inch() and addch().
- Note that in PDCurses, for now, a cchar_t and a chtype are the same.
- The text field is 16 bits wide, and is treated as Unicode (UCS-2)
- when PDCurses is built with wide-character support (define PDC_WIDE).
- So, in functions that take a chtype, like addch(), both the wide and
- narrow versions will handle Unicode. But for portability, you should
- use the wide functions.
- ### Return Value
- All functions return OK on success and ERR on error.
- ### Portability
- X/Open ncurses NetBSD
- addch Y Y Y
- waddch Y Y Y
- mvaddch Y Y Y
- mvwaddch Y Y Y
- echochar Y Y Y
- wechochar Y Y Y
- add_wch Y Y Y
- wadd_wch Y Y Y
- mvadd_wch Y Y Y
- mvwadd_wch Y Y Y
- echo_wchar Y Y Y
- wecho_wchar Y Y Y
- addrawch - - -
- waddrawch - - -
- mvaddrawch - - -
- mvwaddrawch - - -
- **man-end****************************************************************/
- int waddch(WINDOW *win, const chtype ch)
- {
- int x, y;
- chtype text, attr;
- bool xlat;
- PDC_LOG(("waddch() - called: win=%p ch=%x (text=%c attr=0x%x)\n",
- win, ch, ch & A_CHARTEXT, ch & A_ATTRIBUTES));
- if (!win || !SP)
- return ERR;
- x = win->_curx;
- y = win->_cury;
- if (y > win->_maxy || x > win->_maxx || y < 0 || x < 0)
- return ERR;
- xlat = !SP->raw_out && !(ch & A_ALTCHARSET);
- text = ch & A_CHARTEXT;
- attr = ch & A_ATTRIBUTES;
- if (xlat && (text < ' ' || text == 0x7f))
- {
- int x2;
- switch (text)
- {
- case '\t':
- for (x2 = ((x / TABSIZE) + 1) * TABSIZE; x < x2; x++)
- {
- if (waddch(win, attr | ' ') == ERR)
- return ERR;
- /* if tab to next line, exit the loop */
- if (!win->_curx)
- break;
- }
- return OK;
- case '\n':
- /* if lf -> crlf */
- if (!SP->raw_out)
- x = 0;
- wclrtoeol(win);
- if (++y > win->_bmarg)
- {
- y--;
- if (wscrl(win, 1) == ERR)
- return ERR;
- }
- break;
- case '\b':
- /* don't back over left margin */
- if (--x < 0)
- case '\r':
- x = 0;
- break;
- case 0x7f:
- if (waddch(win, attr | '^') == ERR)
- return ERR;
- return waddch(win, attr | '?');
- default:
- /* handle control chars */
- if (waddch(win, attr | '^') == ERR)
- return ERR;
- return waddch(win, ch + '@');
- }
- }
- else
- {
- /* If the incoming character doesn't have its own attribute,
- then use the current attributes for the window. If it has
- attributes but not a color component, OR the attributes to
- the current attributes for the window. If it has a color
- component, use the attributes solely from the incoming
- character. */
- 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 and that the background character
- will only print if the printing character is blank. */
- if (!(attr & A_COLOR))
- attr |= win->_bkgd & A_ATTRIBUTES;
- else
- attr |= win->_bkgd & (A_ATTRIBUTES ^ A_COLOR);
- if (text == ' ')
- text = win->_bkgd & A_CHARTEXT;
- /* Add the attribute back into the character. */
- text |= attr;
- /* Only change _firstch/_lastch if the character to be added is
- different from the character/attribute that is already in
- that position in the window. */
- if (win->_y[y][x] != text)
- {
- if (win->_firstch[y] == _NO_CHANGE)
- win->_firstch[y] = win->_lastch[y] = x;
- else
- if (x < win->_firstch[y])
- win->_firstch[y] = x;
- else
- if (x > win->_lastch[y])
- win->_lastch[y] = x;
- win->_y[y][x] = text;
- }
- if (++x >= win->_maxx)
- {
- /* wrap around test */
- x = 0;
- if (++y > win->_bmarg)
- {
- y--;
- if (wscrl(win, 1) == ERR)
- {
- PDC_sync(win);
- return ERR;
- }
- }
- }
- }
- win->_curx = x;
- win->_cury = y;
- if (win->_immed)
- wrefresh(win);
- if (win->_sync)
- wsyncup(win);
- return OK;
- }
- int addch(const chtype ch)
- {
- PDC_LOG(("addch() - called: ch=%x\n", ch));
- return waddch(stdscr, ch);
- }
- int mvaddch(int y, int x, const chtype ch)
- {
- PDC_LOG(("mvaddch() - called: y=%d x=%d ch=%x\n", y, x, ch));
- if (move(y,x) == ERR)
- return ERR;
- return waddch(stdscr, ch);
- }
- int mvwaddch(WINDOW *win, int y, int x, const chtype ch)
- {
- PDC_LOG(("mvwaddch() - called: win=%p y=%d x=%d ch=%d\n", win, y, x, ch));
- if (wmove(win, y, x) == ERR)
- return ERR;
- return waddch(win, ch);
- }
- int echochar(const chtype ch)
- {
- PDC_LOG(("echochar() - called: ch=%x\n", ch));
- return wechochar(stdscr, ch);
- }
- int wechochar(WINDOW *win, const chtype ch)
- {
- PDC_LOG(("wechochar() - called: win=%p ch=%x\n", win, ch));
- if (waddch(win, ch) == ERR)
- return ERR;
- return wrefresh(win);
- }
- int waddrawch(WINDOW *win, chtype ch)
- {
- PDC_LOG(("waddrawch() - called: win=%p ch=%x (text=%c attr=0x%x)\n",
- win, ch, ch & A_CHARTEXT, ch & A_ATTRIBUTES));
- if ((ch & A_CHARTEXT) < ' ' || (ch & A_CHARTEXT) == 0x7f)
- ch |= A_ALTCHARSET;
- return waddch(win, ch);
- }
- int addrawch(chtype ch)
- {
- PDC_LOG(("addrawch() - called: ch=%x\n", ch));
- return waddrawch(stdscr, ch);
- }
- int mvaddrawch(int y, int x, chtype ch)
- {
- PDC_LOG(("mvaddrawch() - called: y=%d x=%d ch=%d\n", y, x, ch));
- if (move(y, x) == ERR)
- return ERR;
- return waddrawch(stdscr, ch);
- }
- int mvwaddrawch(WINDOW *win, int y, int x, chtype ch)
- {
- PDC_LOG(("mvwaddrawch() - called: win=%p y=%d x=%d ch=%d\n",
- win, y, x, ch));
- if (wmove(win, y, x) == ERR)
- return ERR;
- return waddrawch(win, ch);
- }
- #ifdef PDC_WIDE
- int wadd_wch(WINDOW *win, const cchar_t *wch)
- {
- PDC_LOG(("wadd_wch() - called: win=%p wch=%x\n", win, *wch));
- return wch ? waddch(win, *wch) : ERR;
- }
- int add_wch(const cchar_t *wch)
- {
- PDC_LOG(("add_wch() - called: wch=%x\n", *wch));
- return wadd_wch(stdscr, wch);
- }
- int mvadd_wch(int y, int x, const cchar_t *wch)
- {
- PDC_LOG(("mvaddch() - called: y=%d x=%d wch=%x\n", y, x, *wch));
- if (move(y,x) == ERR)
- return ERR;
- return wadd_wch(stdscr, wch);
- }
- int mvwadd_wch(WINDOW *win, int y, int x, const cchar_t *wch)
- {
- PDC_LOG(("mvwaddch() - called: win=%p y=%d x=%d wch=%d\n",
- win, y, x, *wch));
- if (wmove(win, y, x) == ERR)
- return ERR;
- return wadd_wch(win, wch);
- }
- int echo_wchar(const cchar_t *wch)
- {
- PDC_LOG(("echo_wchar() - called: wch=%x\n", *wch));
- return wecho_wchar(stdscr, wch);
- }
- int wecho_wchar(WINDOW *win, const cchar_t *wch)
- {
- PDC_LOG(("wecho_wchar() - called: win=%p wch=%x\n", win, *wch));
- if (!wch || (wadd_wch(win, wch) == ERR))
- return ERR;
- return wrefresh(win);
- }
- #endif
|