diff options
Diffstat (limited to 'mbbsd')
-rw-r--r-- | mbbsd/pfterm.c | 48 | ||||
-rw-r--r-- | mbbsd/screen.c | 21 |
2 files changed, 61 insertions, 8 deletions
diff --git a/mbbsd/pfterm.c b/mbbsd/pfterm.c index faf2ffd0..08dec655 100644 --- a/mbbsd/pfterm.c +++ b/mbbsd/pfterm.c @@ -72,6 +72,14 @@ #endif // GRAYOUT_DARK ////////////////////////////////////////////////////////////////////////// +// Typeahead +////////////////////////////////////////////////////////////////////////// +#ifndef TYPEAHEAD_NONE +#define TYPEAHEAD_NONE (-1) +#define TYPEAHEAD_STDIN (0) +#endif // TYPEAHEAD + +////////////////////////////////////////////////////////////////////////// // pfterm: piaip's flat terminal system, a new replacement for 'screen'. // pfterm can also be read as "Perfect Term" // @@ -86,10 +94,10 @@ // // Copyright(c) 2007-2008 Hung-Te Lin <piaip@csie.ntu.edu.tw> // All Rights Reserved. -// You are free to use, modify, redistribute this program -// in any non-commercial usage (including network service). -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. +// You are free to use, modify, redistribute this program in any +// non-commercial usage (including network service). +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. // // MAJOR IMPROVEMENTS: // - Interpret ANSI code and maintain a virtual terminal @@ -205,16 +213,20 @@ typedef struct int dirty; int scroll; + // memory allocation + int mrows, mcols; + // raw terminal status int ry, rx; ftattr rattr; - // memory allocation - int mrows, mcols; + // typeahead + char typeahead; // escape command ftchar cmd[FTCMD_MAXLEN+1]; int szcmd; + } FlatTerm; static FlatTerm ft; @@ -331,6 +343,7 @@ void newwin (int nlines, int ncols, int y, int x); void refresh (void); // optimized refresh void doupdate (void); // optimized refresh, ignore input queue void redrawwin (void); // invalidate whole screen +int typeahead (int fd);// prevent refresh if input queue is not empty // scrolling void scroll (void); // scroll up @@ -417,6 +430,9 @@ initscr(void) ft.mi = 1; clrscr(); ft.mi = 0; + // typeahead + ft.typeahead = 1; + fterm_rawclear(); move(0, 0); } @@ -704,11 +720,29 @@ redrawwin(void) fterm_markdirty(); } +int +typeahead(int fd) +{ + switch(fd) + { + case TYPEAHEAD_NONE: + ft.typeahead = 0; + break; + case TYPEAHEAD_STDIN: + ft.typeahead = 1; + break; + default: // shall never reach here + assert(NULL); + break; + } + return 0; +} + void refresh(void) { // prevent passive update - if(fterm_inbuf()) + if(fterm_inbuf() && ft.typeahead) return; doupdate(); } diff --git a/mbbsd/screen.c b/mbbsd/screen.c index 5eee18e4..25ec5c22 100644 --- a/mbbsd/screen.c +++ b/mbbsd/screen.c @@ -13,6 +13,7 @@ static unsigned short cur_ln = 0, cur_col = 0; static unsigned char docls; static unsigned char standing = NA; static int scrollcnt, tc_col, tc_line; +static unsigned char _typeahead = 1; #define MODIFIED (1) /* if line has been modifed, screen output */ #define STANDOUT (2) /* if this line has a standout region */ @@ -205,10 +206,28 @@ redrawwin(void) oflush(); } +int +typeahead(int fd) +{ + switch(fd) + { + case TYPEAHEAD_NONE: + _typeahead = 0; + break; + case TYPEAHEAD_STDIN: + _typeahead = 1; + break; + default: // shall never reach here + assert(NULL); + break; + } + return 0; +} + void refresh(void) { - if (num_in_buf()) + if (num_in_buf() && _typeahead) return; doupdate(); } |