/*Copyright (c) Anker Berg-Sonne, 1985,1986,1987*/ /* This module contains all terminal dependent code. To implement a new terminal type it should only be necessary to change and recompile the code here and relink Sedt. */ #include "proto.h" #if defined(DOS) & !(defined(Windows) | defined(TV)) #if defined(DESQVIEW) unsigned int api_init(void); unsigned long api_shadow(void); unsigned long win_me(void); unsigned long ptr_new(void); void ptr_open(unsigned long ptrhan, unsigned long winhan); void ptr_addto(unsigned long ptrhan, unsigned int flags); int ptr_sizeof(unsigned long ptrhan); #endif #endif #define Fn 512 #if defined(VMS) extern int T$Application(); #endif #if defined(DOS) | defined(NT) | defined(OS2) #include #define Mcapsl 0x40 #define Malt 0x8 #define Mctl 0x4 #define Mlsh 0x2 #define Mrsh 0x1 #endif #if defined(OS2) void Mon_Thread() {unsigned Key_Count; while (1) {Key_Count=sizeof(Key_Buff); DosMonRead((PBYTE)&InBuff,(USHORT)0,(PBYTE)&Key_Buff,(PUSHORT)&Key_Count); {register int I; if (Key_Buff.ddflags&0x37) {if (Key_Buff.cp.scan==0) {if (Key_Buff.mnflags==17792) {for (I=0;I=0&&Abs_Row<=Phys_Length&&Abs_Col>=0&&Abs_Col<=Phys_Width) Mouse_Call(Abs_Row,Abs_Col,P2&1,P2&2,P1&1); M1=1; Mouse(&M1,NULL,NULL,NULL); M1=1; Mouse(&M1,NULL,NULL,NULL); Set_Mouse(); } } #endif #if defined(VMS) void Reposition_Input() { if (--This_In>=0) Character=TTY_Buffer[This_In]&255; } #endif #if defined(UNIX) void Reposition_Input() { Same_Character=1; } #endif #if defined(VMS) | defined(UNIX) void Enable_Mouse() {if (Use_Mouse) {Out_S("\033[1;2'z"); /* Enable Locator */ Out_Zap(); } } void Disable_Mouse() { Out_S("\033[0'z"); /* Disable Locator */ Out_Zap(); } void Mouse_1_Down() { Ldown=1; Move=Rdown=0; if (Mouse_Get_Rest()==1) Mouse_Call(); Abs_Row_Sav=Abs_Row; Abs_Col_Sav=Abs_Col; } void Mouse_1_Up() { Rdown=0; Ldown=1; if (Mouse_Get_Rest()==1) {Move=Abs_Row_Sav!=Abs_Row||Abs_Col_Sav!=Abs_Col; if (Move) Mouse_Call(); } } void Mouse_2_Down() { Mouse_Get_Rest(); } void Mouse_2_Up() { Mouse_Get_Rest(); } void Mouse_3_Down() { Rdown=1; Move=Ldown=0; if (Mouse_Get_Rest()==1) Mouse_Call(); } void Mouse_3_Up() { Move=Ldown=0; Rdown=1; Mouse_Get_Rest()==1; } void Mouse_4_Down() { Mouse_Get_Rest(); } void Mouse_4_Up() { Mouse_Get_Rest(); } void Mouse_Outside() { } /* read in rest of locator input escape sequence and compute row/column Ansi Locator report has following format: VAX/VWS: Pe;Pb;Pr;Pc;Pp&w VAX/DECwindows Pe;Pb;Pr;Pc&w Pe Event code: 2 Left Button Down 3 Left Button Up 4 Middle Button Down 5 Middle Button Up 6 Right Button Down 7 Right Button Up 8 Fourth Button Down 9 Fourth Button Up 10 Locator outside filter rectangle Pb Button status: 0 No Buttons down 1 Right 2 Middle 4 Left 8 Fourth Pr row coordinate Pc column coordinate Pp page coordinate (may be omitted) The current position in the input stream is at the end of Pe; */ int Mouse_Get_Rest() { int field[4]; int *pf; register char C; pf=field; *pf=0; #if defined(VMS) C=Termin(); #else #if defined(TERMCAP) C=UGetrm(); #else C=getch(); #endif #endif while (C!='&'&&pf<=(&field[3])) { if (isdigit(C)) {*pf=(*pf)*10+C-'0'; }else if (C==';') *(++pf)=0; else {Error(5,Ill_Mouse_Mess,C); Err_Flag=0; return (0); } #if defined(VMS) C=Termin(); #else #if defined(TERMCAP) C=UGetrm(); #else C=getch(); #endif #endif } if (( #if defined(VMS) C=Termin() #else #if defined(TERMCAP) C=UGetrm() #else C=getch() #endif #endif )=='w') {Abs_Row=(--field[1]); Abs_Col=(--field[2]); return (1); } else {Error(5,Ill_Mouse_Mess,C); Err_Flag=0; return (0); } } #endif #if defined(GEM) | defined(Windows) | defined(TV) #define SCREEN_LENGTH Scr_Length-1 #else #define SCREEN_LENGTH Scr_Length #endif #if defined(VMS) | defined(UNIX) void Fast Mouse_Call() /* 290a */ #endif #if ((defined(DOS) | defined(NT)) & !defined(PC100)) | defined(OS2) | (defined(ATARI) & defined(GEM)) void Fast Mouse_Call(int Abs_Row,int Abs_Col,int Ldown,int Rdown,int Move) #endif #if defined(VMS) | ((defined(DOS) | defined(NT)) & !defined(PC100)) | defined(OS2) | (defined(ATARI) & defined(GEM)) | defined(UNIX) { /*Diag("Mouse_Call:Row=%d,Col=%d,Ldown=%d,Rdown=%d,Move=%d", Abs_Row,Abs_Col,Ldown,Rdown,Move);*/ if (Down_Type==0) #if defined(GEM) | defined(Windows) | defined(TV) {if (Abs_Row>=Top_Row&&Abs_Col>=Left_Col&&Abs_Row=Top_Row&&Abs_Col>=Left_Col&&Abs_Row=Left_Col&&Abs_Col=Left_Col&&Abs_Col=Top_Row&&Abs_Row=Top_Row&&Abs_Row=Top_Row-1&&Abs_Col>=Left_Col-1&& Abs_Row<=Top_Row+SCREEN_LENGTH&&Abs_Col<=Left_Col+Scr_Width) {Load_Window(Cur_Buffer); Ch_Window(Buffer_Stack[I]); Opt_Move_Cursor(My_Line,My_Col); break; } if (I==Buffers-1) Load_Window(Cur_Buffer); } } } } else /* Down_Type!=0 */ {if (Ldown&&Move) {Zoomed=0; switch (Down_Type) {case 1: if (Scr_Length+Top_Row-Abs_Row>4) {Scr_Length+=Top_Row-Abs_Row-1; Top_Row=Abs_Row+1; } break; case 2: if (Abs_Row-Top_Row>2&&Abs_Row=Max_Length-2) Scr_Length=Max_Length-3-Top_Row; #endif break; case 3: if (Scr_Width+Left_Col-Abs_Col>4) {Scr_Width+=Left_Col-1-Abs_Col; Left_Col=Abs_Col+1; } break; case 4: if (Abs_Col-Left_Col>3) Scr_Width=Abs_Col-Left_Col; break; case 5: if (Scr_Length+Top_Row-Abs_Row>4) {Scr_Length+=Top_Row-Abs_Row-1; Top_Row=Abs_Row+1; } if (Scr_Width+Left_Col-Abs_Col>4) {Scr_Width+=Left_Col-1-Abs_Col; Left_Col=Abs_Col+1; } break; case 6: if (Scr_Length+Top_Row-Abs_Row>4) {Scr_Length+=Top_Row-Abs_Row-1; Top_Row=Abs_Row+1; } if (Abs_Col-Left_Col>3) Scr_Width=Abs_Col-Left_Col; break; case 7: if (Abs_Row-Top_Row>2&&Abs_Row=Max_Length-2) Scr_Length=Max_Length-3-Top_Row; #endif if (Abs_Col-Left_Col>3) Scr_Width=Abs_Col-Left_Col; break; case 8: if (Abs_Row-Top_Row>2&&Abs_Row=Max_Length-2) Scr_Length=Max_Length-3-Top_Row; #endif if (Scr_Width+Left_Col-Abs_Col>4) {Scr_Width+=Left_Col-1-Abs_Col; Left_Col=Abs_Col+1; } break; } Open_Window(); /*Down_Type=0;*/ /* 290a */ } else #if defined(VMS) | defined(UNIX) /* allow multiple move operations without refresh: second move starts with (Ldown&&!Move) */ if (Rdown||Move) /* 290a */ {Down_Type=0; Refresh_Window(); Opt_Move_Cursor(My_Line,My_Col); } else Down_Type=0; #else if (!((Ldown)&&(Move))) {Down_Type=0; Refresh_Window(); Opt_Move_Cursor(My_Line,My_Col); } #endif } } #endif #if defined(VMS) | ((defined(DOS) | defined(NT)) & !defined(PC100)) | defined(OS2) | (defined(ATARI) & defined(GEM)) | defined(UNIX) void Fast Mouse_Execute(int Line,int Col,int Left,int Right,int Move) {int C; long Chars, Sel_Pos, Sav_Col, R_Col; if (!(Left||Right)) return; if (Err_Display) Clr_Error(); if (Working_Flag) Clr_Working(); Line-=Home; R_Col=Col+Scr_Shift; Sav_Col=My_Col; Chars=0; B_Goto(Current,My_Pos); #if defined(VMS) | defined(UNIX) if (Abs_Row==Max_Length-2) /* 290a */ {R_Col-=Scr_Shift-Left_Col; #elif defined(GEM) | defined(Windows) | defined(TV) if (Line+Home+Top_Row==Scr_Length-1) {R_Col-=Scr_Shift; #else if (Line+Home+Top_Row==Phys_Length-1) {R_Col-=Scr_Shift-Left_Col; #endif if (!Move&&!Right) /* 290a */ {if (R_Col=Scr_Width) {while (My_Col-Scr_Shift>=Scr_Width) Scr_Shift+=Shift_Screen?Shift_Screen:Scr_Width/2; if (Show_Ruler) S_Ruler(); Fill_Screen(Rel_First,Rel_Last); } else if (My_Col-Scr_Shift<1&&Scr_Shift>0) {while (My_Col-Scr_Shift<1&&Scr_Shift>0) Scr_Shift-=Shift_Screen?Shift_Screen:Scr_Width/2; if (Show_Ruler) S_Ruler(); Fill_Screen(Rel_First,Rel_Last); } } else if (Scr_Shift>0) {Scr_Shift=0; Hdr_Changes=1; if (Show_Ruler) S_Ruler(); Fill_Screen(Rel_First,Rel_Last); } } else /* 290a */ if (R_Col>=Mod_Pos) Window_Changed(); else {Error(3,Mouse_Toggle_Txt); Err_Flag=0; } Hdr_Changes=1; Upd_Header(); } } else if (Show_Ruler&&Line+Home==2) {if (R_Col<=512&&!Move&&!Right) /* 290a */ {Tabs[R_Col]=Tabs[R_Col]?0:1; S_Ruler(); } } else #if defined(VMS) if (Line+Home==1&&Col==Scr_Width) /* 290a */ {if (Mbx_Count>0&&!Move&&!Right) {Plain_Message(Mbx_Mess[0]); Err_Display=0; Mbx_Count--; C_Move(Mbx_Mess[1],Mbx_Mess[0],99*1024,1); } } else #endif if (Line+Home==1) /* 290a */ {if (Col>=Buffer_Pos&&!Move&&!Right) {Window_Used(); Set_Cursor(My_Line,My_Col); } } else {if (Line==0) {if (R_ColPos-My_Pos; My_Col=1; } while (My_ColPos<=Current->Bufsize&& !Chk_EL(Current,C=B_Get(Current))&&C!='\n') {My_Col+=Char_Rep(C,NULL); Chars++; } Init_Entity(); if (Chars<0) {Ent_Direction=0; Ent_Count= -Chars; } else Ent_Count=Chars; A_Char(); My_Col=Sav_Col; } else {if (LineRel_Last) /* Error(3,Mouse_Window_Txt) */; /* 290a */ #if !(defined(GEM) | (defined(Windows) | defined(TV))) else #endif if (!Err_Flag) {if (!Move&&Left&&Points[0]) Reset(); My_Col=R_Col; Init_Entity(); if (Line<0) {Ent_Direction=0; Ent_Count= -Line; } else Ent_Count=Line; Vertical(); } My_Col=Sav_Col; } if (Err_Flag) Err_Flag=0; else {if (Left) {if (Move) {if (Points[0]==(Ent_Direction?End_Pos:Beg_Pos)) Points[0]=0; else if (Points[0]==0) Points[0]=My_Pos; } Move_Entity(); } else if (Right) {if ((Sel_Pos=Points[0])!=0&& (Ent_Direction?Sel_PosMy_Pos)) {Points[0]=0; if (Sel_Pos Maxlines) Scr_Length = Maxlines; if (Scr_Width > Maxcol) Scr_Width = Maxcol; Phys_Length=Max_Length=Scr_Length; Max_Length=Sub_Window?Sub_H:Max_Length; /* 290a */ Scr_Length=Max_Length-2; /* 290a */ Phys_Width=Max_Width=Scr_Width; Max_Width=Scr_Width=Sub_Window?Sub_W:Scr_Width; /* 290a */ #if defined(TERMCAP) Org_Width = Scr_Width; Scl_Regions=Term_Type==VT1XX||Term_Type==VT2XX||Term_Type==VT3XX|| Term_Type==VT4XX||CS!=NULL; #endif #endif #if defined(VMS) register char C, *S; VMS_Application=T$Application(); if (Call_Type!=0) {switch (Call_Type) {case 1: Term_Type=VT1XX; break; case 2: Term_Type=VT2XX; break; case 3: Term_Type=VT52; break; case 4: Term_Type=VK100; break; case 5: Term_Type=ANSI; break; case 6: Term_Type=VT3XX; break; } } else {Term_Type=VT2XX; S=getenv("TERM"); if (strcmp(S,"vt52")==0) Term_Type=VT52; else if (strncmp(S,"vt1",3)==0) {Term_Type=VT1XX; } else if (strncmp(S,"pro",3)==0) {Term_Type=VT1XX; } else if (strncmp(S,"vt2",3)==0) {Term_Type=VT2XX; } else if (strncmp(S,"vt3",3)==0) {Term_Type=VT3XX; } else if (strncmp(S,"vt4",3)==0) {Term_Type=VT4XX; } else {Out_S("\033[0c"); if (Termin()=='\033') {if ((C=Termin())=='['&&(C=Termin())=='?') {if ((C=Termin())=='6') {if ((C=Termin())==';'||C=='c'||C=='C'||C=='1') Term_Type=VT1XX; else if (C=='2') Term_Type=VT2XX; else if (C=='3') Term_Type=VT3XX; else if (C=='4') Term_Type=VT4XX; else Term_Error(); } else if (C=='5') Term_Type=VK100; else if (C=='1') Term_Type=VT1XX; else Term_Error(); while (C!='c'&&C!='C') C=Termin(); } else Term_Error(); } else if (C==155&&(C=Termin())=='?') {if ((C=Termin())=='6') {if ((C=Termin())==';'||C=='c'||C=='C'||C=='1') Term_Type=VT1XX; else if (C=='2') Term_Type=VT2XX; else if (C=='3') Term_Type=VT3XX; else if (C=='4') Term_Type=VT4XX; else Term_Error(); } else Term_Error(); while (C!='c'&&C!='C') C=Termin(); } else Term_Error(); } } T$GETSIZE(&Scr_Length,&Scr_Width); if (Scr_Length>Maxlines) Scr_Length=Maxlines; if (Scr_Width>Maxcol) Scr_Width=Maxcol; Phys_Length=Max_Length=Scr_Length; Max_Length=Sub_Window?Sub_H:Max_Length; /* 290a */ Scr_Length=Max_Length-2; /* 290a */ Phys_Width=Max_Width=Scr_Width; Org_Width=Scr_Width; Max_Width=Scr_Width=Sub_Window?Sub_W:Scr_Width; /* 290a */ Scl_Regions=Term_Type==VT1XX||Term_Type==VT2XX||Term_Type==VT3XX|| Term_Type==VT4XX; #endif #if defined(DOS) | defined(NT) #if !defined(Windows) #if !defined(PC100) Get_Type(); Term_Type=Call_Type; switch (Term_Type) {case 0xD2: case 0xFC: {Color=Call_Color==0?((GETEQ()>>4)&3)!=3:Call_Color==2; if (Term_Type==0xFC) {Term_Type=IBM_AT; switch (Call_Model) {case 0x1: Term_Type=AT_339; Int16_Ext=1; break; case 0x2: Term_Type=XT_286; Int16_Ext=1; break; case 0x4: Term_Type=PS2_50; Int16_Ext=1; break; case 0x5: Term_Type=PS2_60; Int16_Ext=1; break; } } else Term_Type=PCXX; OURKBD(); if (Keyb_Type==0) {if (!pc_enh_keyb()) Keyb_Type=Keyb_AT; else Keyb_Type=Keyb_New; } if (Set_Num_Lock==-1&&(Mapping==EDT_Mapping||Mapping==WPS_Mapping)) {switch (Keyb_Type) {case Keyb_PC: case Keyb_250: case Keyb_New: case Keyb_Conv: case Keyb_TC: case Keyb_AT: Set_Num_Lock=1; break; case Keyb_SLT: Set_Num_Lock=0; break; } } #if !defined(TV) Sub_Set(25,80); #endif break; } case 0xFE: {OURKBD(); Color=Call_Color==0?((GETEQ()>>4)&3)!=3:Call_Color==2; Term_Type=IBM_XT; if (Keyb_Type==0) Keyb_Type=Keyb_PC; #if !defined(TV) Sub_Set(25,80); #endif break; } case 0xFB: {OURKBD(); Color=Call_Color==0?((GETEQ()>>4)&3)!=3:Call_Color==2; Term_Type=XT_2; Int16_Ext=1; if (Keyb_Type==0) Keyb_Type=Keyb_New; #if !defined(TV) Sub_Set(25,80); #endif break; } case 0xF9: {OURKBD(); Color=Call_Color==0?((GETEQ()>>4)&3)!=3:Call_Color==2; Term_Type=IBM_Conv; if (Keyb_Type==0) Keyb_Type=Keyb_Conv; #if !defined(TV) Sub_Set(25,80); #endif break; } case 0xFF: {OURKBD(); Color=Call_Color==0?((GETEQ()>>4)&3)!=3:Call_Color==2; Term_Type=IBM_PC; if (Keyb_Type==0) Keyb_Type=Keyb_PC; #if !defined(TV) Sub_Set(25,80); #endif break; } case 0xFA: OURKBD(); if (Keyb_Type==0) Keyb_Type=Keyb_New; Color=Call_Color==0?((GETEQ()>>4)&3)!=3:Call_Color==2; Term_Type=PS2_30; Int16_Ext=1; #if !defined(TV) Sub_Set(25,80); #endif break; case 0xF8: OURKBD(); if (Keyb_Type==0) Keyb_Type=Keyb_New; Color=Call_Color==0?((GETEQ()>>4)&3)!=3:Call_Color==2; Term_Type=PS2_80; Int16_Ext=1; #if !defined(TV) Sub_Set(25,80); #endif break; case 2: OURKBD(); if (Keyb_Type==0) Keyb_Type=Keyb_TC; Color=Call_Color==0?((GETEQ()>>4)&3)!=3:Call_Color==2; Term_Type=TANDY_1400; #if !defined(TV) Sub_Set(25,80); #endif break; case 1: default: {Term_Type=AT_339; Keyb_Type=Keyb_New; break; } } #if defined(DESQVIEW) if ((DV=api_init())!=0) {Ptr=ptr_new(); ptr_open(Ptr,win_me()); ptr_addto(Ptr,0x4); } #endif #if !defined(TV) if (Dir_Video) { #if defined(DESQVIEW) if (DV) {if ((Video_Seg=((api_shadow()))>>16)==0) Video_Seg=Color?0xB800:0xB000; } else #endif Video_Seg=Color?0xB800:0xB000; } if (EGA43) Sub_Set(43,80); else {if (New_Mode) Old_Mode=Set_Mode(New_Mode); Get_Mode((int far *)&Scr_Length,(int far *)&Scr_Width); Sub_Set(Scr_Length,Scr_Width); if (New_Mode) Set_Mode(Old_Mode); } #endif #else Term_Type=PC100; Keyb_Type=0; #endif Scl_Regions=1; #else Get_Type(); Term_Type=Call_Type; switch (Term_Type) {case 0xD2: case 0xFC: {if (Term_Type==0xFC) {Term_Type=IBM_AT; switch (Call_Model) {case 0x1: Term_Type=AT_339; if (Keyb_Type==0) Keyb_Type=Keyb_New; break; case 0x2: Term_Type=XT_286; if (Keyb_Type==0) Keyb_Type=Keyb_New; break; case 0x4: Term_Type=PS2_50; if (Keyb_Type==0) Keyb_Type=Keyb_New; break; case 0x5: Term_Type=PS2_60; if (Keyb_Type==0) Keyb_Type=Keyb_New; break; default: if (Keyb_Type==0) Keyb_Type=Keyb_AT; break; } } else {Term_Type=PCXX; if (Keyb_Type==0) Keyb_Type=Keyb_250; } break; } case 0xFE: {Term_Type=IBM_XT; if (Keyb_Type==0) Keyb_Type=Keyb_PC; break; } case 0xFB: {Term_Type=XT_2; if (Keyb_Type==0) Keyb_Type=Keyb_New; break; } case 0xF9: {Term_Type=IBM_Conv; if (Keyb_Type==0) Keyb_Type=Keyb_Conv; break; } case 0xFF: {Term_Type=IBM_PC; if (Keyb_Type==0) Keyb_Type=Keyb_PC; break; } case 0xFA: Term_Type=PS2_30; if (Keyb_Type==0) Keyb_Type=Keyb_New; break; case 0xF8: Term_Type=PS2_80; if (Keyb_Type==0) Keyb_Type=Keyb_New; break; default: {Term_Type=AT_339; Keyb_Type=Keyb_New; break; } } if (Set_Num_Lock==-1&&(Mapping==EDT_Mapping||Mapping==WPS_Mapping)) {switch (Keyb_Type) {case Keyb_PC: case Keyb_250: case Keyb_New: case Keyb_Conv: case Keyb_TC: case Keyb_AT: Set_Num_Lock=1; break; case Keyb_SLT: Set_Num_Lock=0; break; } } Scl_Regions=1; #endif #endif #if defined(OS2) USHORT Mask; Get_Type(); Term_Type=Call_Type; switch (Term_Type) {case 0xFB: {Term_Type=XT_2; if (Keyb_Type==0) Keyb_Type=Keyb_New; break; } case 0xFA: if (Keyb_Type==0) Keyb_Type=Keyb_New; Term_Type=PS2_30; Int16_Ext=1; break; case 0xF8: if (Keyb_Type==0) Keyb_Type=Keyb_New; Term_Type=PS2_80; Int16_Ext=1; break; case 0xD2: case 0xFC: default: if (Term_Type==0xFC) {Term_Type=IBM_AT; switch (Call_Model) {case 0x1: Term_Type=AT_339; if (Keyb_Type==0) Keyb_Type=Keyb_New; Int16_Ext=1; break; case 0x2: Term_Type=XT_286; if (Keyb_Type==0) Keyb_Type=Keyb_New; Int16_Ext=1; break; case 0x4: Term_Type=PS2_50; if (Keyb_Type==0) Keyb_Type=Keyb_New; Int16_Ext=1; break; case 0x5: Term_Type=PS2_60; if (Keyb_Type==0) Keyb_Type=Keyb_New; Int16_Ext=1; break; default: if (Keyb_Type==0) Keyb_Type=Keyb_AT; } } else {Term_Type=PCXX; if (Keyb_Type==0) Keyb_Type=Keyb_250; } break; } if (Set_Num_Lock==-1&&(Mapping==EDT_Mapping||Mapping==WPS_Mapping)) {switch (Keyb_Type) {case Keyb_PC: case Keyb_250: case Keyb_New: case Keyb_Conv: case Keyb_TC: case Keyb_AT: Set_Num_Lock=1; break; case Keyb_SLT: Set_Num_Lock=0; break; } } Mode_Data.cb=12; VioGetMode((PVIOMODEINFO)&Mode_Data,0); Sub_Set(Mode_Data.row,Mode_Data.col); Old_Length=Scr_Length; VioGetCurType((PVIOCURSORINFO)&Cursor_Data,0); DosGetInfoSeg((PSEL)&Gdt_Descriptor,(PSEL)&Ldt_Descriptor); Gdt=MAKEPGINFOSEG(Gdt_Descriptor); Ldt=MAKEPLINFOSEG(Ldt_Descriptor); if (Scan_Defs!=0) {DosMonOpen("KBD$",(PHMONITOR)&KBD_Handle); InBuff.bufflen=64; OutBuff.bufflen=64; if (DosMonReg(KBD_Handle,(PBYTE)&InBuff,(PBYTE)&OutBuff,0x0002, Gdt->sgCurrent)) Initerror(Not_Enough_Memory_Txt); Thread_ID=_beginthread((void (far *)(void far *))Mon_Thread,(void far *)NULL, 4096,(void far *)NULL); DosSetPrty(PRTYS_THREAD,PRTYC_REGULAR,+2,Thread_ID); } if (Use_Mouse) {DosSemRequest((HSEM)&Mouse_Sem,-1L); if (MouOpen(0L,(PHMOU)&Mouse_Handle)) Gotmouse=0; else {Mask=(1<<1)+(1<<2)+(1<<4); MouSetEventMask((PUSHORT)&Mask,Mouse_Handle); Mouse_ID=_beginthread((void (far *)(void far *))Mouse_Thread,(void far *)NULL,4096, (void far *)NULL); /*DosSetPrty(PRTYS_THREAD,PRTYC_REGULAR,+1,Mouse_ID);*/ Gotmouse=1; } } Scl_Regions=1; #endif #if defined(ATARI) Scl_Regions=1; Max_Length=Scr_Length; Max_Width=Scr_Width; #endif #if defined(MPE) Max_Length=Scr_Length; Max_Width=Scr_Width; Scl_Regions=0; #endif } #if defined(DOS) | defined(NT) | defined(OS2) void Fast Sub_Set(int H,int W) {Phys_Length=H; Phys_Width=W; Max_Length=Scr_Length=Sub_Window?Sub_H:H; Max_Width=Scr_Width=Sub_Window?Sub_W:W; } #endif /* Set the physical cursor to position Line, Col. */ void Fast Set_Cursor(int Line,int Col) { #if defined(UNIX) #if defined(TERMCAP) switch (Term_Type) {case ANSI: case VT2XX: case VT3XX: case VT4XX: case VT1XX: case VK100: {Out_S("\033["); Out_I(Line+Top_Row); Out_C(';'); Out_I(Col+Left_Col); Out_C('H'); break; } case VT52: {Out_S("\033Y"); Out_C(037+Line+Top_Row); Out_C(037+Col+Left_Col); break; } case Tcap: case Default: default: tputs (tgoto (CM, Col+Left_Col-1,Line+Top_Row-1),1,Out_C); } #else Out_Zap(); move(Line+Top_Row-1,Col+Left_Col-1); #endif #endif #if defined(VMS) if (Echo_Read) Force_Cursor=1; switch (Term_Type) {case VT2XX: case VT3XX: case VT4XX: case VT1XX: case VK100: case ANSI: case Default: {Out_S("\033["); Out_I(Line+Top_Row); Out_C(';'); Out_I(Col+Left_Col); Out_C('H'); break; } case VT52: {Out_S("\033Y"); Out_C(037+Line+Top_Row); Out_C(037+Col+Left_Col); } } #endif #if defined(DOS) | defined(NT) #if !(defined(Windows) | defined(TV)) #if !defined(PC100) Out_Zap(); IBMcursor(Sub_X+Top_Row+Line-1,Sub_Y+Left_Col+Col-1); #else Out_S("\033["); Out_I(Line); Out_C(';'); Out_I(Col); Out_C('H'); #endif #else if (Out_Count) Out_Zap(); #if defined(TV) TV_Cursor(Line,Col); #endif #endif #endif #if defined(OS2) VioSetCurPos(Sub_X+Line-1+Top_Row,Sub_Y+Col-1+Left_Col,0); #endif #if defined(ATARI) #if !defined(GEM) Out_S("\033Y"); Out_C(037+Line+Top_Row); Out_C(037+Col+Left_Col); #else if (Out_Count) Out_Zap(); #endif #endif #if defined(MPE) Out_S("\033&a"); Out_I(Col-1); Out_C('c'); Out_I(Line-1); Out_C('R'); #endif His_Line=Line; His_Col=Col; } /* Scrolls the screen and database Scroll lines The routine is divided into two parts. One for terminals with scroll regions, which can use hardware scrolling. The other for terminals with no scroll regions, which Sedt must simulate scroll regions on. */ void Fast Opt_Scroll(int Scroll,int First,int Last) { #if defined(VMS) | defined(UNIX) int Sav_Line, L, This_Last, That_Last; long Sav_Col; char *P, *A; /*Diag("Opt_Scroll:Scroll=%d,First=%d,Last=%d",Scroll,First,Last);*/ if (!Update_Flag) return; Set_Scroll(First+=Home,Last+=Home); if (Scl_Regions&&Scr_Width==Max_Width) {if (Scroll>0) {Set_Cursor(Last,1); Scl_Up(Scroll); {register int I; for (I=First;I<=Last-Scroll;I++) { This_Last=Lst_Col[I+Top_Row]; if (That_Last=Lst_Col[I+Scroll+Top_Row]) {C_Move(My_Screen[I+Scroll+Top_Row]+1+Left_Col, My_Screen[I+Top_Row]+1+Left_Col,That_Last,0); C_Move(My_Attributes[I+Scroll+Top_Row]+1+Left_Col, My_Attributes[I+Top_Row]+1+Left_Col,That_Last,0); } if (This_Last>That_Last) {Space_Fill(My_Screen[I+Top_Row]+That_Last+1+Left_Col, This_Last-That_Last); Zero_Fill(My_Attributes[I+Top_Row]+That_Last+1+Left_Col, This_Last-That_Last); } Lst_Col[I+Top_Row]=That_Last; } } {register int I; for (I=Last-Scroll+1;I<=Last;I++) if (This_Last=Lst_Col[I+Top_Row]) {Space_Fill(My_Screen[I+Top_Row]+1+Left_Col,This_Last); Zero_Fill(My_Attributes[I+Top_Row]+1+Left_Col,This_Last); Lst_Col[I+Top_Row]=0; } } } else {Scroll=(-Scroll); Set_Cursor(First,1); Scl_Down(Scroll); {register int I; for (I=Last;I>=First+Scroll;I--) { This_Last=Lst_Col[I+Top_Row]; if (That_Last=Lst_Col[I-Scroll+Top_Row]) {C_Move(My_Screen[I-Scroll+Top_Row]+1+Left_Col, My_Screen[I+Top_Row]+1+Left_Col,That_Last,0); C_Move(My_Attributes[I-Scroll+Top_Row]+1+Left_Col, My_Attributes[I+Top_Row]+1+Left_Col,That_Last,0); } if (This_Last>That_Last) {Space_Fill(My_Screen[I+Top_Row]+That_Last+1+Left_Col, This_Last-That_Last); Zero_Fill(My_Attributes[I+Top_Row]+That_Last+1+Left_Col, This_Last-That_Last); } Lst_Col[I+Top_Row]=That_Last; } } {register int I; for (I=First;I<=Scroll+First-1;I++) if (This_Last=Lst_Col[I+Top_Row]) {Space_Fill(My_Screen[I+Top_Row]+1+Left_Col,This_Last); Zero_Fill(My_Attributes[I+Top_Row]+1+Left_Col,This_Last); Lst_Col[I+Top_Row]=0; } } } } else {if (Scroll>0) {Sav_Line=My_Line; Sav_Col=My_Col; {register int I; for (I=Scl_Top;I<=Scl_Bottom-Scroll;I++) {Opt_Cursor(I,(long)1); P=My_Screen[My_Line+Scroll+Top_Row]+Left_Col; A=My_Attributes[My_Line+Scroll+Top_Row]+Left_Col; L=Lst_Col[My_Line+Scroll+Top_Row]; My_Col=Scr_Shift+1; for (Scr_Col=1;Scr_Col<=L;Scr_Col++) {Cur_Attributes=A[Scr_Col]; Opt_Char(P[Scr_Col]); } Opt_Erase_Line(); } } {register int I; for (I=Scl_Bottom-Scroll+1;I<=Scl_Bottom;I++) {Opt_Cursor(I,(long)1); Opt_Erase_Line(); } } Opt_Cursor(Sav_Line,Sav_Col); } else {Scroll=(-Scroll); Sav_Line=My_Line; Sav_Col=My_Col; {register int I; for (I=Scl_Bottom;I>=Scl_Top+Scroll;I--) {Opt_Cursor(I,(long)1); P=My_Screen[My_Line-Scroll+Top_Row]+Left_Col; A=My_Attributes[My_Line-Scroll+Top_Row]+Left_Col; L=Lst_Col[My_Line-Scroll+Top_Row]; My_Col=Scr_Shift+1; for (Scr_Col=1;Scr_Col<=L;Scr_Col++) {Cur_Attributes=A[Scr_Col]; Opt_Char(P[Scr_Col]); } Opt_Erase_Line(); } } {register int I; for (I=Scl_Top+Scroll-1;I>=Scl_Top;I--) {Opt_Cursor(I,(long)1); Opt_Erase_Line(); } } Opt_Cursor(Sav_Line,Sav_Col); } } #endif #if (defined(DOS) | defined(NT)) & defined(Windows) if (!Update_Flag) return; Out_Zap(); Set_Scroll(First+=Home,Last+=Home); if (Scroll>0) {Scl_Up(Scroll); {register int I; for (I=First;I<=Last-Scroll;I++) Lst_Col[I]=Lst_Col[I+Scroll]; for (I=Last-Scroll+1;I<=Last;I++) Lst_Col[I]=0; } } else {Scroll=(-Scroll); Scl_Down(Scroll); {register int I; for (I=Last;I>=First+Scroll;I--) Lst_Col[I]=Lst_Col[I-Scroll]; for (I=First;I<=Scroll+First-1;I++) Lst_Col[I]=0; } } #endif #if (defined(DOS) & !defined(Windows) & !defined(TV)) | defined(OS2) if (!Update_Flag) return; Out_Zap(); Set_Scroll(First+=Home,Last+=Home); if (Scroll>0) {Scl_Up(Scroll); {register int I; for (I=First;I<=Last-Scroll;I++) Lst_Col[I]=Lst_Col[I+Scroll]; } if (Lst_Col[Last-Scroll+1]!=0) Lst_Col[Last-Scroll+1]=0; {register int I; for (I=Last-Scroll+2;I<=Last;I++) {if (Lst_Col[I]!=0) Lst_Col[I]=0; } } } else {Scroll=(-Scroll); Scl_Down(Scroll); {register int I; for (I=Last;I>=First+Scroll;I--) Lst_Col[I]=Lst_Col[I-Scroll]; } if (Lst_Col[First]!=0) Lst_Col[First]=0; {register int I; for (I=First+1;I<=Scroll+First-1;I++) {if (Lst_Col[I]!=0) Lst_Col[I]=0; } } } #endif #if defined(DOS) & defined(TV) int Sav_Line, L; long Sav_Col; char *P, *A; /*Diag("Opt_Scroll:Scroll=%d,First=%d,Last=%d",Scroll,First,Last);*/ if (!Update_Flag) return; Set_Scroll(First+=Home,Last+=Home); if (Scroll>0) {Sav_Line=My_Line; Sav_Col=My_Col; {register int I; for (I=Scl_Top;I<=Scl_Bottom-Scroll;I++) {Opt_Cursor(I,(long)1); P=My_Screen[My_Line+Scroll]; A=My_Attributes[My_Line+Scroll]; L=Lst_Col[My_Line+Scroll]; My_Col=Scr_Shift+1; for (Scr_Col=1;Scr_Col<=L;Scr_Col++) {Cur_Attributes=A[Scr_Col]; Opt_Char(P[Scr_Col]); } Opt_Erase_Line(); } } {register int I; for (I=Scl_Bottom-Scroll+1;I<=Scl_Bottom;I++) {Opt_Cursor(I,(long)1); Opt_Erase_Line(); } } Opt_Cursor(Sav_Line,Sav_Col); } else {Scroll=(-Scroll); Sav_Line=My_Line; Sav_Col=My_Col; {register int I; for (I=Scl_Bottom;I>=Scl_Top+Scroll;I--) {Opt_Cursor(I,(long)1); P=My_Screen[My_Line-Scroll]; A=My_Attributes[My_Line-Scroll]; L=Lst_Col[My_Line-Scroll]; My_Col=Scr_Shift+1; for (Scr_Col=1;Scr_Col<=L;Scr_Col++) {Cur_Attributes=A[Scr_Col]; Opt_Char(P[Scr_Col]); } Opt_Erase_Line(); } } {register int I; for (I=Scl_Top+Scroll-1;I>=Scl_Top;I--) {Opt_Cursor(I,(long)1); Opt_Erase_Line(); } } Opt_Cursor(Sav_Line,Sav_Col); } #endif #if defined(ATARI) int This_Last, That_Last, Sav_Line, L, Scr_Col; long Sav_Col; char *P, *A; if (!Update_Flag) return; Set_Scroll(First+=Home,Last+=Home); if (Scr_Width==Max_Width) {if (Scroll>0) {Scl_Up(Scroll); {register int I; for (I=First;I<=Last-Scroll;I++) { This_Last=Lst_Col[I+Top_Row]; if (That_Last=Lst_Col[I+Scroll+Top_Row]) {C_Move(My_Screen[I+Scroll+Top_Row]+1+Left_Col, My_Screen[I+Top_Row]+1+Left_Col,That_Last,0); C_Move(My_Attributes[I+Scroll+Top_Row]+1+Left_Col, My_Attributes[I+Top_Row]+1+Left_Col,That_Last,0); } if (This_Last>That_Last) {Space_Fill(My_Screen[I+Top_Row]+That_Last+1+Left_Col,This_Last-That_Last); Zero_Fill(My_Attributes[I+Top_Row]+That_Last+1+Left_Col,This_Last-That_Last); } Lst_Col[I+Top_Row]=That_Last; } } } else {Scroll=(-Scroll); Scl_Down(Scroll); {register int I; for (I=Last;I>=First+Scroll;I--) { This_Last=Lst_Col[I+Top_Row]; if (That_Last=Lst_Col[I-Scroll+Top_Row]) {C_Move(My_Screen[I-Scroll+Top_Row]+1+Left_Col, My_Screen[I+Top_Row]+1+Left_Col,That_Last,0); C_Move(My_Attributes[I-Scroll+Top_Row]+1+Left_Col, My_Attributes[I+Top_Row]+1+Left_Col,That_Last,0); } if (This_Last>That_Last) {Space_Fill(My_Screen[I+Top_Row]+That_Last+1+Left_Col,This_Last-That_Last); Zero_Fill(My_Attributes[I+Top_Row]+That_Last+1+Left_Col,This_Last-That_Last); } Lst_Col[I+Top_Row]=That_Last; } } } } else {if (Scroll>0) {Sav_Line=My_Line; Sav_Col=My_Col; {register int I; for (I=Scl_Top;I<=Scl_Bottom-Scroll;I++) {Opt_Cursor(I,(long)1); P=My_Screen[My_Line+Scroll+Top_Row]+Left_Col; A=My_Attributes[My_Line+Scroll+Top_Row]+Left_Col; L=Lst_Col[My_Line+Scroll+Top_Row]; My_Col=Scr_Shift+1; for (Scr_Col=1;Scr_Col<=L;Scr_Col++) {Cur_Attributes=A[Scr_Col]; Opt_Char(P[Scr_Col]); } Opt_Erase_Line(); } } {register int I; for (I=Scl_Bottom-Scroll+1;I<=Scl_Bottom;I++) {Opt_Cursor(I,(long)1); Opt_Erase_Line(); } } Opt_Cursor(Sav_Line,Sav_Col); } else {Scroll=(-Scroll); Sav_Line=My_Line; Sav_Col=My_Col; {register int I; for (I=Scl_Bottom;I>=Scl_Top+Scroll;I--) {Opt_Cursor(I,(long)1); P=My_Screen[My_Line-Scroll+Top_Row]+Left_Col; A=My_Attributes[My_Line-Scroll+Top_Row]+Left_Col; L=Lst_Col[My_Line-Scroll+Top_Row]; My_Col=Scr_Shift+1; for (Scr_Col=1;Scr_Col<=L;Scr_Col++) {Cur_Attributes=A[Scr_Col]; Opt_Char(P[Scr_Col]); } Opt_Erase_Line(); } } {register int I; for (I=Scl_Top+Scroll-1;I>=Scl_Top;I--) {Opt_Cursor(I,(long)1); Opt_Erase_Line(); } } Opt_Cursor(Sav_Line,Sav_Col); } } #endif #if defined(MPE) int Sav_Line, Sav_Col, L, Scr_Col; char *P, *A; if (!Update_Flag) return; Set_Scroll(First+=Home,Last+=Home); if (Scroll>0) {Sav_Line=My_Line; Sav_Col=My_Col; {register int I; for (I=Scl_Top;I<=Scl_Bottom-Scroll;I++) {Opt_Cursor(I,(long)1); P=My_Screen[My_Line+Scroll+Top_Row]+Left_Col; A=My_Attributes[My_Line+Scroll+Top_Row]+Left_Col; L=Lst_Col[My_Line+Scroll+Top_Row]; My_Col=Scr_Shift+1; for (Scr_Col=1;Scr_Col<=L;Scr_Col++) {Cur_Attributes=A[Scr_Col]; Opt_Char(P[Scr_Col]); } Opt_Erase_Line(); } } {register int I; for (I=Scl_Bottom-Scroll+1;I<=Scl_Bottom;I++) {Opt_Cursor(I,(long)1); Opt_Erase_Line(); } } Opt_Cursor(Sav_Line,Sav_Col); } else {Scroll=(-Scroll); Sav_Line=My_Line; Sav_Col=My_Col; {register int I; for (I=Scl_Bottom;I>=Scl_Top+Scroll;I--) {Opt_Cursor(I,(long)1); P=My_Screen[My_Line-Scroll+Top_Row]+Left_Col; A=My_Attributes[My_Line-Scroll+Top_Row]+Left_Col; L=Lst_Col[My_Line-Scroll+Top_Row]; My_Col=Scr_Shift+1; for (Scr_Col=1;Scr_Col<=L;Scr_Col++) {Cur_Attributes=A[Scr_Col]; Opt_Char(P[Scr_Col]); } Opt_Erase_Line(); } } {register int I; for (I=Scl_Top+Scroll-1;I>=Scl_Top;I--) {Opt_Cursor(I,(long)1); Opt_Erase_Line(); } } Opt_Cursor(Sav_Line,Sav_Col); } #endif } #if !((defined(DOS) & defined(TV)) | defined(MPE)) /* Scroll the current scroll region up by Scroll lines. This routine is not called for terminals with no hardware for scroll regions. */ void Fast Scl_Up(int Scroll) { #if defined(UNIX) #if defined(TERMCAP) switch (Term_Type) {case VT2XX: case VT3XX: case VT4XX: case VT1XX: case VK100: case ANSI: {register int I; for (I=1;I<=Scroll;I++) Out_S("\033D"); break; } case VT52: {register int I; for (I=1;I<=Scroll;I++) Out_S("\033B"); break; } case Tcap: case Default: default: {register int I; for (I=1;I<=Scroll;I++) tputs (SF, 1, Out_C); } } #endif #endif #if defined(VMS) switch (Term_Type) {case VT2XX: case VT3XX: case VT4XX: case VT1XX: case VK100: case ANSI: case Default: {register int I; for (I=1;I<=Scroll;I++) Out_S("\033D"); break; } case VT52: {register int I; for (I=1;I<=Scroll;I++) Out_S("\033B"); } } #endif #if defined(DOS) | defined(NT) #if !(defined(Windows) | defined(TV)) #if !defined(PC100) if (Dir_Video) {register int I; for (I=Scl_Top;I<=Scl_Bottom-Scroll;I++) #if defined(__BORLANDC__) movedata(Video_Seg,((Sub_X+Top_Row+I+Scroll-1)*Phys_Width+Sub_Y+Left_Col)*2, #else _movedata(Video_Seg,((Sub_X+Top_Row+I+Scroll-1)*Phys_Width+Sub_Y+Left_Col)*2, #endif Video_Seg,((Sub_X+Top_Row+I-1)*Phys_Width+Sub_Y+Left_Col)*2, Scr_Width*2); for (I=Scl_Bottom-Scroll+1;I<=Scl_Bottom;I++) Dir_Set(Sub_X+Top_Row+I-1,Sub_Y+Left_Col,' ',Attab[0],Scr_Width); } else IBMscrup(Scroll,Sub_X+Top_Row+Scl_Top-1,Sub_Y+Left_Col, Sub_X+Top_Row+Scl_Bottom-1,Sub_Y+Left_Col+Scr_Width-1,Attab[0]); #else register int I; for (I=1;I<=Scroll;I++) Out_S("\033D"); #endif #else Out_Zap(); #if defined(Windows) Win_Scroll(Scl_Top,Scl_Bottom,Scroll); #endif #endif #endif #if defined(OS2) char Cell[2]; Cell[0]=' '; Cell[1]=Attab[0]; VioScrollUp(Sub_X+Scl_Top-1+Top_Row,Sub_Y+Left_Col, Sub_X+Scl_Bottom-1+Top_Row,Sub_Y+Scr_Width-1+Left_Col,Scroll, (char far *)Cell,0); #endif #if defined(ATARI) #if ! defined(GEM) register char *F, *T; Out_Zap(); F=Logbase(); T=F+(Scl_Top-1)*1280; F=F+(Scl_Top-1+Scroll)*1280; movmem(F,T,(Scl_Bottom-Scl_Top-Scroll+1)*1280); #else Out_Zap(); GEM_Up_Scroll(Scl_Top,Scl_Bottom,Scroll); #endif #endif } /* Scroll the current scroll region down by Scroll lines. This routine is not called for terminals with no hardware for scroll regions. */ void Fast Scl_Down(int Scroll) { #if defined(UNIX) #if defined(TERMCAP) switch (Term_Type) {case VT2XX: case VT3XX: case VT4XX: case VT1XX: case VK100: case ANSI: {register int I; for (I=1;I<=Scroll;I++) Out_S("\033M"); break; } case VT52: {register int I; for (I=1;I<=Scroll;I++) Out_S("\033A"); break; } case Tcap: case Default: default: {register int I; for (I=1;I<=Scroll;I++) tputs (SR, 1, Out_C); } } #endif #endif #if defined(VMS) switch (Term_Type) {case VT2XX: case VT3XX: case VT4XX: case VT1XX: case VK100: case ANSI: case Default: {register int I; for (I=1;I<=Scroll;I++) Out_S("\033M"); break; } case VT52: {register int I; for (I=1;I<=Scroll;I++) Out_S("\033A"); } } #endif #if defined(DOS) | defined(NT) #if !(defined(Windows) | defined(TV)) #if !defined(PC100) if (Dir_Video) {register int I; for (I=Scl_Bottom;I>=Scl_Top+Scroll;I--) #if defined(__BORLANDC__) movedata(Video_Seg,((Sub_X+Top_Row+I-Scroll-1)*Phys_Width+Sub_Y+Left_Col)*2, Video_Seg,((Sub_X+Top_Row+I-1)*Phys_Width+Sub_Y+Left_Col)*2,Scr_Width*2); #else _movedata(Video_Seg,((Sub_X+Top_Row+I-Scroll-1)*Phys_Width+Sub_Y+Left_Col)*2, Video_Seg,((Sub_X+Top_Row+I-1)*Phys_Width+Sub_Y+Left_Col)*2,Scr_Width*2); #endif for (I=Scl_Top+Scroll-1;I>=Scl_Top;I--) Dir_Set(Sub_X+Top_Row+I-1,Sub_Y+Left_Col,' ',Attab[0],Scr_Width); } else IBMscrdown(Scroll,Sub_X+Top_Row+Scl_Top-1,Sub_Y+Left_Col, Sub_X+Top_Row+Scl_Bottom-1,Sub_Y+Left_Col+Scr_Width-1,Attab[0]); #else register int I; for (I=1;I<=Scroll;I++) Out_S("\033M"); #endif #else Out_Zap(); #if defined(Windows) Win_Scroll(Scl_Top,Scl_Bottom,-Scroll); #endif #endif #endif #if defined(OS2) char Cell[2]; Cell[0]=' '; Cell[1]=Attab[0]; VioScrollDn(Sub_X+Scl_Top-1+Top_Row,Sub_Y+Left_Col, Sub_X+Scl_Bottom-1+Top_Row,Sub_X+Scr_Width-1+Left_Col,Scroll, (char far *)Cell,0); #endif #if defined(ATARI) #if ! defined(GEM) register char *F, *T; Out_Zap(); F=Logbase(); T=F+(Scl_Top-1+Scroll)*1280; F=F+(Scl_Top-1)*1280; movmem(F,T,(Scl_Bottom-Scl_Top-Scroll+1)*1280); #else Out_Zap(); GEM_Down_Scroll(Scl_Top,Scl_Bottom,Scroll); #endif #endif } #endif /* Clear the physical screen. */ void Fast Clr_Screen() { #if defined(UNIX) int Line, Col; if (Zoomed) { #if defined(TERMCAP) switch (Term_Type) {case ANSI: if (His_Attributes!=0) Opt_Force_Attributes(0); case VT2XX: case VT3XX: case VT4XX: case VT1XX: case VK100: {Out_S("\033[2J"); break; } case VT52: {Set_Cursor(1,1); Out_S("\033J"); break; } case Tcap: case Default: default: if (His_Attributes!=0) Opt_Force_Attributes(0); tputs (CL, 1, Out_C); } #else Out_Zap(); clear(); #endif } else {Opt_Force_Attributes(0); for (Line=1;Line<=Scr_Length;Line++) {Set_Cursor(Line,1); for (Col=1;Col<=Scr_Width;Col++) Out_C(' '); } Out_Zap(); } #endif #if defined(VMS) int Line, Col; if (Zoomed) {switch (Term_Type) {case VT2XX: case VT3XX: case VT4XX: case VT1XX: case VK100: case ANSI: case Default: {Out_S("\033[2J"); break; } case VT52: {Set_Cursor(1,1); Out_S("\033J"); } } } else {Opt_Force_Attributes(0); for (Line=1;Line<=Scr_Length;Line++) {Set_Cursor(Line,1); for (Col=1;Col<=Scr_Width;Col++) Out_C(' '); } Out_Zap(); } #endif #if defined(DOS) | defined(NT) #if !(defined(Windows) | defined(TV)) #if !defined(PC100) if (Dir_Video) {register int I; for (I=1;I<=Scr_Length;I++) Dir_Set(Sub_X+Top_Row+I-1,Sub_Y+Left_Col,' ',Attab[0],Scr_Width); } else IBMscrdown(0,Sub_X+Top_Row,Sub_Y+Left_Col, Sub_X+Top_Row+Scr_Length-1,Sub_Y+Left_Col+Scr_Width-1,Attab[0]); #else Out_S("\033[2J"); #endif #else #if defined(TV) TV_Clear(); #else Win_Clear(); #endif #endif #endif #if defined(OS2) char Cell[2]; Cell[0]=' '; Cell[1]=Attab[0]; VioScrollDn(Sub_X+Top_Row,Sub_Y+Left_Col,Sub_X+Scr_Length-1+Top_Row, Sub_Y+Scr_Width-1+Left_Col,Scr_Length,(char *)Cell,0); #endif #if defined(ATARI) #if ! defined(GEM) int Line, Col; if (Zoomed) {Set_Cursor(1,1); Out_S("\033J"); } else {Opt_Force_Attributes(0); for (Line=1;Line<=Scr_Length;Line++) {Set_Cursor(Line,1); for (Col=1;Col<=Scr_Width;Col++) Out_C(' '); } Out_Zap(); } #else GEM_Clear(); #endif #endif #if defined(MPE) Out_S("\033h"); Out_S("\033J"); His_Line=His_Col=1; #endif {register int Line; for (Line=1;Line<=Maxlines;++Line) { #if defined(VMS) | defined(ATARI) | defined(UNIX) | (defined(DOS) & defined(TV)) | defined(MPE) Space_Fill(My_Screen[Line]+1,Maxcol); Zero_Fill(My_Attributes[Line]+1,Maxcol); Lst_Col[Line]=0; #else Lst_Col[Line]=0; #endif } } } /* Clear the physical screen. and reset to original attributes */ void Fast Reset_Screen() { #if defined(UNIX) #if defined(TERMCAP) switch (Term_Type) {case ANSI: if (His_Attributes!=0) Opt_Force_Attributes(0); case VT2XX: case VT3XX: case VT4XX: case VT1XX: case VK100: {Out_S("\033[2J"); break; } case VT52: {Set_Cursor(1,1); Out_S("\033J"); break; } case Tcap: case Default: default: if (His_Attributes!=0) Opt_Force_Attributes(0); tputs (CL, 1, Out_C); } #else Out_Zap(); clear(); #endif #endif #if defined(VMS) switch (Term_Type) {case VT2XX: case VT3XX: case VT4XX: case VT1XX: case VK100: case ANSI: case Default: {Out_S("\033[2J"); break; } case VT52: {Set_Cursor(1,1); Out_S("\033J"); } } #endif #if defined(DOS) | defined(NT) #if !(defined(Windows) | defined(TV)) #if !defined(PC100) if (Dir_Video) {register int I; for (I=1;I<=Max_Length;I++) Dir_Set(Sub_X+I-1,Sub_Y,' ',7,Max_Width); } else IBMscrdown(0,Sub_X,Sub_Y,Sub_X+Max_Length-1,Sub_Y+Max_Width-1,7); #else Out_S("\033[2J"); #endif #else #if defined(TV) TV_Clear(); #else Win_Clear(); #endif #endif #endif #if defined(OS2) char Cell[2]; Cell[0]=' '; Cell[1]=7; VioScrollDn(Sub_X,Sub_Y,Sub_X+Max_Length-1, Sub_Y+Max_Width-1,Max_Length,(char *)Cell,0); #endif #if defined(ATARI) #if ! defined(GEM) Set_Cursor(1,1); Out_S("\033J"); #else GEM_Clear(); #endif #endif #if defined(MPE) Out_S("\033h"); Out_S("\033J"); His_Line=His_Col=1; #endif {register int Line; for (Line=1;Line<=Maxlines;++Line) { #if defined(VMS) | defined(ATARI) | defined(UNIX) | (defined(DOS) & defined(TV)) | defined(MPE) Space_Fill(My_Screen[Line]+1,Maxcol); Zero_Fill(My_Attributes[Line]+1,Maxcol); Lst_Col[Line]=0; #else Lst_Col[Line]=0; #endif } } } /* Set Scroll Region. This routine is also called for terminals with no hardware scroll regions. The following variables define the scroll region Scl_Top The first ine in the region Scl_Bottom The last line in the region */ void Fast Set_Scroll(int Top,int Bottom) { Top+=Top_Row; Bottom+=Top_Row; #if defined(UNIX) #if defined(TERMCAP) switch (Term_Type) {case VT2XX: case VT3XX: case VT4XX: case VT1XX: {if (Scl_Top!=Top||Scl_Bottom!=Bottom) {Out_S("\033["); if (Top!=1) Out_I(Top); Out_C(';'); if (Bottom!=Max_Length) /* 290a */ Out_I(Bottom); Out_C('r'); Set_Cursor(Top,1); } break; } case Tcap: case Default: default: if (CS != NULL) tputs (tgoto (CS, Bottom - 1, Top - 1), 1, Out_C); } His_Line=His_Col= -1; #endif #endif #if defined(VMS) switch (Term_Type) {case VT2XX: case VT3XX: case VT4XX: case VT1XX: case Default: {if (Scl_Top!=Top||Scl_Bottom!=Bottom) {Out_S("\033["); if (Top!=1) Out_I(Top); Out_C(';'); if (Bottom!=Max_Length) /* 290a */ Out_I(Bottom); Out_C('r'); Set_Cursor(Top,1); } break; } } His_Line=His_Col= -1; #endif #if defined(DOS) | defined(NT) #if !(defined(Windows) | defined(TV)) #if defined(PC100) if (Scl_Top!=Top||Scl_Bottom!=Bottom) {Out_S("\033["); if (Top!=1) Out_I(Top); Out_C(';'); if (Bottom!=Scr_Length) Out_I(Bottom); Out_C('r'); Set_Cursor(Top,1); } #endif #endif #endif Scl_Top=Top-Top_Row; Scl_Bottom=Bottom-Top_Row; } /* Move the cursor right by Col characters without changing the characters the cursor moves over. */ void Fast Move_Right(int Col) { #if defined(UNIX) #if defined(TERMCAP) switch (Term_Type) {case ANSI: case VT2XX: case VT3XX: case VT4XX: case VT1XX: case VK100: {Out_S("\033["); Out_I(Col-His_Col); Out_C('C'); break; } case VT52: {register int I; for (I=His_Col;ICol;I--) Out_S("\033D"); break; } case Tcap: case Default: default: tputs (tgoto (CM, Col+Left_Col - 1, His_Line+Top_Row - 1), 1, Out_C); } #else Out_Zap(); move(His_Line+Top_Row-1,Col+Left_Col-1); #endif #endif #if defined(VMS) switch (Term_Type) {case VT2XX: case VT3XX: case VT4XX: case VT1XX: case VK100: case ANSI: case Default: {Out_S("\033["); Out_I(His_Col-Col); Out_C('D'); break; } case VT52: {register int I; for (I=His_Col;I>Col;I--) Out_S("\033D"); } } #endif #if defined(DOS) | defined(NT) #if !(defined(Windows) | defined(TV)) #if !defined(PC100) His_Col-=Col; IBMcursor(Top_Row+His_Line-1,Left_Col+His_Col-1); #else Out_S("\033["); Out_I(His_Col-Col); Out_C('D'); #endif #else Set_Cursor(His_Line,Col); #endif #endif #if defined(OS2) His_Col-=Col; VioSetCurPos(Sub_X+His_Line-1+Top_Row,Sub_Y+His_Col-1+Left_Col,0); #endif #if defined(ATARI) #if ! defined(GEM) {register int I; for (I=His_Col;I>Col;I--) Out_S("\033D"); } #else Set_Cursor(His_Line,Col); #endif #endif #if defined(MPE) Out_S("\033&a-"); Out_I(His_Col-Col); Out_S("c+0R"); #endif His_Col=Col; } /* Set the physical attributes of the terminal to A */ void Fast Opt_Force_Attributes(char A) { #if defined(UNIX) #if defined(TERMCAP) switch (Term_Type) {case VT2XX: case VT1XX: case VK100: case VT3XX: case VT4XX: {Out_S("\033[0"); if (A&A_Bold) Out_S(";1"); if (A&A_Blink) Out_S(";5"); if (A&A_Underline) Out_S(";4"); if (A&A_Reverse) Out_S(";7"); Out_C('m'); break; } case ANSI: {Out_S("\033[0m"); if (A&A_Bold) Out_S("\033[1m"); if (A&A_Blink) Out_S("\033[5m"); if (A&A_Underline) Out_S("\033[4m"); if (A&A_Reverse) Out_S("\033[7m"); break; } case Tcap: case Default: default: if (ME==NULL) tputs(SE,1,Out_C); else tputs (ME, 1, Out_C); if (A & A_Bold) {if (MD==NULL) tputs(SO,1,Out_C); else tputs (MD, 1, Out_C); } if (A & A_Blink) tputs (MB, 1, Out_C); if (A & A_Underline) tputs (UL, 1, Out_C); if (A & A_Reverse) {if (MR==NULL) tputs(SO,1,Out_C); else tputs (MR, 1, Out_C); } } #else Out_Zap(); attrset(0); if (A & A_Bold) attron(A_BOLD); if (A & A_Blink) attron(A_BLINK); if (A & A_Underline) attron(A_UNDERLINE); if (A & A_Reverse) attron(A_REVERSE); #endif #endif #if defined(VMS) switch (Term_Type) {case VT2XX: case VT1XX: case VK100: case VT3XX: case VT4XX: case Default: {Out_S("\033[0"); if (A&A_Bold) Out_S(";1"); if (A&A_Blink) Out_S(";5"); if (A&A_Underline) Out_S(";4"); if (A&A_Reverse) Out_S(";7"); Out_C('m'); break; } case ANSI: {Out_S("\033[0m"); if (A&A_Bold) Out_S("\033[1m"); if (A&A_Blink) Out_S("\033[5m"); if (A&A_Underline) Out_S("\033[4m"); if (A&A_Reverse) Out_S("\033[7m"); break; } } #endif #if defined(DOS) | defined(NT) Out_Zap(); #if !(defined(Windows) | defined(TV)) #if defined(PC100) Out_S("\033[0"); if (A&A_Bold) Out_S(";1"); if (A&A_Blink) Out_S(";5"); if (A&A_Underline) Out_S(";4"); if (A&A_Reverse) Out_S(";7"); Out_C('m'); #endif #endif #endif #if defined(OS2) Out_Zap(); #endif #if defined(ATARI) #if ! defined(GEM) if (A&A_Reverse) Out_S("\033p"); else Out_S("\033q"); #else Out_Zap(); #endif #endif #if defined(MPE) int I; Out_S("\033&d"); I='A'-1; if (A&A_Blink) I+=1; if (A&A_Reverse) I+=2; if (A&A_Underline) I+=4; if (!(A&A_Bold)) I+=8; Out_C(I); #endif His_Attributes=A; } /* Erase the screen from the current cursor position to the end of the line */ void Fast Del_To_End_Line() { #if defined(UNIX) long Col; if ((Scr_Col!=His_Col)||(My_Line!=His_Line)) Opt_Move_Cursor(My_Line,My_Col); if (Scr_Width==Max_Width) { #if defined(TERMCAP) switch (Term_Type) {case ANSI: if (His_Attributes!=0) Opt_Force_Attributes(0); case VT2XX: case VT3XX: case VT4XX: case VT1XX: case VK100: Out_S("\033[K"); break; case VT52: Out_S("\033K"); break; case Tcap: case Default: default: if (His_Attributes!=0) Opt_Force_Attributes(0); tputs (CE, 1, Out_C); } #else Out_Zap(); clrtoeol(); #endif } else {Opt_Force_Attributes(0); Col=My_Col; while (My_Col-Scr_Shift<=Lst_Col[My_Line+Top_Row]&&My_Col-Scr_Shift<=Scr_Width) Opt_Char(' '); My_Col=Col; } #endif #if defined(VMS) long Col; if ((Scr_Col!=His_Col)||(My_Line!=His_Line)) Opt_Move_Cursor(My_Line,My_Col); if (Scr_Width==Max_Width) {switch (Term_Type) {case VT2XX: case VT3XX: case VT4XX: case VT1XX: case VK100: case ANSI: case Default: Out_S("\033[K"); break; case VT52: Out_S("\033K"); } } else {Opt_Force_Attributes(0); Col=My_Col; while (My_Col-Scr_Shift<=Lst_Col[My_Line+Top_Row]&& My_Col-Scr_Shift<=Scr_Width) Opt_Char(' '); My_Col=Col; } #endif #if defined(DOS) | defined(NT) Out_Zap(); #if !(defined(Windows) | defined(TV)) #if !defined(PC100) if (Scr_Width-Scr_Col+1>0) {if (Dir_Video) Dir_Set(Sub_X+Top_Row+My_Line-1,Sub_Y+Left_Col+Scr_Col-1,' ', Attab[0],Scr_Width-Scr_Col+1); else {IBMcursor(Top_Row+My_Line-1,Left_Col+Scr_Col-1); IBMcout(Scr_Width-Scr_Col+1,' ',Attab[0]); } } #else Out_S("\033[K"); #endif #else #if defined(TV) TV_Erase(My_Line,My_Col-Scr_Shift,Scr_Width-Scr_Col+Scr_Shift+1); #else Win_Erase(My_Line,Scr_Col,Scr_Width-Scr_Col+1); #endif #endif #endif #if defined(OS2) char Cell[2]; Out_Zap(); Cell[0]=' '; Cell[1]=Attab[0]; VioWrtNCell((char far *)Cell,Scr_Width-Scr_Col+1, Sub_X+My_Line-1+Top_Row,Sub_Y+Scr_Col-1+Left_Col,0); #endif #if defined(ATARI) #if ! defined(GEM) long Col; if ((Scr_Col!=His_Col)||(My_Line!=His_Line)) Opt_Move_Cursor(My_Line,My_Col); if (Scr_Width==Max_Width) {Opt_Force_Attributes(0); Out_S("\033K"); } else {Opt_Force_Attributes(0); Col=My_Col; while (My_Col<=Lst_Col[My_Line+Top_Row]+Scr_Shift&&My_Col<=Scr_Width) Opt_Char(' '); My_Col=Col; } #else GEM_Erase(My_Line,Scr_Col,Scr_Width-Scr_Col+1); #endif #endif #if defined(MPE) long Col; if ((Scr_Col!=His_Col)||(My_Line!=His_Line)) Opt_Move_Cursor(My_Line,My_Col); if (Scr_Width==Max_Width) {Opt_Force_Attributes(0); Out_S("\033K"); } else {Opt_Force_Attributes(0); Col=My_Col; while (My_Col-Scr_Shift<=Lst_Col[My_Line+Top_Row]&& My_Col-Scr_Shift<=Scr_Width) Opt_Char(' '); My_Col=Col; } #endif } #if defined(UNIX) char * Environment_Name(Suffix) char *Suffix; {strcpy(Dsk_Rec,getenv("TERM")); strcat(Dsk_Rec,Suffix); } #endif #if !defined(MPE) char *Do_Mapping(char *S) {static char Mapped_File[80]; switch (Mapping) {case EDT_Mapping: strcpy(Mapped_File,S); #if defined(UNIX) strcpy(strchr(Mapped_File,'.')+1,"edt"); #else #if defined(ATARI) strcpy(index(Mapped_File,'.')+1,"EDT"); #else strcpy(strchr(Mapped_File,'.')+1,"EDT"); #endif #endif break; case WPS_Mapping: strcpy(Mapped_File,S); #if defined(UNIX) strcpy(strchr(Mapped_File,'.')+1,"wps"); #else #if defined(ATARI) strcpy(index(Mapped_File,'.')+1,"WPS"); #else strcpy(strchr(Mapped_File,'.')+1,"WPS"); #endif #endif break; case Other_Mapping: strcpy(Mapped_File,S); #if defined(UNIX) strcpy(strchr(Mapped_File,'.')+1,Map_Ext); #else #if defined(ATARI) strcpy(index(Mapped_File,'.')+1,Map_Ext); #else strcpy(strchr(Mapped_File,'.')+1,Map_Ext); #endif #endif break; } return Mapped_File; } #endif /* Returns the name of the file containing the key mappings */ char *Keyfile() { #if defined(DOS) | defined(NT) | defined(OS2) | defined(ATARI) | defined(VMS) return Do_Mapping("FUNDEF.EDT"); #endif #if defined(UNIX) return Do_Mapping("fundef.edt"); #endif #if defined(MPE) return "fundef.sed"; #endif } /* Returns the name of the file containing the key mappings */ char *Mapfile() { #if defined(UNIX) | defined(VMS) char *S; switch (Term_Type) {case VT1XX: return Do_Mapping("vt100m.map"); case VT2XX: return Do_Mapping("vt200m.map"); case VT52: return Do_Mapping("vt52m.map"); case VK100: return Do_Mapping("vk100m.map"); case ANSI: return Do_Mapping("ansim.map"); case VT3XX: return Do_Mapping("vt300m.map"); case VT4XX: return Do_Mapping("vt400m.map"); case Tcap: S=getenv("TERM"); strcpy(Dsk_Rec,S); strcat(Dsk_Rec,"m.map"); return Do_Mapping(Dsk_Rec); #if defined(UNIX) case Defined: S=Defined_Terminal; strcpy(Dsk_Rec,S); strcat(Dsk_Rec,"m.map"); return Do_Mapping(Dsk_Rec); #endif case Default: return Do_Mapping("defm.map"); } #endif #if defined(DOS) | defined(NT) #if !defined(Windows) #if defined(PC100) return Do_Mapping("RBDOSM.MAP"); #else if (Keyb_Type==Keyb_PC) return Do_Mapping("PCDOSM.MAP"); else if (Keyb_Type==Keyb_250) return Do_Mapping("LKDOSM.MAP"); else if (Keyb_Type==Keyb_New) return Do_Mapping("NPDOSM.MAP"); else if (Keyb_Type==Keyb_Conv) return Do_Mapping("CVDOSM.MAP"); else if (Keyb_Type==Keyb_AT) return Do_Mapping("ATDOSM.MAP"); else if (Keyb_Type==Keyb_SLT) return Do_Mapping("SLTDOSM.MAP"); else if (Keyb_Type==Keyb_Special) {strcpy(Keyb_File,Keyb_Name); strcat(Keyb_File,"DOSM.MAP"); return Do_Mapping(Keyb_File); } else switch (Term_Type) {case IBM_PC: case IBM_XT: return Do_Mapping("PCDOSM.MAP"); case IBM_AT: return Do_Mapping("ATDOSM.MAP"); case IBM_Conv: return Do_Mapping("CVDOSM.MAP"); case PCXX: return Do_Mapping("LKDOSM.MAP"); case TANDY_1400: return Do_Mapping("TCDOSM.MAP"); case Default: return Do_Mapping("defdosm.map"); default: return Do_Mapping("NPDOSM.MAP"); } #endif #else if (Keyb_Type==Keyb_PC) return Do_Mapping("PCWINM.MAP"); else if (Keyb_Type==Keyb_250) return Do_Mapping("LKWINM.MAP"); else if (Keyb_Type==Keyb_New) return Do_Mapping("NPWINM.MAP"); else if (Keyb_Type==Keyb_Conv) return Do_Mapping("CVWINM.MAP"); else if (Keyb_Type==Keyb_AT) return Do_Mapping("ATWINM.MAP"); else if (Keyb_Type==Keyb_SLT) return Do_Mapping("SLTWINM.MAP"); else if (Keyb_Type==Keyb_Special) {strcpy(Keyb_File,Keyb_Name); strcat(Keyb_File,"WINM.MAP"); return Do_Mapping(Keyb_File); } else switch (Term_Type) {case IBM_PC: case IBM_XT: return Do_Mapping("PCWINM.MAP"); case IBM_AT: return Do_Mapping("ATWINM.MAP"); case IBM_Conv: return Do_Mapping("CVWINM.MAP"); case PCXX: return Do_Mapping("LKWINM.MAP"); case TANDY_1400: return Do_Mapping("TCWINM.MAP"); case Default: return Do_Mapping("defwinm.map"); default: return Do_Mapping("NPWINM.MAP"); } #endif #endif #if defined(OS2) if (Keyb_Type==Keyb_PC) return Do_Mapping("PCOS2M.MAP"); else if (Keyb_Type==Keyb_250) return Do_Mapping("LKOS2M.MAP"); else if (Keyb_Type==Keyb_New) return Do_Mapping("NPOS2M.MAP"); else if (Keyb_Type==Keyb_Conv) return Do_Mapping("CVOS2M.MAP"); else if (Keyb_Type==Keyb_AT) return Do_Mapping("ATOS2M.MAP"); else if (Keyb_Type==Keyb_SLT) return Do_Mapping("SLTOS2M.MAP"); else if (Keyb_Type==Keyb_Special) {strcpy(Keyb_File,Keyb_Name); strcat(Keyb_File,"OS2M.MAP"); return Do_Mapping(Keyb_File); } else switch (Term_Type) {case IBM_PC: case IBM_XT: return Do_Mapping("PCOS2M.MAP"); case IBM_AT: return Do_Mapping("ATOS2M.MAP"); case IBM_Conv: return Do_Mapping("CVOS2M.MAP"); case PCXX: return Do_Mapping("LKOS2M.MAP"); case TANDY_1400: return Do_Mapping("TCOS2M.MAP"); case Default: return Do_Mapping("defos2m.map"); default: return Do_Mapping("NPOS2M.MAP"); } #endif #if defined(ATARI) return Do_Mapping("STTOSM.MAP"); #endif #if defined(MPE) return "map.sed"; #endif } /* Returns the name of the help file for the current terminal type */ char *Helpfile() { #if defined(UNIX) | defined(VMS) char *S; switch (Term_Type) {case VT1XX: return Do_Mapping("vt100h.hlp"); case VT2XX: return Do_Mapping("vt200h.hlp"); case VT52: return Do_Mapping("vt52h.hlp"); case VK100: return Do_Mapping("vk100h.hlp"); case ANSI: return Do_Mapping("ansih.hlp"); case VT3XX: return Do_Mapping("vt300h.hlp"); case VT4XX: return Do_Mapping("vt400h.hlp"); case Tcap: S=getenv("TERM"); strcpy(Dsk_Rec,S); strcat(Dsk_Rec,"h.hlp"); return Do_Mapping(Dsk_Rec); #if defined(UNIX) case Defined: S=Defined_Terminal; strcpy(Dsk_Rec,S); strcat(Dsk_Rec,"h.hlp"); return Do_Mapping(Dsk_Rec); #endif case Default: return Do_Mapping("defh.hlp"); } #endif #if defined(DOS) | defined(NT) #if !defined(Windows) #if defined(PC100) return Do_Mapping("RBDOSH.HLP"); #else if (Keyb_Type==Keyb_PC) return Do_Mapping("PCDOSH.HLP"); else if (Keyb_Type==Keyb_250) return Do_Mapping("LKDOSH.HLP"); else if (Keyb_Type==Keyb_New) return Do_Mapping("NPDOSH.HLP"); else if (Keyb_Type==Keyb_Conv) return Do_Mapping("CVDOSH.HLP"); else if (Keyb_Type==Keyb_AT) return Do_Mapping("ATDOSH.HLP"); else if (Keyb_Type==Keyb_SLT) return Do_Mapping("SLTDOSH.HLP"); else if (Keyb_Type==Keyb_Special) {strcpy(Keyb_File,Keyb_Name); strcat(Keyb_File,"DOSH.MAP"); return Do_Mapping(Keyb_File); } else switch (Term_Type) {case IBM_PC: case IBM_XT: return Do_Mapping("PCDOSH.HLP"); case IBM_AT: return Do_Mapping("ATDOSH.HLP"); case IBM_Conv: return Do_Mapping("CVDOSH.HLP"); case PCXX: return Do_Mapping("ATDOSH.HLP"); case TANDY_1400: return Do_Mapping("TCDOSH.HLP"); case Default: return Do_Mapping("defdosh.hlp"); default: return Do_Mapping("NPDOSH.HLP"); } #endif #else if (Keyb_Type==Keyb_PC) return Do_Mapping("PCWINH.HLP"); else if (Keyb_Type==Keyb_250) return Do_Mapping("LKWINH.HLP"); else if (Keyb_Type==Keyb_New) return Do_Mapping("NPWINH.HLP"); else if (Keyb_Type==Keyb_Conv) return Do_Mapping("CVWINH.HLP"); else if (Keyb_Type==Keyb_AT) return Do_Mapping("ATWINH.HLP"); else if (Keyb_Type==Keyb_SLT) return Do_Mapping("SLTWINH.HLP"); else if (Keyb_Type==Keyb_Special) {strcpy(Keyb_File,Keyb_Name); strcat(Keyb_File,"WINH.MAP"); return Do_Mapping(Keyb_File); } else switch (Term_Type) {case IBM_PC: case IBM_XT: return Do_Mapping("PCWINH.HLP"); case IBM_AT: return Do_Mapping("ATWINH.HLP"); case IBM_Conv: return Do_Mapping("CVWINH.HLP"); case PCXX: return Do_Mapping("LKWINH.HLP"); case TANDY_1400: return Do_Mapping("TCWINH.HLP"); case Default: return Do_Mapping("defwinh.hlp"); default: return Do_Mapping("NPWINH.HLP"); } #endif #endif #if defined(OS2) if (Keyb_Type==Keyb_PC) return Do_Mapping("PCOS2H.HLP"); else if (Keyb_Type==Keyb_250) return Do_Mapping("LKOS2H.HLP"); else if (Keyb_Type==Keyb_New) return Do_Mapping("NPOS2H.HLP"); else if (Keyb_Type==Keyb_Conv) return Do_Mapping("CVOS2H.HLP"); else if (Keyb_Type==Keyb_AT) return Do_Mapping("ATOS2H.HLP"); else if (Keyb_Type==Keyb_SLT) return Do_Mapping("SLTOS2H.HLP"); else if (Keyb_Type==Keyb_Special) {strcpy(Keyb_File,Keyb_Name); strcat(Keyb_File,"OS2H.MAP"); return Do_Mapping(Keyb_File); } else switch (Term_Type) {case IBM_PC: case IBM_XT: return Do_Mapping("PCOS2H.HLP"); case IBM_AT: return Do_Mapping("ATOS2H.HLP"); case IBM_Conv: return Do_Mapping("CVOS2H.HLP"); case PCXX: return Do_Mapping("ATOS2H.HLP"); case TANDY_1400: return Do_Mapping("TCOS2H.HLP"); case Default: return Do_Mapping("defos2h.hlp"); default: return Do_Mapping("NPOS2H.HLP"); } #endif #if defined(ATARI) return Do_Mapping("STTOSH.HLP"); #endif #if defined(MPE) return "help.sed"; #endif } /* Get a character from the console. */ void Fast Conin() { #if defined(OS2) struct _KBDKEYINFO Key_Data; struct _NOPTRRECT No_Pointer; #endif #if defined(DOS) & !(defined(Windows) | defined(TV)) int M1; #endif #if defined(ATARI) long Con_Input; #endif #if defined(VMS) if (Got_In==This_In) {Upd_Header(); if (Force_Cursor) {Force_Cursor=0; Set_Cursor(My_Line,(int)My_Col); } else if (My_Col-Scr_Shift!=His_Col||My_Line!=His_Line) Opt_Move_Cursor(My_Line,My_Col); if (Cur_Attributes!=His_Attributes) Opt_Force_Attributes(Cur_Attributes); Out_Zap(); do Got_In=Get_Input(); while (Got_In==0); This_In=0; } Character=TTY_Buffer[This_In++]&255; Do_Echo=0; #else if (My_Col-Scr_Shift!=His_Col||My_Line!=His_Line) Opt_Move_Cursor(My_Line,My_Col); Out_Zap(); #endif #if defined(UNIX) #if !defined(TERMCAP) refresh(); #endif #if defined(UNIX) if (Same_Character) { Same_Character=0; Character=Saved_Character; } else { #endif #if defined(TERMCAP) Character=UGetrm(); #else Character=getch(); #endif #if defined(UNIX) Saved_Character=Character; } #endif Scancode=255; #endif #if defined(DOS) | defined(NT) #if !(defined(Windows) | defined(TV)) if (Gotmouse&&Mouse_OK) {M1=1; Mouse(&M1,NULL,NULL,NULL); M1=1; Mouse(&M1,NULL,NULL,NULL); } #if defined(PC100) while ((Character=bdos(0x07,0,0)&255)==0); Scancode=255; #else #if defined(DESQVIEW) if (DV) {Save_Row=Save_Col=0; while (1) {if (ptr_sizeof(Ptr)!=0) {ptr_read(Ptr,(char far *)&Ptr_Buf,(int far *)&Buflen); /*Diag("Mouse:Row=%d,Col=%d,Button%d,Move=%d", Ptr_Buf->Row,Ptr_Buf->Column,Ptr_Buf->Status&3,Ptr_Buf->Status&64);*/ if (!(Ptr_Buf->Status&64)) {if ((Ptr_Buf->Status&3)==1) {Save_Row=Ptr_Buf->Row; Save_Col=Ptr_Buf->Column; Mouse_Call(Ptr_Buf->Row,Ptr_Buf->Column, (Ptr_Buf->Status&3)==1,(Ptr_Buf->Status&3)==2,0); } } else if ((Save_Row!=Ptr_Buf->Row||Save_Col!=Ptr_Buf->Column)&& (Ptr_Buf->Status&3)==1) {Mouse_Call(Save_Row,Save_Col,1,0,1); Mouse_Call(Ptr_Buf->Row,Ptr_Buf->Column,1,0,1); Mouse_Call(Ptr_Buf->Row,Ptr_Buf->Column,0,0,0); } } if (Firmware&1?ANYEXT():ANYCHR()) break; api_pause(); } } #endif if (Firmware&1) Character=GETEXT((int far *)&Scancode); else Character=GETSCAN((int far *)&Scancode); #endif if (Gotmouse&&Mouse_OK) {M1=2; Mouse(&M1,NULL,NULL,NULL); } /*Diag("Conin:Character=%d,Scancode=%d",Character,Scancode);*/ #else #if defined(TV) TV_Char(); #else WinChar(); #endif if (Not_End==0) return; /*Diag("Conin:Scancode=%d,Character=%d",Scancode,Character);*/ #endif #endif #if defined(ATARI) #if defined(GEM) Con_Input=GEM_char(Mouse_OK); if (Not_End==0) return; Character=Con_Input&0xFF; Scancode=(Con_Input>>8)&0xFF; #else if (Key_Count||Cconis()!=0) {while (Cconis()!=0) {if (Key_Count<20) Key_Buffer[Key_Count++]=Crawcin(); else Crawcin(); } Con_Input=Key_Buffer[0]; Key_Count--; {register int I; for (I=0;I>16)&0xFF; #endif #endif #if defined(MPE) {char data[4]; FREAD(mpe_stdin, (unsigned short *)data,-1); Character=data[0]; if (Character==':') {int dummy; FSETMODE(mpe_stdin,0); FCLOSE(mpe_stdin,0,0); mpe_stdin=FOPEN("$STDIN"); FCONTROL(mpe_stdin,27,&dummy); FCONTROL(mpe_stdin,13,&dummy); FSETMODE(mpe_stdin,4); } } #endif #if defined(OS2) if (Gotmouse) {MouDrawPtr(Mouse_Handle); DosSemClear((HSEM)&Mouse_Sem); } do {KbdCharIn((PKBDKEYINFO)&Key_Data,0,0); Character=Key_Data.chChar; Scancode=Key_Data.chScan; } while ((Key_Data.fbStatus&&0x40)==0); if (Gotmouse) {DosSemRequest((HSEM)&Mouse_Sem,-1L); No_Pointer.row=0; No_Pointer.col=0; No_Pointer.cRow=Scr_Length-1; No_Pointer.cCol=Scr_Width-1; MouRemovePtr((PNOPTRRECT)&No_Pointer,Mouse_Handle); } if (Scancode==0x45) {Kbd_Status.cb=10; KbdGetStatus((PKBDINFO)&Kbd_Status,0); Kbd_Status.fsMask=1<<4; Kbd_Status.fsState|=(1<<5); KbdSetStatus((PKBDINFO)&Kbd_Status,0); } else if (Scancode==0x46) {Kbd_Status.cb=10; KbdGetStatus((PKBDINFO)&Kbd_Status,0); Kbd_Status.fsMask=1<<4; Kbd_Status.fsState&=~(1<<4); KbdSetStatus((PKBDINFO)&Kbd_Status,0); } #endif /*Diag("Conin:Scancode=%x,Character=%x",Scancode,Character);*/ } /* Get a key from the keyboard. */ void Fast Getkbd() {int Done; Function=0; Done=0; while (!Done) {Getkey(); if (Check_Comb(0,0)<0) Key_Error(); else {Map_Index= -1; {register int I; for (I=0;;I++) {if (I==Map_Defs) {Done=1; break; } if (Map_Tab[I].Flags&Gold_Code?Gold:!Gold) {if (Map_Tab[I].Char==Key_Number&&(Map_Tab[I].Flags&Key_Code)) {if (Map_Tab[I].F_Code==0) Gold=1; else {if ((Function=Map_Tab[I].F_Code)<0) Function=0; Map_Index=I; Done=1; } break; } else if (Map_Tab[I].Scancode==Scancode&&Map_Tab[I].Char==Character) {if (Enhanced&&(Map_Tab[I].Flags&Ext_Code)) {if (Map_Tab[I].F_Code==0) Gold=1; else {if ((Function=Map_Tab[I].F_Code)<0) Function=0; Map_Index=I; Done=1; } break; } else if (!Enhanced&&!(Map_Tab[I].Flags&Ext_Code)) {if (Map_Tab[I].F_Code==0) Gold=1; else {if ((Function=Map_Tab[I].F_Code)<0) Function=0; Map_Index=I; Done=1; } break; } } else if (Map_Tab[I].Char==Character&&(Map_Tab[I].Flags&Char_Code)) {if (Map_Tab[I].F_Code==0) Gold=1; else {if ((Function=Map_Tab[I].F_Code)<0) Function=0; Map_Index=I; Done=1; } break; } } } } } } return; } void Fast Getkey() {Conin(); if (Scancode==0) {Enhanced=1; Scancode=Character; } else Enhanced=0; /*Diag("Getkey:Scancode=%d,Character=%d",Scancode,Character);*/ if (Scancode==Character) {register int I; for (I=0;I"); } if (His_Attributes!=0) Opt_Force_Attributes(0); Set_Scroll (1, Max_Length); Out_Zap (); #else Out_Zap(); clear(); refresh(); endwin(); #endif #endif #if defined(VMS) switch (Term_Type) {case VT2XX: case VT3XX: case VT4XX: case ANSI: case VT1XX: case VK100: if (!VMS_Application) Out_S("\033>"); } if (Gotmouse) /* 290a */ Disable_Mouse(); Opt_Force_Attributes(0); Set_Scroll(1,Max_Length); /* 290a */ Out_Zap(); #endif #if defined(DOS) | defined(NT) #if !defined(Windows) #if !defined(TV) int P1, P2, P3, P4; if (Use_Mouse) {if (Gotmouse) Clear_Mouse(); } #endif #if defined(PC100) Opt_Force_Attributes(0); Out_S("\033>"); Set_Scroll(1,Max_Length); Out_Zap(); #else #if !defined(TV) if (EGA43) {Clr43(); if (Gotmouse) {P1=7; P3=0; P4=639; Mouse(&P1,&P2,&P3,&P4); P1=8; P3=0; P4=199; Mouse(&P1,&P2,&P3,&P4); } } else if (Old_Mode) Set_Mode(Old_Mode); #endif if (Keyb_Type==Keyb_250&&Term_Type!=IBM_XT&&Term_Type!=IBM_PC&& Term_Type!=IBM_Conv&&Term_Type!=TANDY_1400) {if (!DEC_Mode) SENDCMD(0xAD); } if (Set_Num_Lock>=0) RESNUMLOCK(); #endif #else if (Set_Num_Lock>=0) Win_Reset_Num_Lock(); #endif #endif #if defined(OS2) char Cell[2]; if (EGA43) {Mode_Data.row=Old_Length; VioSetMode((PVIOMODEINFO)&Mode_Data,0); if (Old_Length==25) {Cursor_Data.yStart=12; Cursor_Data.cEnd=13; } else {Cursor_Data.yStart=7; Cursor_Data.cEnd=7; } VioSetCurType((PVIOCURSORINFO)&Cursor_Data,0); } Kbd_Status.cb=20; KbdGetStatus((PKBDINFO)&Kbd_Status,0); Kbd_Status.fsMask=1<<4; Kbd_Status.fsState&=~((1<<4)+(1<<5)); Kbd_Status.fsState|=Sav_Shift_State&((1<<4)+(1<<5)); KbdSetStatus((PKBDINFO)&Kbd_Status,0); #endif #if defined(ATARI) & ! defined(GEM) Opt_Force_Attributes(0); Cursconf(1,0); Out_Zap(); #endif #if defined(MPE) int dummy; Opt_Force_Attributes(0); Out_S("\033&s0A"); Clr_Screen(); Out_Zap(); FCONTROL(mpe_stdin,26,&dummy); FCONTROL(mpe_stdin,12,&dummy); FSETMODE(mpe_stdin,0); FCLOSE(mpe_stdin,0,0); FCLOSE(mpe_stdout,0,0); #endif if (Reset_T_String[0]!=0) {Out_S(Reset_T_String); Out_Zap(); } } /* Make the screen 132 characters wide if possible */ void Fast Wide_Screen() { #if (defined(DOS) & !(defined(Windows) | defined(TV)) & defined(PC100)) | defined(VMS) | defined(UNIX) Phys_Width=Max_Width=132; Sav_Window(Cur_Buffer); {register int I; for (I=Buffers-1;I>=0;I--) {Out_Zap(); Load_Window(Cur_Buffer=Buffer_Stack[I]); if (Scr_Width==80) Scr_Width=132; Sav_Window(Cur_Buffer); } } Out_S("\033[?3h"); #endif } /* Make the screen 80 characters wide if 132 character displays are possible */ void Fast Narrow_Screen() { #if (defined(DOS) & !(defined(Windows) | defined(TV)) & defined(PC100)) | defined(VMS) | defined(UNIX) Phys_Width=Max_Width=80; Sav_Window(Cur_Buffer); {register int I; for (I=Buffers-1;I>=0;I--) {Out_Zap(); Load_Window(Cur_Buffer=Buffer_Stack[I]); if (Left_Col>79) Left_Col=79; if (Left_Col+Scr_Width>80) Scr_Width=80-Left_Col; Sav_Window(Cur_Buffer); } } Out_S("\033[?3l"); #endif } void Fast Term_Error() {Error(2,Unrecognized_Terminal_Txt); } void Fast Key_Error() {Error(2,Illegal_Keystroke_Txt); Err_Flag=0; } void Fast Esc_Error() {Error(2,Undefined_Escape_Txt); } #if defined(DOS) | defined(NT) #if !(defined(Windows) | defined(TV)) void Fast Mouse(int *P1,int *P2,int *P3,int *P4) {union REGS Regs; if (P1!=NULL) Regs.x.ax=*P1; if (P2!=NULL) Regs.x.bx=*P2; if (P3!=NULL) Regs.x.cx=*P3; if (P4!=NULL) Regs.x.dx=*P4; int86(51,&Regs,&Regs); if (P1!=NULL) *P1=Regs.x.ax; if (P2!=NULL) *P2=Regs.x.bx; if (P3!=NULL) *P3=Regs.x.cx; if (P4!=NULL) *P4=Regs.x.dx; } #endif #endif