|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T c
Length: 3967 (0xf7f) Types: TextFile Names: »cinput.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit └─⟦e7f64e0c0⟧ »EurOpenD3/mail/vmh.tar.Z« └─⟦dcb95597f⟧ └─⟦this⟧ »lib/cinput.c«
# ifndef lint static char rcsid[] = "$Header: cinput.c,v 1.3 85/12/03 15:59:29 deboor Exp $"; # endif /*LINTLIBRARY*/ # include <sys/types.h> # include <curses.h> /* ** this is a file of routines to substitute for curses' idiotic ** input routines. ** ** wgetch will read one character from the given window in CBREAK mode ** and echo it on the screen, if necessary. ** ** wgetstr will read an entire line from the given window into the ** given string, which is assumed to be long enough to hold it. ** it does kill and erase processing (well, backspacing, anyway) ** but not erase word. yet. ** NOW IT DOES!!!! --ardeb 10/5/85 ** ** sigh. ** ** $Log: cinput.c,v $ ** Revision 1.3 85/12/03 15:59:29 deboor ** I don't know ** ** Revision 1.2 85/10/11 05:47:12 deboor ** ** added comments and word erase and got rid of the ** gotos in wgetstr(). looks slick. ** ** Revision 1.1 85/10/04 23:56:45 deboor ** Initial revision ** ** Revision 1.1 85/04/17 11:46:10 deboor ** Initial revision ** */ wgetch (win) WINDOW *win; { reg char c; short oflags; /* * refresh the thing first (gets the cursor where it's wanted) */ wrefresh (win); /* * save the current tty modes */ oflags = _tty.sg_flags; /* * then set it into cbreak noecho mode...always */ _tty.sg_flags |= CBREAK; _tty.sg_flags &= ~ECHO; ioctl (_tty_ch, TIOCSETN, &_tty); /* * if the window is a screen and it's not allowed to scroll and it's at * the bottom right corner, don't even bother to get a character. */ if (!win->_scroll && (win->_flags&_FULLWIN) && win->_curx == win->_maxx - 1 && win->_cury == win->_maxy - 1) c = ERR; else c = getchar(); /* * if the user wants echo and it's not the erase character, echo it. */ if (_echoit && c != _tty.sg_erase) { waddch(win, c); } /* * if we're echoing and it's the erase character, delete the previous character * and leave the character there. */ if (_echoit && c == _tty.sg_erase) waddstr (win, "\b \b"); /* * reset the tty to its original state */ _tty.sg_flags = oflags; ioctl (_tty_ch, TIOCSETN, &_tty); return (c); } /* ** wgetstr (win, str) WINDOW *win; char *str; */ # define Unput(str) ((--str < ostr) ? ++str,0 : 1) # define NukeC(win) if (_echoit) waddstr (win, "\b \b") wgetstr (win, str) WINDOW *win; reg char *str; { reg int breakout = 0, cx, cy; int bx, by; char *ostr = str; struct ltchars ltc; ioctl (_tty_ch, TIOCGLTC, <c); getyx (win, by, bx); /* * saves the current cursor postion, then gets a new character. * If the character is EOF or ERR or newline or return, breaks out * of the loop. If the character is the erase character, it sees if * wgetch() tried to back up beyond the line (cx == 0). If it did, * it backs up for it, as long as there's somewhere to go. It then * refreshes the screen. If the character is the kill character, it * moves back to the original screen position, clears it to the bottom * of the screen, resets the str pointer to the beginning. */ do { getyx (win, cy, cx); *str = wgetch(win); switch (*str) { case EOF: case ERR: case '\n': case '\r': breakout = 1; break; default: if (*str == _tty.sg_erase) { if (cx == 0) if (win->_cury--) win->_curx = win->_maxx; wrefresh (win); str--; if (str < ostr) { waddstr (win, " \007"); wrefresh (win); str++; } } else if (*str == _tty.sg_kill) { str = ostr; if (_echoit) { wmove (win, by, bx); wclrtobot (win); wrefresh(win); } } else if (*str == ltc.t_werasc) { if ( Unput (str)) { while (*str == ' ' || *str == '\t' && Unput (str)) NukeC(win); while (*str != ' ' && *str != '\t' && Unput (str)) NukeC(win); NukeC(win); if (_echoit) wrefresh (win); } } else str++; } } while ( ! breakout ); *str = '\0'; if (*str != ERR) return (OK); else return (ERR); }