From adb151ee3c9d0ff9f614e540d786e7de541616cf Mon Sep 17 00:00:00 2001 From: deuce <> Date: Wed, 7 Jul 2004 07:29:12 +0000 Subject: [PATCH] Remove OpenDoors in favour of new stdio ANSI personality. --- src/conio/Common.gmake | 12 +- src/conio/ansi_cio.c | 593 +++++++++++++++++++++++++++++++++++++++++ src/conio/ansi_cio.h | 29 ++ src/conio/conio.c | 43 ++- src/conio/conio.h | 2 +- src/conio/od_cio.c | 365 ------------------------- src/conio/od_cio.h | 29 -- src/conio/x_cio.c | 10 +- 8 files changed, 654 insertions(+), 429 deletions(-) create mode 100644 src/conio/ansi_cio.c create mode 100644 src/conio/ansi_cio.h delete mode 100644 src/conio/od_cio.c delete mode 100644 src/conio/od_cio.h diff --git a/src/conio/Common.gmake b/src/conio/Common.gmake index 140ed4b381..db727ba306 100644 --- a/src/conio/Common.gmake +++ b/src/conio/Common.gmake @@ -3,12 +3,10 @@ # XCURSES = Use XCurses # NEED_CIOWRAP = Set flage suitable for using with ciowrap lib # NO_X = Don't use X version of ciowrap -# INCLUDE_OPENDOOR = Include support for OpenDoors library # You really should set this first. CONIO_SRC ?= $(XPDEV)../conio/ UIFC_SRC ?= $(XPDEV)../uifc/ -OPENDOOR_SRC ?= $(XPDEV)../odoors/ CIOWRAP_CFLAGS += -I$(CONIO_SRC) # ciowrap stuff @@ -20,11 +18,11 @@ ifndef NO_X else CIOWRAP_CFLAGS += -DNO_X endif -#ifdef INCLUDE_OPENDOOR - CIOWRAP_OBJS += $(LIBODIR)/od_cio.o - CIOWRAP_CFLAGS += -I$(OPENDOOR_SRC) -DINCLUDE_OPENDOOR - CIOWRAP_LDFLAGS += -L$(OPENDOOR_SRC) -lODoors -#endif +ifdef USE_ANSI + CIOWRAP_CFLAGS += -DUSE_ANSI + CIOWRAP_LDFLAGS += -pthread + CIOWRAP_OBJS += $(LIBODIR)/ansi_cio.o $(LIBODIR)/threadwrap.o +endif CIOWRAP_OBJS += $(LIBODIR)/curs_cio.o $(LIBODIR)/conio.o CIOWRAP_CFLAGS += -I$(UIFC_SRC) diff --git a/src/conio/ansi_cio.c b/src/conio/ansi_cio.c new file mode 100644 index 0000000000..9e3322479a --- /dev/null +++ b/src/conio/ansi_cio.c @@ -0,0 +1,593 @@ +#include <fcntl.h> +#include <stdarg.h> + +#include <genwrap.h> +#include <threadwrap.h> + +#ifdef __unix__ +#include <termios.h> +#endif + +#include "conio.h" +#include "ansi_cio.h" +WORD ansi_curr_attr=0x07<<8; + +int ansi_rows=24; +int ansi_cols=80; +int ansi_nextchar; +int ansi_got_row=0; +int ansi_got_col=0; +int ansi_esc_delay=25; + +const int ansi_tabs[10]={9,17,25,33,41,49,57,65,73,80}; +const int ansi_colours[8]={0,4,2,6,1,5,3,7}; +static WORD ansi_inch; +static char ansi_raw_inch; +struct termios tio_default; /* Initial term settings */ +WORD *vmem; +int ansi_row=0; +int ansi_col=0; +int force_move=1; + +/* Control sequence table definitions. */ +typedef struct +{ + char *pszSequence; + int chExtendedKey; +} tODKeySequence; + +#define ANSI_KEY_UP 72<<8 +#define ANSI_KEY_DOWN 80<<8 +#define ANSI_KEY_RIGHT 0x4d<<8 +#define ANSI_KEY_LEFT 0x4b<<8 +#define ANSI_KEY_HOME 0x47<<8 +#define ANSI_KEY_END 0x4f<<8 +#define ANSI_KEY_F1 0x3b<<8 +#define ANSI_KEY_F2 0x3c<<8 +#define ANSI_KEY_F3 0x3d<<8 +#define ANSI_KEY_F4 0x3e<<8 +#define ANSI_KEY_F5 0x3f<<8 +#define ANSI_KEY_F6 0x40<<8 +#define ANSI_KEY_F7 0x41<<8 +#define ANSI_KEY_F8 0x42<<8 +#define ANSI_KEY_F9 0x43<<8 +#define ANSI_KEY_F10 0x44<<8 +#define ANSI_KEY_PGUP 0x49<<8 +#define ANSI_KEY_PGDN 0x51<<8 +#define ANSI_KEY_INSERT 0x52<<8 +#define ANSI_KEY_DELETE 0x53<<8 + +tODKeySequence aKeySequences[] = +{ + /* VT-52 control sequences. */ + {"\033A", ANSI_KEY_UP}, + {"\033B", ANSI_KEY_DOWN}, + {"\033C", ANSI_KEY_RIGHT}, + {"\033D", ANSI_KEY_LEFT}, + {"\033H", ANSI_KEY_HOME}, + {"\033K", ANSI_KEY_END}, + {"\033P", ANSI_KEY_F1}, + {"\033Q", ANSI_KEY_F2}, + {"\033?w", ANSI_KEY_F3}, + {"\033?x", ANSI_KEY_F4}, + {"\033?t", ANSI_KEY_F5}, + {"\033?u", ANSI_KEY_F6}, + {"\033?q", ANSI_KEY_F7}, + {"\033?r", ANSI_KEY_F8}, + {"\033?p", ANSI_KEY_F9}, + + /* Control sequences common to VT-100/VT-102/VT-220/VT-320/ANSI. */ + {"\033[A", ANSI_KEY_UP}, + {"\033[B", ANSI_KEY_DOWN}, + {"\033[C", ANSI_KEY_RIGHT}, + {"\033[D", ANSI_KEY_LEFT}, + {"\033[M", ANSI_KEY_PGUP}, + {"\033[H\x1b[2J", ANSI_KEY_PGDN}, + {"\033[H", ANSI_KEY_HOME}, + {"\033[K", ANSI_KEY_END}, + {"\033OP", ANSI_KEY_F1}, + {"\033OQ", ANSI_KEY_F2}, + {"\033OR", ANSI_KEY_F3}, + {"\033OS", ANSI_KEY_F4}, + + /* VT-220/VT-320 specific control sequences. */ + {"\033[17~", ANSI_KEY_F6}, + {"\033[18~", ANSI_KEY_F7}, + {"\033[19~", ANSI_KEY_F8}, + {"\033[20~", ANSI_KEY_F9}, + {"\033[21~", ANSI_KEY_F10}, + + /* ANSI-specific control sequences. */ + {"\033[L", ANSI_KEY_HOME}, + {"\033Ow", ANSI_KEY_F3}, + {"\033Ox", ANSI_KEY_F4}, + {"\033Ot", ANSI_KEY_F5}, + {"\033Ou", ANSI_KEY_F6}, + {"\033Oq", ANSI_KEY_F7}, + {"\033Or", ANSI_KEY_F8}, + {"\033Op", ANSI_KEY_F9}, + + /* PROCOMM-specific control sequences (non-keypad alternatives). */ + {"\033OA", ANSI_KEY_UP}, + {"\033OB", ANSI_KEY_DOWN}, + {"\033OC", ANSI_KEY_RIGHT}, + {"\033OD", ANSI_KEY_LEFT}, + {"\033OH", ANSI_KEY_HOME}, + {"\033OK", ANSI_KEY_END}, + + /* Terminator */ + {"",0} +}; + +void ansi_sendch(char ch) +{ + struct text_info ti; + + if(!ch) + ch=' '; + if(ansi_row<ansi_rows-1 || ansi_col<ansi_cols-1) { + fwrite(&ch,1,1,stdout); + if(ch<' ') + force_move=1; + } +} + +void ansi_sendstr(char *str,int len) +{ + if(len==-1) + len=strlen(str); + fwrite(str,len,1,stdout); +} + +int ansi_puttext(int sx, int sy, int ex, int ey, unsigned char *fill) +{ + int x,y; + unsigned char *out; + WORD sch; + struct text_info ti; + int attrib; + + gettextinfo(&ti); + + if( sx < 1 + || sy < 1 + || ex < 1 + || ey < 1 + || sx > ti.screenwidth + || sy > ti.screenheight + || sx > ex + || sy > ey + || ex > ti.screenwidth + || ey > ti.screenheight + || fill==NULL) + return(0); + + out=fill; + attrib=ti.attribute; + if((ey-sy+1)*(ex-sx+1)>32) + force_move=1; + for(y=sy-1;y<ey;y++) { + for(x=sx-1;x<ex;x++) { + sch=*(out++); + if(sch==27) + sch=' '; + if(sch==0) + sch=' '; + sch |= (*(out++))<<8; + if(vmem[y*ansi_cols+x]==sch) + continue; + vmem[y*ansi_cols+x]=sch; + ansi_gotoxy(x+1,y+1); + if(attrib!=sch>>8) { + textattr(sch>>8); + attrib=sch>>8; + } + ansi_sendch(sch&0xff); + ansi_col++; + if(ansi_col>=ansi_cols) { + ansi_col=0; + ansi_row++; + if(ansi_row>=ansi_rows) { + ansi_col=ansi_cols-1; + ansi_row=ansi_rows-1; + } + } + } + } + + if((ey-sy+1)*(ex-sx+1)>32) + force_move=1; + gotoxy(ti.curx,ti.cury); + if(attrib!=ti.attribute) + textattr(ti.attribute); +} + +int ansi_gettext(int sx, int sy, int ex, int ey, unsigned char *fill) +{ + int x,y; + unsigned char *out; + WORD sch; + struct text_info ti; + + gettextinfo(&ti); + + if( sx < 1 + || sy < 1 + || ex < 1 + || ey < 1 + || sx > ti.screenwidth + || sy > ti.screenheight + || sx > ex + || sy > ey + || ex > ti.screenwidth + || ey > ti.screenheight + || fill==NULL) + return(0); + + out=fill; + for(y=sy-1;y<ey;y++) { + for(x=sx-1;x<ex;x++) { + sch=vmem[y*ansi_cols+x]; + *(out++)=sch & 0xff; + *(out++)=sch >> 8; + } + } +} + +void ansi_textattr(unsigned char attr) +{ + char str[16]; + int fg,ofg; + int bg,obg; + int bl,obl; + int br,obr; + int oa; + + bl=attr>>7; + bg=(attr>>4)&0x7; + fg=attr&0x07; + br=(attr>>3)&0x01; + + oa=ansi_curr_attr>>8; + obl=oa>>7; + obg=(oa>>4)&0x7; + ofg=oa&0x07; + obr=(oa>>3)&0x01; + + ansi_curr_attr=attr<<8; + ansi_sendstr(str,sprintf(str,"%c[%d;%d;3%d;4%dm",27,bl?0:5,br?1:2,ansi_colours[fg],ansi_colours[bg])); +} + +static void ansi_keyparse(void *par) +{ + int gotesc=0; + char seq[64]; + int ch; + int waited=0; + int i; + char *p; + + for(;;) { + while(!ansi_raw_inch + && (gotesc || (!gotesc && !seq[0]))) { + waited++; + if(waited>=ansi_esc_delay) { + waited=0; + gotesc=0; + } + else + SLEEP(1); + } + if(!gotesc && seq[0]) { + while(ansi_inch) + SLEEP(1); + ch=seq[0]; + for(p=seq;*p;*p=*(++p)); + ansi_inch=ch; + continue; + } + else { + ch=ansi_raw_inch; + ansi_raw_inch=0; + } + switch(gotesc) { + case 1: /* Escape */ + waited=0; + if(strlen(seq)>=sizeof(seq)-2) { + gotesc=0; + break; + } + seq[strlen(seq)+1]=0; + seq[strlen(seq)]=ch; + if((ch<'0' || ch>'9') /* End of ESC sequence */ + && ch!=';' + && ch!='?' + && (strlen(seq)==2?ch != '[':1) + && (strlen(seq)==2?ch != 'O':1)) { + for(i=0;aKeySequences[i].pszSequence[0];i++) { + if(!strcmp(seq,aKeySequences[i].pszSequence)) { + gotesc=0; + seq[0]=0; + while(ansi_inch) + SLEEP(1); + ansi_inch=aKeySequences[i].chExtendedKey; + break; + } + } + if(!aKeySequences[i].pszSequence[0]) + gotesc=0; + } + break; + default: + if(ch==27) { + seq[0]=27; + seq[1]=0; + gotesc=1; + waited=0; + break; + } + while(ansi_inch) + SLEEP(1); + ansi_inch=ch; + break; + } + } +} + +static void ansi_keythread(void *params) +{ + _beginthread(ansi_keyparse,1024,NULL); + + for(;;) { + if(!ansi_raw_inch) + ansi_raw_inch=fgetc(stdin); + else + SLEEP(1); + } +} + +int ansi_kbhit(void) +{ + return(ansi_inch); +} + +void ansi_delay(long msec) +{ + SLEEP(msec); +} + +int ansi_wherey(void) +{ + return(ansi_row+1); +} + +int ansi_wherex(void) +{ + return(ansi_col+1); +} + +/* Put the character _c on the screen at the current cursor position. + * The special characters return, linefeed, bell, and backspace are handled + * properly, as is line wrap and scrolling. The cursor position is updated. + */ +int ansi_putch(unsigned char ch) +{ + struct text_info ti; + WORD sch; + int i; + char buf[2]; + + buf[0]=ch; + buf[1]=ansi_curr_attr>>8; + + gettextinfo(&ti); + + switch(ch) { + case '\r': + gotoxy(1,wherey()); + break; + case '\n': + if(wherey()==ti.winbottom-ti.wintop+1) + wscroll(); + else + gotoxy(wherex(),wherey()+1); + break; + case '\b': + if(ansi_col>ti.winleft-1) { + buf[0]=' '; + gotoxy(wherex()-1,wherey()); + puttext(ansi_col+1,ansi_row+1,ansi_col+1,ansi_row+1,buf); + } + break; + case 7: /* Bell */ + ansi_sendch(7); + break; + case '\t': + for(i=0;i<10;i++) { + if(ansi_tabs[i]>ansi_col+1) { + while(ansi_col+1<ansi_tabs[i]) { + putch(' '); + } + break; + } + } + if(i==10) { + putch('\r'); + putch('\n'); + } + break; + default: + if(wherey()==ti.winbottom-ti.wintop+1 + && wherex()==ti.winright-ti.winleft+1) { + gotoxy(1,wherey()); + puttext(ansi_col+1,ansi_row+1,ansi_col+1,ansi_row+1,buf); + wscroll(); + } + else { + if(wherex()==ti.winright-ti.winleft+1) { + gotoxy(1,ti.cury+1); + puttext(ansi_col+1,ansi_row+1,ansi_col+1,ansi_row+1,buf); + } + else { + gotoxy(ti.curx+1,ti.cury); + puttext(ansi_col+1,ansi_row+1,ansi_col+1,ansi_row+1,buf); + } + } + break; + } + + return(ch); +} + +void ansi_gotoxy(int x, int y) +{ + struct text_info ti; + char str[16]; + + if(x < 1 + || x > ansi_cols + || y < 1 + || y > ansi_rows) + return; + + if(force_move) { + force_move=0; + sprintf(str,"%c[%d;%dH",27,y,x); + } + else { + if(x==1 && ansi_col != 0) { + ansi_sendch('\r'); + force_move=0; + ansi_col=0; + } + if(x==ansi_col+1) { + if(y==ansi_row+1) { + str[0]=0; + } + else { + if(y<ansi_row+1) { + if(y==ansi_row) + strcpy(str,"\033[A"); + else + sprintf(str,"%c[%dA",27,ansi_row+1-y); + } + else { + if(y==ansi_row+2) + strcpy(str,"\033[B"); + else + sprintf(str,"%c[%dB",27,y-ansi_row-1); + } + } + } + else { + if(y==ansi_row+1) { + if(x<ansi_col+1) { + if(x==ansi_col) + strcpy(str,"\033[D"); + else + sprintf(str,"%c[%dD",27,ansi_col+1-x); + } + else { + if(x==ansi_col+2) + strcpy(str,"\033[C"); + else + sprintf(str,"%c[%dC",27,x-ansi_col-1); + } + } + else { + sprintf(str,"%c[%d;%dH",27,y,x); + } + } + } + + ansi_sendstr(str,-1); + ansi_row=y-1; + ansi_col=x-1; +} + +void ansi_gettextinfo(struct text_info *info) +{ + info->currmode=3; + info->screenheight=ansi_rows; + info->screenwidth=ansi_cols; + info->curx=wherex(); + info->cury=wherey(); + info->attribute=ansi_curr_attr>>8; +} + +void ansi_setcursortype(int type) +{ + switch(type) { + case _NOCURSOR: + case _SOLIDCURSOR: + default: + break; + } +} + +int ansi_getch(void) +{ + int ch; + + while(!ansi_inch) + SLEEP(1); + ch=ansi_inch&0xff; + ansi_inch=ansi_inch>>8; + return(ch); +} + +int ansi_getche(void) +{ + int ch; + + if(ansi_nextchar) + return(ansi_getch()); + ch=ansi_getch(); + if(ch) + putch(ch); + return(ch); +} + +int ansi_beep(void) +{ + putch(7); + return(0); +} + +void ansi_textmode(int mode) +{ +} + +#ifdef __unix__ +void ansi_fixterm(void) +{ + tcsetattr(STDIN_FILENO,TCSANOW,&tio_default); +} +#endif + +void ansi_initciowrap(long inmode) +{ + int i; + char *init="\033[2J\033[1;1H\033[0m"; +#ifdef _WIN32 + _setmode(fileno(stdout),_O_BINARY); + _setmode(fileno(stdin),_O_BINARY); + setvbuf(stdout, NULL, _IONBF, 0); +#else + struct termios tio_raw; + + if (isatty(STDIN_FILENO)) { + tcgetattr(STDIN_FILENO,&tio_default); + tio_raw = tio_default; + cfmakeraw(&tio_raw); + tcsetattr(STDIN_FILENO,TCSANOW,&tio_raw); + setvbuf(stdout, NULL, _IONBF, 0); + atexit(ansi_fixterm); + } +#endif + vmem=(WORD *)malloc(ansi_rows*ansi_cols*sizeof(WORD)); + ansi_sendstr(init,-1); + for(i=0;i<ansi_rows*ansi_cols;i++) + vmem[i]=0x0720; + _beginthread(ansi_keythread,1024,NULL); +} diff --git a/src/conio/ansi_cio.h b/src/conio/ansi_cio.h new file mode 100644 index 0000000000..921d8828d0 --- /dev/null +++ b/src/conio/ansi_cio.h @@ -0,0 +1,29 @@ +/* $Id$ */ + +#ifdef __unix__ +#include "conio.h" + +#ifdef __cplusplus +extern "C" { +#endif +int ansi_puttext(int sx, int sy, int ex, int ey, unsigned char *fill); +int ansi_gettext(int sx, int sy, int ex, int ey, unsigned char *fill); +void ansi_textattr(unsigned char attr); +int ansi_kbhit(void); +void ansi_delay(long msec); +int ansi_wherey(void); +int ansi_wherex(void); +int ansi_putch(unsigned char ch); +void ansi_gotoxy(int x, int y); +void ansi_initciowrap(long inmode); +void ansi_gettextinfo(struct text_info *info); +void ansi_setcursortype(int type); +int ansi_getch(void); +int ansi_getche(void); +int ansi_beep(void); +void ansi_textmode(int mode); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/conio/conio.c b/src/conio/conio.c index d3e461eef9..0ecb89f73a 100644 --- a/src/conio/conio.c +++ b/src/conio/conio.c @@ -11,8 +11,8 @@ #undef getch #endif -#ifdef INCLUDE_OPENDOOR - #include "od_cio.h" +#ifdef USE_ANSI + #include "ansi_cio.h" #endif cioapi_t cio_api; @@ -50,25 +50,24 @@ void initciowrap(int mode) fprintf(stderr,"X init failed\n"); #endif /* NO_X */ #endif /* !(_WIN32) */ - -#ifdef INCLUDE_OPENDOOR - OD_initciowrap(mode); - cio_api.mode=OPENDOOR_MODE; - cio_api.puttext=OD_puttext; - cio_api.gettext=OD_gettext; - cio_api.textattr=OD_textattr; - cio_api.kbhit=OD_kbhit; - cio_api.delay=OD_delay; - cio_api.wherey=OD_wherey; - cio_api.wherex=OD_wherex; - cio_api.putch=OD_putch; - cio_api.gotoxy=OD_gotoxy; - cio_api.gettextinfo=OD_gettextinfo; - cio_api.setcursortype=OD_setcursortype; - cio_api.getch=OD_getch; - cio_api.getche=OD_getche; - cio_api.beep=OD_beep; - cio_api.textmode=OD_textmode; +#ifdef USE_ANSI + ansi_initciowrap(mode); + cio_api.mode=ANSI_MODE; + cio_api.puttext=ansi_puttext; + cio_api.gettext=ansi_gettext; + cio_api.textattr=ansi_textattr; + cio_api.kbhit=ansi_kbhit; + cio_api.delay=ansi_delay; + cio_api.wherey=ansi_wherey; + cio_api.wherex=ansi_wherex; + cio_api.putch=ansi_putch; + cio_api.gotoxy=ansi_gotoxy; + cio_api.gettextinfo=ansi_gettextinfo; + cio_api.setcursortype=ansi_setcursortype; + cio_api.getch=ansi_getch; + cio_api.getche=ansi_getche; + cio_api.beep=ansi_beep; + cio_api.textmode=ansi_textmode; #else #ifndef _WIN32 curs_initciowrap(mode); @@ -89,7 +88,7 @@ void initciowrap(int mode) cio_api.beep=beep; cio_api.textmode=curs_textmode; #endif /* !(_WIN32) */ -#endif +#endif /* ANSI */ #ifndef _WIN32 #ifndef NO_X } diff --git a/src/conio/conio.h b/src/conio/conio.h index 4717b672d2..da8fd1b80f 100644 --- a/src/conio/conio.h +++ b/src/conio/conio.h @@ -59,7 +59,7 @@ enum { X_MODE ,CURSES_MODE - ,OPENDOOR_MODE + ,ANSI_MODE }; struct text_info { diff --git a/src/conio/od_cio.c b/src/conio/od_cio.c deleted file mode 100644 index 0597a97007..0000000000 --- a/src/conio/od_cio.c +++ /dev/null @@ -1,365 +0,0 @@ -#include <stdarg.h> -#include <stdio.h> -#include <OpenDoor.h> - -#include "conio.h" -#include "od_cio.h" - -unsigned int OD_nextch; -int OD_attr; -const int OD_tabs[10]={9,17,25,33,41,49,57,65,73,80}; - -int OD_puttext(int sx, int sy, int ex, int ey, unsigned char *fill) -{ - struct text_info ti; - - gettextinfo(&ti); - if( sx < 1 - || sx > ti.screenwidth - || sy < 1 - || sy > ti.screenheight - || ex < sx - || ey < sy - || ex < 1 - || ex > ti.screenwidth - || ey < 1 - || ey > ti.screenheight) - return(0); - - return(od_puttext(sx,sy,ex,ey,fill)); -} - -int OD_gettext(int sx, int sy, int ex, int ey, unsigned char *fill) -{ - struct text_info ti; - - gettextinfo(&ti); - if( sx < 1 - || sx > ti.screenwidth - || sy < 1 - || sy > ti.screenheight - || ex < sx - || ey < sy - || ex < 1 - || ex > ti.screenwidth - || ey < 1 - || ey > ti.screenheight) - return(0); - - return(od_gettext(sx,sy,ex,ey,fill)); -} - -void OD_textattr(unsigned char attr) -{ - OD_attr=attr; - od_set_attrib(attr); -} - -int parsekey(int ch) -{ - switch(ch) { - case OD_KEY_F1: - OD_nextch=0x3b<<8; - break; - - case OD_KEY_F2: - OD_nextch=0x3c<<8; - break; - - case OD_KEY_F3: - OD_nextch=0x3d<<8; - break; - - case OD_KEY_F4: - OD_nextch=0x3e<<8; - break; - - case OD_KEY_F5: - OD_nextch=0x3f<<8; - break; - - case OD_KEY_F6: - OD_nextch=0x40<<8; - break; - - case OD_KEY_F7: - OD_nextch=0x41<<8; - break; - - case OD_KEY_F8: - OD_nextch=0x42<<8; - break; - - case OD_KEY_F9: - OD_nextch=0x43<<8; - break; - - case OD_KEY_F10: - OD_nextch=0x44<<8; - break; - - case OD_KEY_UP: - OD_nextch=0x48<<8; - break; - - case OD_KEY_DOWN: - OD_nextch=0x50<<8; - break; - - case OD_KEY_LEFT: - OD_nextch=0x4b<<8; - break; - - case OD_KEY_RIGHT: - OD_nextch=0x4d<<8; - break; - - case OD_KEY_INSERT: - OD_nextch=0x52<<8; - break; - - case OD_KEY_DELETE: - OD_nextch=0x53<<8; - break; - - case OD_KEY_HOME: - OD_nextch=0x47<<8; - break; - - case OD_KEY_END: - OD_nextch=0x4f<<8; - break; - - case OD_KEY_PGUP: - OD_nextch=0x49<<8; - break; - - case OD_KEY_PGDN: - OD_nextch=0x51<<8; - break; - - case OD_KEY_SHIFTTAB: - OD_nextch=0; - break; - } -} - -int OD_kbhit(void) -{ - int ch; - tODInputEvent ie; - - if(OD_nextch) - return(1); - - if(!od_get_input(&ie,5,GETIN_NORMAL)) - return(0); - - if(ie.EventType==EVENT_CHARACTER) { - OD_nextch=ie.chKeyPress; - return(1); - } - - parsekey(ie.chKeyPress); - - if(OD_nextch) - return(1); - - return(0); -} - -void OD_delay(long msec) -{ - usleep(msec*1000); -} - -int OD_wherey(void) -{ - int row,col; - struct text_info ti; - - od_get_cursor(&row,&col); - return(row); -} - -int OD_wherex(void) -{ - int row,col; - struct text_info ti; - - od_get_cursor(&row,&col); - return(col); -} - -/* Put the character _c on the screen at the current cursor position. - * The special characters return, linefeed, bell, and backspace are handled - * properly, as is line wrap and scrolling. The cursor position is updated. - */ -int OD_putch(unsigned char ch) -{ - struct text_info ti; - int ret; - int i; - - ret=ch; - switch(ch) { - case '\r': - gotoxy(1,wherey()); - break; - case '\n': - gettextinfo(&ti); - if(wherey()==ti.winbottom-ti.wintop+1) { - wscroll(); - } - else { - gotoxy(wherex(),wherey()+1); - } - break; - case 0x07: - cio_api.beep(); - break; - case 0x08: - gotoxy(wherex()-1,wherey()); - putch(' '); - gotoxy(wherex()-1,wherey()); - break; - case '\t': - for(i=0;i<10;i++) { - if(OD_tabs[i]>wherex()) { - while(wherex()<OD_tabs[i]) { - putch(' '); - } - break; - } - } - if(i==10) { - putch('\r'); - putch('\n'); - } - break; - default: - gettextinfo(&ti); - if(OD_wherey()==ti.screenheight - && OD_wherex()==ti.screenwidth) { - if(_wscroll) { - od_putch(ch); - gotoxy(ti.winleft,ti.cury); - } - } - else { - if(wherey()==ti.winbottom-ti.wintop+1 - && wherex()==ti.winright-ti.winleft+1) { - od_putch(ch); - wscroll(); - gotoxy(ti.winleft,ti.cury); - } - else { - if(wherex()==ti.winright-ti.winleft+1) { - od_putch(ch); - gotoxy(ti.winleft,ti.cury+1); - } - else { - od_putch(ch); - gotoxy(ti.curx+1,ti.cury); - } - } - } - break; - } - - return(ch); -} - -void OD_gotoxy(int x, int y) -{ - struct text_info ti; - char ansi[16]; - - gettextinfo(&ti); - - if(x>ti.screenwidth - || x < 1 - || y>ti.screenheight - || y<1) - return; - - sprintf(ansi,"%c[%d;%dH",27,y,x); - od_set_cursor(y,x); -} - -void OD_gettextinfo(struct text_info *info) -{ - info->currmode=3; - info->screenheight=od_control.user_screen_length?od_control.user_screen_length:23; - info->screenwidth=od_control.user_screenwidth?od_control.user_screenwidth:80; - info->curx=wherex(); - info->cury=wherey(); - info->attribute=OD_attr; -} - -void OD_setcursortype(int type) -{ -} - -int OD_getch(void) -{ - int ch; - tODInputEvent ie; - - while(1) { - if(OD_nextch) { - ch=OD_nextch&0xff; - OD_nextch>>=8; - return(ch); - } - - od_get_input(&ie,OD_NO_TIMEOUT,GETIN_NORMAL); - - if(ie.EventType==EVENT_CHARACTER) { - return(ie.chKeyPress); - } - - parsekey(ie.chKeyPress); - } -} - -int OD_getche(void) -{ - int ch; - - if(OD_nextch) - return(OD_getch()); - ch=OD_getch(); - if(ch) - putch(ch); - return(ch); -} - -int OD_beep(void) -{ - od_putch(7); - return(0); -} - -void OD_textmode(int mode) -{ -} - -ODAPIDEF void ODCALL OD_pers(BYTE btOperation) -{ - switch(btOperation) { - case PEROP_UPDATE1: - case PEROP_DISPLAY1: - ODScrnSetAttribute(0x70); - ODScrnSetCursorPos(1, 25); - ODScrnDisplayString("Design me a better ONE-LINE Status Bar! (Include Custom Keys Descriptions etc) "); - } -} - -void OD_initciowrap(long mode) -{ - od_control.od_mps=INCLUDE_MPS; - od_add_personality("CONIO",1,24,OD_pers); - od_set_personality("CONIO"); - od_init(); -} diff --git a/src/conio/od_cio.h b/src/conio/od_cio.h deleted file mode 100644 index b4846fc781..0000000000 --- a/src/conio/od_cio.h +++ /dev/null @@ -1,29 +0,0 @@ -/* $Id$ */ - -#ifdef __unix__ -#include "conio.h" - -#ifdef __cplusplus -extern "C" { -#endif -int OD_puttext(int sx, int sy, int ex, int ey, unsigned char *fill); -int OD_gettext(int sx, int sy, int ex, int ey, unsigned char *fill); -void OD_textattr(unsigned char attr); -int OD_kbhit(void); -void OD_delay(long msec); -int OD_wherey(void); -int OD_wherex(void); -int OD_putch(unsigned char ch); -void OD_gotoxy(int x, int y); -void OD_gettextinfo(struct text_info *info); -void OD_setcursortype(int type); -int OD_getch(void); -int OD_getche(void); -int OD_beep(void); -void OD_textmode(int mode); -void OD_initciowrap(long inmode); -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/conio/x_cio.c b/src/conio/x_cio.c index 2a1fd209c4..415380e046 100644 --- a/src/conio/x_cio.c +++ b/src/conio/x_cio.c @@ -88,12 +88,12 @@ void x_delay(long msec) int x_wherey(void) { - return(CursRow0)+1; + return(CursRow0+1); } int x_wherex(void) { - return(CursCol0)+1; + return(CursCol0+1); } /* Put the character _c on the screen at the current cursor position. @@ -110,7 +110,8 @@ int x_putch(unsigned char ch) switch(ch) { case '\r': - CursCol0=0; + gettextinfo(&ti); + CursCol0=ti.winleft-1; break; case '\n': gettextinfo(&ti); @@ -120,10 +121,9 @@ int x_putch(unsigned char ch) CursRow0++; break; case '\b': - sch=0x0700; if(CursCol0>0) CursCol0--; - vmem[CursCol0+CursRow0*DpyCols]=sch; + vmem[CursCol0+CursRow0*DpyCols]=x_curr_attr|' '; break; case 7: /* Bell */ tty_beep(); -- GitLab