📄 terminal.c
字号:
}}void Tagger(WINDOW *Window){ int i, j, k, Color, y, x, Attr, Key; char Line[LINES-1][3]; char Temp[20], TempStr[20], Found, PrevChar, C; chtype ch; WINDOW *TagScreen; tTag *Tmp; Attr = Window->_attrs; getyx(Window, y, x); Color = (int)(WHITE << 4) + 8; for (i=0;i<LINES-1;i++) { Line[i][0] = 0; Line[i][1] = 0; Line[i][2] = 0; Found = 0; PrevChar = ' '; for (j=0;j<COLS-12 && !Found;j++){ for (k=0;k<12;k++) Temp[k] = mvwinch(Window, i, j+k) & A_CHARTEXT; if (j > 0) PrevChar = mvwinch(Window, i, j-1) & A_CHARTEXT; Temp[12] = 0; if (ValidName(Temp, TempStr) && isspace(PrevChar)){ Found = 1; Line[i][0] = j; Line[i][1] = strlen(TempStr); } } } TagScreen = dupwin(Window); Key = 0; i = 0; nl(); while (Key != '\e'){ textAttr(TagScreen, Color); for (k=0;k<Line[i][1];k++){ ch = mvwinch(TagScreen, i, k+Line[i][0]) & A_CHARTEXT; mvwaddch(TagScreen, i, k+Line[i][0], ch); } wmove(TagScreen, i, Line[i][1]); clearok(TagScreen, TRUE); redrawwin(TagScreen); wrefresh(TagScreen); Key = getEscChar(); switch(Key){ case ' ': Line[i][2] ^= 1; break; case KEY_DOWN: if (i < LINES-2){ WipeLine(Window, TagScreen, i, Line[i][0], Line[i][1], Line[i][2]); i++; } break; case KEY_UP: if (i > 0){ WipeLine(Window, TagScreen, i, Line[i][0], Line[i][1], Line[i][2]); i--; } break; case KEY_RIGHT: if (Line[i][0]+Line[i][1] < COLS){ WipeLine(Window, TagScreen, i, Line[i][0], Line[i][1], Line[i][2]); Line[i][0]++; } break; case KEY_LEFT: if (Line[i][0] > 0){ WipeLine(Window, TagScreen, i, Line[i][0], Line[i][1], Line[i][2]); Line[i][0]--; } break; case KEY_HOME: if (Line[i][1] > 0){ WipeLine(Window, TagScreen, i, Line[i][0], Line[i][1], Line[i][2]); Line[i][1]--; } break; case KEY_END: if (Line[i][0]+Line[i][1] < COLS && Line[i][1] < 12){ WipeLine(Window, TagScreen, i, Line[i][0], Line[i][1], Line[i][2]); Line[i][1]++; } break; default:break; } } for (i=0;i<LINES-1;i++){ if (Line[i][2]){ Tmp = new tTag; for (j=0;j<Line[i][1];j++){ C = mvwinch(TagScreen, i, Line[i][0]+j) & A_CHARTEXT; Tmp->Name[j] = C; } Tmp->Name[j+1] = 0; TagList.Add(Tmp); } } delwin(TagScreen); clearok(Window, TRUE); redrawwin(Window); wmove(Window, y, x); Window->_attrs = Attr; wrefresh(Window); nonl();}void MarkLine(WINDOW *Window, int y, int x, int Color){ chtype ch; int i; for (i=x;i<x+12;i++){ ch = mvwinch(Window, y, i) & A_CHARTEXT; textAttr(Window, Color); mvwaddch(Window, y, i, ch); }}tTag *GetTag(int y, int x){ tTag *Tmp; int i; Tmp = (tTag *)TagList.Base; for (i=1;i<y*(x+1);i++) if (Tmp != NULL) Tmp = (tTag *)Tmp->Next; return (Tmp);}void DrawTag(WINDOW *Window){ int i,j; tTag *Tmp; char TempStr[5]; wclear(Window); textAttr(Window, Integers[cMenu]); box(Window, SVLINE, SHLINE); textAttr(Window, Integers[cMenuText]); mvwaddstr(Window, 1,1, "Clear all"); mvwaddstr(Window, 2,1, "Delete tagged"); mvwaddstr(Window, 3,1, "Add entry"); mvwaddstr(Window, 4,1, "Edit entry"); mvwaddstr(Window, 5,1, "Untag"); mvwaddstr(Window, 6,1, "Del remove"); mvwaddstr(Window, 7,1, "Space tag"); mvwaddstr(Window, 8,1, "+ Tag+13"); mvwaddstr(Window, 9,1, "- Tag+32"); mvwaddstr(Window, 10,1, "Tagged:"); textAttr(Window, Integers[cMenu]); wmove(Window, 1, 14); wvline(Window, SVLINE, LINES-3); wmove(Window, 1, 14+13); wvline(Window, SVLINE, LINES-3); wmove(Window, 1, 14+26); wvline(Window, SVLINE, LINES-3); wmove(Window, 1, 14+39); wvline(Window, SVLINE, LINES-3); wmove(Window, 1, 14+52); wvline(Window, SVLINE, LINES-3); textAttr(Window, WHITE); Tagged = 0; Tmp = (tTag *)TagList.Base; for (j=0;j<5;j++) for (i=0;i<LINES-3;i++){ if (Tmp != NULL){ mvwaddstr(Window, i+1, j*13+15, Tmp->Name); if (Tmp->Tag){ Tagged++; MarkLine(Window, i+1, j*13+15, Integers[cMenuHot]); } Tmp = (tTag *)Tmp->Next; } } textAttr(Window, Integers[cMenuOptions]); sprintf(TempStr, "%03d", Tagged); mvwaddstr(Window, 10, 9, TempStr); textAttr(Window, WHITE);}void SendTags(){ int y, x, Key; char TempStr[200]; WINDOW *TagScreen; tTag *Tmp, *Next; TagScreen = newwin(LINES-1, COLS, 0, 0); DrawTag(TagScreen); MarkLine(TagScreen, 1, 15, (int)((int)WHITE << 4)); wrefresh(TagScreen); Key = 0; y = 1; x = 0; while (Key != '\e'){ Key = getEscChar(); switch(Key){ case ' ': Tmp = GetTag(y, x); if (Tmp != NULL){ Tmp->Tag ^= 1; if (Tmp->Tag){ MarkLine(TagScreen, y, x*13+15, Integers[cMenuHot]); Tagged++; } else { Tagged--; MarkLine(TagScreen, y, x*13+15, WHITE); } textAttr(TagScreen, Integers[cMenuOptions]); sprintf(TempStr, "%03d", Tagged); mvwaddstr(TagScreen, 10, 9, TempStr); textAttr(TagScreen, WHITE); if (Integers[TagAdvance]) goto TAGDOWN; } break; case 'a': case 'A': Tmp = new tTag; Tmp->Name[0] = 0; TagList.Add(Tmp); break; case 'c': case 'C': DeleteTagList(); DrawTag(TagScreen); redrawwin(TagScreen); x = 0; y = 1; MarkLine(TagScreen, 1, 15, (int)((int)WHITE << 4)); wrefresh(TagScreen); break; case 'd': case 'D': Tmp = (tTag *)TagList.Base; while (Tmp != NULL){ Next = (tTag *)Tmp->Next; if (Tmp->Tag){ TagList.Del(Tmp); } Tmp = Next; } DrawTag(TagScreen); redrawwin(TagScreen); x = 0; y = 1; MarkLine(TagScreen, 1, 15, (int)((int)WHITE << 4)); wrefresh(TagScreen); break; case 'e': case 'E': Tmp = GetTag(y, x); if (Tmp != NULL){ nl(); if (getstring(TagScreen, y, x*13+15, Tmp->Name, ValidEdit, "\e\n", 12, -1, TempStr) == '\n'){ strcpy(Tmp->Name, TempStr); DrawTag(TagScreen); wrefresh(TagScreen); } nonl(); MarkLine(TagScreen, y, x*13+15, (int)((int)WHITE << 4)); } break; case 'u': case 'U': Tmp = GetTag(y, x); if (Tmp != NULL && Tmp->Tag){ Tmp->Tag = 0; Tagged--; } textAttr(TagScreen, Integers[cMenuOptions]); sprintf(TempStr, "%03d", Tagged); mvwaddstr(TagScreen, 10, 9, TempStr); textAttr(TagScreen, WHITE); break; case KEY_DC: Tmp = GetTag(y, x); if (Tmp != NULL) TagList.Del(Tmp); DrawTag(TagScreen); MarkLine(TagScreen, y, x*13+15, (int)((int)WHITE << 4)); redrawwin(TagScreen); wrefresh(TagScreen); break; case '+': Tmp = (tTag *)TagList.Base; while (Tmp != NULL){ if (Tmp->Tag){ mwriteblock(Tmp->Name, strlen(Tmp->Name)); msendchar(13); } Tmp = (tTag *)Tmp->Next; } break; case '-': Tmp = (tTag *)TagList.Base; while (Tmp != NULL){ if (Tmp->Tag){ mwriteblock(Tmp->Name, strlen(Tmp->Name)); msendchar(32); } Tmp = (tTag *)Tmp->Next; } break; case KEY_DOWN: TAGDOWN: if (y<LINES-3){ Tmp = GetTag(y, x); if (Tmp != NULL) if (Tmp->Tag) MarkLine(TagScreen, y, x*13+15, Integers[cMenuHot]); else MarkLine(TagScreen, y, x*13+15, WHITE); else MarkLine(TagScreen, y, x*13+15, WHITE); y++; MarkLine(TagScreen, y, x*13+15, (int)((int)WHITE << 4)); } break; case KEY_UP: if (y>1){ Tmp = GetTag(y, x); if (Tmp != NULL) if (Tmp->Tag) MarkLine(TagScreen, y, x*13+15, Integers[cMenuHot]); else MarkLine(TagScreen, y, x*13+15, WHITE); else MarkLine(TagScreen, y, x*13+15, WHITE); y--; MarkLine(TagScreen, y, x*13+15, (int)((int)WHITE << 4)); } break; case KEY_RIGHT: if (x<4){ Tmp = GetTag(y, x); if (Tmp != NULL) if (Tmp->Tag) MarkLine(TagScreen, y, x*13+15, Integers[cMenuHot]); else MarkLine(TagScreen, y, x*13+15, WHITE); else MarkLine(TagScreen, y, x*13+15, WHITE); x++; MarkLine(TagScreen, y, x*13+15, (int)((int)WHITE << 4)); } break; case KEY_LEFT: if (x>0){ Tmp = GetTag(y, x); if (Tmp != NULL) if (Tmp->Tag) MarkLine(TagScreen, y, x*13+15, Integers[cMenuHot]); else MarkLine(TagScreen, y, x*13+15, WHITE); else MarkLine(TagScreen, y, x*13+15, WHITE); x--; MarkLine(TagScreen, y, x*13+15, (int)((int)WHITE << 4)); } break; case KEY_NPAGE: Tmp = GetTag(y, x); if (Tmp != NULL) if (Tmp->Tag) MarkLine(TagScreen, y, x*13+15, Integers[cMenuHot]); else MarkLine(TagScreen, y, x*13+15, WHITE); else MarkLine(TagScreen, y, x*13+15, WHITE); y = LINES-3; MarkLine(TagScreen, y, x*13+15, (int)((int)WHITE << 4)); break; case KEY_PPAGE: Tmp = GetTag(y, x); if (Tmp != NULL) if (Tmp->Tag) MarkLine(TagScreen, y, x*13+15, Integers[cMenuHot]); else MarkLine(TagScreen, y, x*13+15, WHITE); else MarkLine(TagScreen, y, x*13+15, WHITE); y = 1; MarkLine(TagScreen, y, x*13+15, (int)((int)WHITE << 4)); break; case KEY_HOME: Tmp = GetTag(y, x); if (Tmp != NULL) if (Tmp->Tag) MarkLine(TagScreen, y, x*13+15, Integers[cMenuHot]); else MarkLine(TagScreen, y, x*13+15, WHITE); else MarkLine(TagScreen, y, x*13+15, WHITE); y = 1; x = 0; MarkLine(TagScreen, y, x*13+15, (int)((int)WHITE << 4)); break; case KEY_END: Tmp = GetTag(y, x); if (Tmp != NULL) if (Tmp->Tag) MarkLine(TagScreen, y, x*13+15, Integers[cMenuHot]); else MarkLine(TagScreen, y, x*13+15, WHITE); else MarkLine(TagScreen, y, x*13+15, WHITE); y = LINES-3; x = 4; MarkLine(TagScreen, y, x*13+15, (int)((int)WHITE << 4)); break; default:break; } wrefresh(TagScreen); } delwin(TagScreen); clearok(Screen, TRUE); redrawwin(Screen); wrefresh(Screen);}void DumpEmu(){ int i; for (i=0;i<Emupos;i++) { swaddch(Screen, Emu[i]); Emu[i] = 0; } Emupos = 0;}void Help(){ WINDOW *Window; Window = newwin(LINES-1, COLS, 0, 0); curs_set(0); textAttr(Window, Integers[cHelp]); wbkgdset(Window, Window->_attrs); wclear(Window); box(Window, SVLINE, SHLINE); mvwaddstr(Window, 1, 1, "Help"); mvwaddstr(Window, 2, 1, "Scrollback"); mvwaddstr(Window, 3, 1, "Clear screen"); mvwaddstr(Window, 4, 1, "Phonebook"); mvwaddstr(Window, 5, 1, "Local Echo"); mvwaddstr(Window, 6, 1, "Hangup"); mvwaddstr(Window, 7, 1, "Image save"); mvwaddstr(Window, 8, 1, "Capture"); mvwaddstr(Window, 9, 1, "Send tags"); mvwaddstr(Window, 10, 1, "Options"); mvwaddstr(Window, 11, 1, "Device change"); mvwaddstr(Window, 12, 1, "Quit"); mvwaddstr(Window, 13, 1, "Strip high"); mvwaddstr(Window, 14, 1, "Terminal type"); mvwaddstr(Window, 15, 1, "Tag files"); mvwaddstr(Window, 16, 1, "Quit + reset"); mvwaddstr(Window, 17, 1, "EMSI chat"); mvwaddstr(Window, 18, 1, "Send break"); textAttr(Window, Integers[cHelpBold]); if (Integers[EscType] == 1) { mvwaddstr(Window, 1, 20, "Ctrl-Alt-A"); mvwaddstr(Window, 2, 20, "Ctrl-Alt-B"); mvwaddstr(Window, 3, 20, "Ctrl-Alt-C"); mvwaddstr(Window, 4, 20, "Ctrl-Alt-D"); mvwaddstr(Window, 5, 20, "Ctrl-Alt-E"); mvwaddstr(Window, 6, 20, "Ctrl-Alt-H"); mvwaddstr(Window, 7, 20, "Ctrl-Alt-I"); mvwaddstr(Window, 8, 20, "Ctrl-Alt-L"); mvwaddstr(Window, 9, 20, "Ctrl-Alt-N"); mvwaddstr(Window, 10, 20, "Ctrl-Alt-W"); mvwaddstr(Window, 11, 20, "Ctrl-Alt-P"); mvwaddstr(Window, 12, 20, "Ctrl-Alt-Q"); mvwaddstr(Window, 13, 20, "Ctrl-Alt-R"); mvwaddstr(Window, 14, 20, "Ctrl-Alt-T"); mvwaddstr(Window, 15, 20, "Ctrl-Alt-V"); mvwaddstr(Window, 16, 20, "Ctrl-Alt-X"); mvwaddstr(Window, 17, 20, "Ctrl-Alt-Y"); mvwaddstr(Window, 18, 20, "Ctrl-Alt-Z"); } else { mvwaddstr(Window, 1, 20, "Alt-A"); mvwaddstr(Window, 2, 20, "Alt-B"); mvwaddstr(Window, 3, 20, "Alt-C"); mvwaddstr(Window, 4, 20, "Alt-D"); mvwaddstr(Window, 5, 20, "Alt-E"); mvwaddstr(Window, 6, 20, "Alt-H"); mvwaddstr(Window, 7, 20, "Alt-I"); mvwaddstr(Window, 8, 20, "Alt-L"); mvwaddstr(Window, 9, 20, "Alt-N"); mvwaddstr(Window, 10, 20, "Alt-W"); mvwaddstr(Window, 11, 20, "Alt-P"); mvwaddstr(Window, 12, 20, "Alt-Q"); mvwaddstr(Window, 13, 20, "Alt-R"); mvwaddstr(Window, 14, 20, "Alt-T"); mvwaddstr(Window, 15, 20, "Alt-V"); mvwaddstr(Window, 16, 20, "Alt-X"); mvwaddstr(Window, 17, 20, "Alt-Y"); mvwaddstr(Window, 18, 20, "Alt-Z"); } textAttr(Window, Integers[cHelp]); mvwaddstr(Window, 5, 40, "Termite v0.2.0b1, 8-19-97"); mvwaddstr(Window, 7, 40, "Programmer:"); mvwaddstr(Window, 10, 40, "Credits:"); textAttr(Window, Integers[cHelpBold]); mvwaddstr(Window, 8, 45, "Nadav Cohen"); mvwaddstr(Window, 11, 45, "Nimrod Zimerman"); mvwaddstr(Window, 12, 45, "Gil Megidish"); mvwaddstr(Window, 13, 45, "Shay Cohen"); mvwaddstr(Window, 14, 45, "Nimrod Carmi"); wrefresh(Window); getEscChar(); delwin(Window); clearok(Screen, TRUE); redrawwin(Screen); wrefresh(Screen); curs_set(1);}void InitVars(){ textAttr(Screen, Integers[cTerminal]); CurrentTerm.LocalEcho = Integers[GlobalLocalEcho]; CurrentTerm.StripHigh = Integers[GlobalStripHigh]; CurrentTerm.RcvdBSdest = Integers[BSdest]; CurrentTerm.Baud = Integers[Bauds1+CurrentTerm.Device-1]; CurrentTerm.Parity = Integers[Parities1+CurrentTerm.Device-1]; CurrentTerm.Stopbits = Integers[Stopbits1+CurrentTerm.Device-1]; CurrentTerm.Databits = Integers[Databits1+CurrentTerm.Device-1]; Warned = 0; strcpy(RingStr, Strings[Ring]); ReplaceM(RingStr); RING[0]=strlen(RingStr); RING[1]=0;}void DoTerminal(int Device){ int i, Key, Quit, j, k; char EmulationReturn[3]; time_t Time, LastTime; int LastStatus; char Temp[250]; int y, x; OpenLogfile(); ClosePort = 1; LastStatus = linestatus(); Printlogln("Start"); if (CAR){ Online = 1; Offline = 0; Printlogln("Carrier detected"); } else { Online = 0; Offline = 1; } textAttr(Screen, Integers[cTerminal]); wclear(Screen); wmove(Screen, 0, 0); time(&Starttime); CurrentTerm.Device = Device; CurrentTerm.Parity = Integers[Parities1+Device-1]; CurrentTerm.Baud = Integers[Bauds1+Device-1]; CurrentTerm.Stopbits = Integers[Stopbits1+Device-1]; CurrentTerm.Databits = Integers[Databits1+Device-1]; strncpy(CurrentTerm.Name+1,"Manual mode", 11); CurrentTerm.Name[0] = 11; CurrentTerm.Terminal = 0; CurrentTerm.User = 1; CurrentTerm.LocalEcho = Integers[GlobalLocalEcho]; CurrentTerm.StripHigh = Integers[GlobalStripHigh]; CurrentTerm.RcvdBSdest = Integers[BSdest]; nl(); PrintStatus(); nonl(); CurrentBufferFilled = 0; wmove(Screen, 0, 0); waddstr(Screen, "Termite version 0.2.0b1, Copyright (C) 1996-1997 Nadav Cohen\n"); waddstr(Screen, "Termite comes with ABSOLUTELY NO WARRANTY; for details read COPYING.\n"); waddstr(Screen, "This is free software, and you are welcome to redistribute it\n"); waddstr(Screen, "under certain conditions; read COPYING for details.\n\n"); waddstr(Screen, "PLEASE REPORT BUGS TO: nadavc@ibm.net\n"); if (Offline || Integers[ForceInit])
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -