| 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
 
 
  |