1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
extern int TTTermType;
class CTTY;
struct _tType {
LPCTSTR m_Name;
CTTY* m_Termcap;
};
extern _tType TTypes[];
BOOL TerminalUpdateTitle();
#include "TTY.cpp"
#include "VT100.cpp"
enum _TTSB {
ttsbSend = 1,
ttsbIs = 0
};
_tType TTypes[] = {
{"VT102",&TT_VT100},
{"DEC-VT102",&TT_VT100},
{"VT100",&TT_VT100},
{"DEC-VT100",&TT_VT100},
{"ANSI",&TT_VT100},
{"TTY",&TT_TTY},
{"UNKNOWN",&TT_TTY},
{"DUMB",&TT_TTY}
};
int TType = -1;
CTTY* TTTerm = NULL;
int TTTermType = -1;
BOOL TerminalPullType(LPCTSTR ttype,LPCTSTR newName=NULL)
{
for(int tmp=0;tmp<(sizeof(TTypes)/sizeof(*TTypes));tmp++){
if(!stricmp(ttype,TTypes[tmp].m_Name)){
if(tmp){
_tType t;
memmove(&t,&TTypes[tmp],sizeof(t));
memmove(&TTypes[1],&TTypes[0],sizeof(*TTypes)*tmp);
memmove(&TTypes[0],&t,sizeof(TTypes[0]));
}
if(newName)
TTypes[0].m_Name=newName;
return TRUE;
}
}
return FALSE;
}
BOOL TerminalPrintTypes()
{
for(int tmp=0;tmp<(sizeof(TTypes)/sizeof(*TTypes));tmp++)
printf(" %s",TTypes[tmp].m_Name);
return TRUE;
}
BOOL TerminalUpdateTitle()
{
CHAR consoleTitle[1024];
sprintf(consoleTitle,DAMN_KIN_NAME " %s:%s - %s",remoteHost,remoteProt,TTTerm->GetTitle());
return SetConsoleTitle(consoleTitle);
}
BOOL SelectTermType(int tt)
{
if(tt<0)
tt=0;
if(tt>=(sizeof(TTypes)/sizeof(*TTypes)))
tt = sizeof(TTypes)/sizeof(*TTypes)-1;
TTTerm = TTypes[tt].m_Termcap;
TTTermType=tt;
VERIFY(TTTerm->Init());
return TerminalUpdateTitle();
}
BOOL TerminalOut(BYTE c)
{
ASSERT(TTTerm);
return TTTerm->Output(c);
}
BOOL TerminalIn(KEY_EVENT_RECORD k)
{
ASSERT(TTTerm);
if(k.uChar.AsciiChar){ // Maybe fall for V-Processing if ENHANCED_KEY
// Workaround for ENTER's \r/\n dilemma.. ***********
// Maybe should be moved to termtype-dependant code
CHAR c = k.uChar.AsciiChar;
if(k.wVirtualKeyCode==VK_RETURN){
if(c=='\r')
return TTTerm->Input('\r') && TTTerm->Input('\n');
else if(c=='\n')
return TTTerm->Input('\n');
}
return TTTerm->Input(c);
}else
return TTTerm->VInput(k.wVirtualKeyCode,k.dwControlKeyState);
}
BOOL TerminalIn(LPCTSTR str)
{
ASSERT(TTTerm);
while(*str)
TTTerm->Input(*(str++));
return TRUE;
}
BOOL TerminalPreO()
{
ASSERT(TTTerm);
return TTTerm->PreOutput();
}
BOOL TerminalPostO()
{
ASSERT(TTTerm);
return TTTerm->PostOutput();
}
BOOL terminaltypeOnInit()
{
VERIFY(SetConsoleMode(hConsoleInput,0));
TType = -1;
return SelectTermType(0);
}
BOOL terminaltypeOnDo()
{
TRACE0("DO TERMINAL-TYPE\n");
return TRUE;
}
BOOL terminaltypeOnSB(LPBYTE data,UINT size)
{
if(!size)
return FALSE;
if(data[0]!=ttsbSend)
return FALSE;
TRACE0("SB TERMINAL-TYPE SEND\n");
TType++;
if(TType>(sizeof(TTypes)/sizeof(*TTypes)))
TType=0;
int tt = TType;
if(tt>=(sizeof(TTypes)/sizeof(*TTypes)))
tt = sizeof(TTypes)/sizeof(*TTypes)-1;
VERIFY(SelectTermType(tt));
int ds = strlen(TTypes[tt].m_Name)+1;
LPBYTE lpb = new BYTE[ds];
lpb[0] = ttsbIs;
memmove(&lpb[1],TTypes[tt].m_Name,ds-1);
VERIFY(SubNegotiate(toTerminalType,lpb,ds));
delete lpb;
return TRUE;
}
|