Back to index

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

Go to the source code of this file.

Functions

static char * WipeOut (WINDOW *win, int y, int x, char *first, char *last, bool echoed)
 wgetnstr_events (WINDOW *win, char *str, int maxlen, EVENTLIST_1st(_nc_eventlist *evl))

Function Documentation

wgetnstr_events ( WINDOW win,
char *  str,
int  maxlen,
EVENTLIST_1st(_nc_eventlist *evl)   
)

Definition at line 73 of file lib_getstr.c.

{
    TTY buf;
    bool oldnl, oldecho, oldraw, oldcbreak;
    char erasec;
    char killc;
    char *oldstr;
    int ch;
    int y, x;

    T((T_CALLED("wgetnstr(%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();

    oldstr = str;
    getyx(win, y, x);

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

    while ((ch = wgetch_events(win, evl)) != ERR) {
       /*
        * 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 wgetch();
        * terminating *getstr() with \n should work either way.
        */
       if (ch == '\n'
           || ch == '\r'
           || ch == KEY_DOWN
           || ch == KEY_ENTER) {
           if (oldecho == TRUE
              && win->_cury == win->_maxy
              && win->_scroll)
              wechochar(win, (chtype) '\n');
           break;
       }
#ifdef KEY_EVENT
       if (ch == KEY_EVENT)
           break;
#endif
       if (ch == erasec || ch == KEY_LEFT || ch == KEY_BACKSPACE) {
           if (str > oldstr) {
              str = WipeOut(win, y, x, oldstr, str, oldecho);
           }
       } else if (ch == killc) {
           while (str > oldstr) {
              str = WipeOut(win, y, x, oldstr, str, oldecho);
           }
       } else if (ch >= KEY_MIN
                 || (maxlen >= 0 && str - oldstr >= maxlen)) {
           beep();
       } else {
           *str++ = ch;
           if (oldecho == TRUE) {
              int oldy = win->_cury;
              if (waddch(win, (chtype) ch) == 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) ' ');
                  str = WipeOut(win, y, x, oldstr, str, 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;

    _nc_set_tty_mode(&buf);

    *str = '\0';
    if (ch == ERR)
       returnCode(ch);
#ifdef KEY_EVENT
    if (ch == KEY_EVENT)
       returnCode(ch);
#endif

    T(("wgetnstr returns %s", _nc_visbuf(oldstr)));

    returnCode(OK);
}

Here is the call graph for this function:

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

Definition at line 51 of file lib_getstr.c.

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

           wmove(win, y, x);
           waddstr(win, first);
           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: