Back to index

tetex-bin  3.0
Functions
lib_get_wstr.c File Reference
#include <curses.priv.h>
#include <term.h>

Go to the source code of this file.

Functions

static int wadd_wint (WINDOW *win, wint_t *src)
static wint_t * WipeOut (WINDOW *win, int y, int x, wint_t *first, wint_t *last, bool echoed)
 wgetn_wstr (WINDOW *win, wint_t *str, int maxlen)

Function Documentation

static int wadd_wint ( WINDOW win,
wint_t *  src 
) [static]

Definition at line 46 of file lib_get_wstr.c.

{
    cchar_t tmp;
    wchar_t wch[2];

    wch[0] = *src;
    wch[1] = 0;
    setcchar(&tmp, wch, A_NORMAL, 0, NULL);
    return wadd_wch(win, &tmp);
}

Here is the call graph for this function:

Here is the caller graph for this function:

wgetn_wstr ( WINDOW win,
wint_t *  str,
int  maxlen 
)

Definition at line 87 of file lib_get_wstr.c.

{
    TTY buf;
    bool oldnl, oldecho, oldraw, oldcbreak;
    wint_t erasec;
    wint_t killc;
    wint_t *oldstr = str;
    wint_t *tmpstr = str;
    wint_t ch;
    int y, x, code;

    T((T_CALLED("wgetn_wstr(%p,%p, %d)"), win, str, maxlen));

    if (!win)
       returnCode(ERR);

    _nc_get_tty_mode(&buf);

    oldnl = SP->_nl;
    oldecho = SP->_echo;
    oldraw = SP->_raw;
    oldcbreak = SP->_cbreak;
    nl();
    noecho();
    noraw();
    cbreak();

    erasec = erasechar();
    killc = killchar();

    getyx(win, y, x);

    if (is_wintouched(win) || (win->_flags & _HASMOVED))
       wrefresh(win);

    while ((code = wget_wch(win, &ch)) != ERR) {
       /*
        * Map special characters into key-codes.
        */
       if (ch == '\r')
           ch = '\n';
       if (ch == '\n') {
           code = KEY_CODE_YES;
           ch = KEY_ENTER;
       }
       if (ch < KEY_MIN) {
           if (ch == erasec) {
              ch = KEY_BACKSPACE;
              code = KEY_CODE_YES;
           }
           if (ch == killc) {
              ch = KEY_EOL;
              code = KEY_CODE_YES;
           }
       }
       if (code == KEY_CODE_YES) {
           /*
            * Some terminals (the Wyse-50 is the most common) generate a \n
            * from the down-arrow key.  With this logic, it's the user's
            * choice whether to set kcud=\n for wget_wch(); terminating
            * *getn_wstr() with \n should work either way.
            */
           if (ch == KEY_DOWN || ch == KEY_ENTER) {
              if (oldecho == TRUE
                  && win->_cury == win->_maxy
                  && win->_scroll)
                  wechochar(win, (chtype) '\n');
              break;
           }
           if (ch == KEY_LEFT || ch == KEY_BACKSPACE) {
              if (tmpstr > oldstr) {
                  tmpstr = WipeOut(win, y, x, oldstr, tmpstr, oldecho);
              }
           } else if (ch == KEY_EOL) {
              while (tmpstr > oldstr) {
                  tmpstr = WipeOut(win, y, x, oldstr, tmpstr, oldecho);
              }
           } else {
              beep();
           }
       } else if (maxlen >= 0 && tmpstr - oldstr >= maxlen) {
           beep();
       } else {
           *tmpstr++ = ch;
           *tmpstr = 0;
           if (oldecho == TRUE) {
              int oldy = win->_cury;

              if (wadd_wint(win, tmpstr - 1) == ERR) {
                  /*
                   * We can't really use the lower-right corner for input,
                   * since it'll mess up bookkeeping for erases.
                   */
                  win->_flags &= ~_WRAPPED;
                  waddch(win, (chtype) ' ');
                  tmpstr = WipeOut(win, y, x, oldstr, tmpstr, oldecho);
                  continue;
              } else if (win->_flags & _WRAPPED) {
                  /*
                   * If the last waddch forced a wrap & scroll, adjust our
                   * reference point for erasures.
                   */
                  if (win->_scroll
                     && oldy == win->_maxy
                     && win->_cury == win->_maxy) {
                     if (--y <= 0) {
                         y = 0;
                     }
                  }
                  win->_flags &= ~_WRAPPED;
              }
              wrefresh(win);
           }
       }
    }

    win->_curx = 0;
    win->_flags &= ~_WRAPPED;
    if (win->_cury < win->_maxy)
       win->_cury++;
    wrefresh(win);

    /* Restore with a single I/O call, to fix minor asymmetry between
     * raw/noraw, etc.
     */
    SP->_nl = oldnl;
    SP->_echo = oldecho;
    SP->_raw = oldraw;
    SP->_cbreak = oldcbreak;

    (void) _nc_set_tty_mode(&buf);

    *tmpstr = 0;
    if (code == ERR) {
       if (tmpstr == oldstr) {
           *tmpstr++ = WEOF;
           *tmpstr = 0;
       }
       returnCode(ERR);
    }

    T(("wgetn_wstr returns %s", _nc_viswibuf(oldstr)));

    returnCode(OK);
}

Here is the call graph for this function:

static wint_t* WipeOut ( WINDOW win,
int  y,
int  x,
wint_t *  first,
wint_t *  last,
bool  echoed 
) [static]

Definition at line 62 of file lib_get_wstr.c.

{
    if (last > first) {
       *--last = '\0';
       if (echoed) {
           int y1 = win->_cury;
           int x1 = win->_curx;
           int n;

           wmove(win, y, x);
           for (n = 0; first[n] != 0; ++n) {
              wadd_wint(win, first + n);
           }
           getyx(win, y, x);
           while (win->_cury < y1
                 || (win->_cury == y1 && win->_curx < x1))
              waddch(win, (chtype) ' ');

           wmove(win, y, x);
       }
    }
    return last;
}

Here is the call graph for this function:

Here is the caller graph for this function: