📄 termdef.c
字号:
EnableWindow(GetDlgItem(dlg, IDC_RPARO_VT320), TRUE);
}
else
{
EnableWindow(GetDlgItem(dlg, IDC_RPARO_LINUX), FALSE);
EnableWindow(GetDlgItem(dlg, IDC_RPARO_VT320), FALSE);
}
break;
case IDC_BUTTON1:
/* Add or Modify, depending on profile name selected
(or lack thereof). */
if (strlen(name)==0) /* this is new, so ask for name */
{
int dlgResult = DialogBoxParam(telnetGetInstance(),
MAKEINTRESOURCE(IDD_TERMNAME), dlg, termnameDlgProc,
(LPARAM)name);
if ((dlgResult != IDOK)||(strlen(name)==0)){
/* no name given, exit */
return TRUE;
}
}
terminalDefinitionDlgEnableEdit(dlg, TRUE);
EnableWindow(GetDlgItem(dlg, IDC_BUTTON2), TRUE);
editing = TRUE;
break;
case IDC_BUTTON2:
/* Save */
terminalDefinitionDlgSave(dlg, &editEmul);
telnetSaveTermProfile(&editEmul, name);
/* Destroy the dialog and unregister the dialog handle
* with the dialog handling code.
*/
DestroyWindow(dlg);
dialogUnRegister(dlg);
haveTerminalDefDlg = FALSE;
return TRUE;
case IDOK:
if (editing)
{
switch (MessageBox(dlg, "Save?", "Terminal Definitions",
MB_YESNOCANCEL|MB_ICONQUESTION))
{
case IDCANCEL:
return TRUE;
case IDYES:
terminalDefinitionDlgSave(dlg, &editEmul);
telnetSaveTermProfile(&editEmul, name);
}
}
/* Destroy the dialog and unregister the dialog handle
* with the dialog handling code.
*/
DestroyWindow(dlg);
dialogUnRegister(dlg);
haveTerminalDefDlg = FALSE;
return TRUE;
}
break;
}
return FALSE;
}
void terminalDefShowDialog(HINSTANCE instance, HWND wnd)
{
if (!haveTerminalDefDlg)
CreateDialog(instance, MAKEINTRESOURCE(IDD_TERMINAL_DEFINITION),
wnd, terminalDefinitionDlgProc);
}
#ifndef WIN32
/* Win16 doesn't provide enumerating INI sections, so we create one.
--(melvin)
*/
void GetPrivateProfileSectionNames(char* buffer, int size, char *fname)
{
char line[4096];
char *last; /* pointer to buffer tail */
FILE *f = fopen (fname, "r");
last = buffer;
while ((!feof(f)) && (last<(buffer+size)))
{
int len;
fgets(line, 4095, f); /* read lines from file */
len = strlen(line) - 1; /* don't count line end */
if ((last+len) > (buffer+size)) break; /* guard against overflow */
/* if line looks like [section] */
if ((len > 2)&&(line[0]=='[')&&(line[len-1]==']'))
{
/* append it into buffer (without the brackets)*/
memcpy(last, line+1, len-2);
last[len-2] = '\0'; /* null-terminate each name*/
last += (len-1);
}
}
last[0] = '\0'; /* extra null for end */
fclose(f);
};
#endif
void telnetEnumTermProfiles(EmulNames *emuls)
{
static char namesbuffer[4096];
static BOOL namesSet = FALSE;
static int nTermNames = 0;
static char **pTermNames = NULL;
char* c;
if (!namesSet)
{
GetPrivateProfileSectionNames(namesbuffer, sizeof(namesbuffer),
termsetFileName);
namesSet = TRUE;
nTermNames = 0;
pTermNames = (char **)calloc(1024, sizeof(char*));
c = namesbuffer;
while (*c)
{
pTermNames [nTermNames] = c;
nTermNames++;
while (*c++);
}
realloc(pTermNames, nTermNames * sizeof(char*));
}
emuls->num = nTermNames;
emuls->names = pTermNames;
}
void telnetDestroyTermProfiles(EmulNames *emuls)
{
ASSERT(emuls);
free(emuls->names);
}
/* Fills Emul structure with default (linux) terminal settings
*/
void telnetCreateDefaultTermProfile(Emul* emul)
{
int fkey;
strcpy(emul->name, "linux");
emul->flags = ETF_ESC_PARO_LINUX;
strcpy(emul->keyPageUp, "\x1b[5~");
strcpy(emul->keyPageDown, "\x1b[6~");
strcpy(emul->keyHome, "\x1b[1~");
strcpy(emul->keyEnd, "\x1b[4~");
strcpy(emul->keyInsert, "\x1b[2~");
strcpy(emul->keyDelete, "\x1b[3~");
strcpy(emul->keyBacktab, "\x1b[Z");
strcpy(emul->keyBackSpace, "\x7f");
strcpy(emul->keyAltBackSpace, "\x08");
emul->nMaxFkey = 20;
for (fkey=0; fkey < emul->nMaxFkey; fkey++)
{
char fkeycode[KEYCODE_LEN];
/* generate linux fkey codes */
if (fkey<5){
sprintf(fkeycode, "\x1b[[%c", 'A'+fkey);
}
else {
sprintf(fkeycode, "\x1b[%d~", (fkey<14)?(12+fkey):(13+fkey));
}
/*generate fkey names */
strncpy(emul->keyF[fkey], fkeycode, KEYCODE_LEN);
}
}
/* Fills Emul structure with terminal settings with name
*/
void telnetGetTermProfile(Emul* emul, const char *name)
{
char buffer[512];
int fkey;
char fkeyname[6];
char tmpacsc [2*256+1];
int tal;
strncpy(emul->name, name, TERM_NAME_LEN);
GetPrivateProfileString(name, "CharsetSupport", "", buffer, sizeof(buffer), termsetFileName);
if (!stricmp(buffer, "linux")) {emul->flags = ETF_ESC_PARO_LINUX; }
else if (!stricmp(name, "vt320")) {emul->flags = ETF_ESC_PARO_VT320; }
GetPrivateProfileString(name, "SupportMouse", "no", buffer, sizeof(buffer), termsetFileName);
if (!stricmp(buffer, "yes")) {emul->flags |= ETF_MOUSE_EVENT; }
#define GET_TERM_KEYDEF(keyname, keyvar) \
memset(buffer,0,sizeof (buffer)); memset(keyvar,0,KEYCODE_LEN); \
GetPrivateProfileString(name, keyname, "", buffer, sizeof(buffer), termsetFileName);\
munescape(buffer, keyvar);
GET_TERM_KEYDEF("kpgup", emul->keyPageUp)
GET_TERM_KEYDEF("kpgdn", emul->keyPageDown)
GET_TERM_KEYDEF("khome", emul->keyHome)
GET_TERM_KEYDEF("kend", emul->keyEnd)
GET_TERM_KEYDEF("kins", emul->keyInsert)
GET_TERM_KEYDEF("kdel", emul->keyDelete)
GET_TERM_KEYDEF("kbtab", emul->keyBacktab)
GET_TERM_KEYDEF("kbs", emul->keyBackSpace)
GET_TERM_KEYDEF("kabs", emul->keyAltBackSpace)
emul->nMaxFkey = GetPrivateProfileInt(name, "nfunc", 20, termsetFileName);
memset (&emul->keyF, 0, sizeof (emul->keyF));
for (fkey=0; fkey < emul->nMaxFkey; fkey++)
{
/*generate fkey names */
sprintf(fkeyname, "kf%d", fkey+1);
GET_TERM_KEYDEF(fkeyname, emul->keyF[fkey])
}
GetPrivateProfileString (name, "acsc", "", buffer, sizeof (buffer),
termsetFileName);
tal = unescape (buffer, strlen (buffer), tmpacsc, sizeof (tmpacsc));
ctabConst (emul->ctGraphConv, 0);
ctabModif (emul->ctGraphConv, tmpacsc, tal/2, 1);
}
/* Saves emul terminal settings with name.
*/
void telnetSaveTermProfile(Emul* emul, char *name)
{
int fkey;
char strnkey[5];
int escPar0 = emul->flags & ETF_ESC_PARO;
WritePrivateProfileString(name, "CharsetSupport",
(escPar0==ETF_ESC_PARO_LINUX ? "linux" :
(escPar0==ETF_ESC_PARO_VT320 ? "vt320" : "")),
termsetFileName);
WritePrivateProfileString(name, "SupportMouse",
((emul->flags & ETF_MOUSE_EVENT) ? "yes" : "no"),
termsetFileName);
#define WRITE_TERM_KEYDEF(keyname, keyvar) \
WritePrivateProfileString(name, keyname, mescape(keyvar), termsetFileName);\
WRITE_TERM_KEYDEF("kpgup", emul->keyPageUp)
WRITE_TERM_KEYDEF("kpgdn", emul->keyPageDown)
WRITE_TERM_KEYDEF("khome", emul->keyHome)
WRITE_TERM_KEYDEF("kend", emul->keyEnd)
WRITE_TERM_KEYDEF("kins", emul->keyInsert)
WRITE_TERM_KEYDEF("kdel", emul->keyDelete)
WRITE_TERM_KEYDEF("kbtab", emul->keyBacktab)
WRITE_TERM_KEYDEF("kbs", emul->keyBackSpace)
WRITE_TERM_KEYDEF("kabs", emul->keyAltBackSpace)
wsprintf(strnkey, "%d", emul->nMaxFkey);
WritePrivateProfileString(name, "nfunc", strnkey, termsetFileName);
for (fkey=0; fkey<(emul->nMaxFkey); fkey++)
{
char fkeyname[6];
/*generate fkey names */
sprintf(fkeyname, "kf%d", fkey+1);
WRITE_TERM_KEYDEF(fkeyname, emul->keyF[fkey])
}
}
void initTermSet(void)
{
makeTermSetFileName();
/* Check if dtelnet.set. exists */
if(access(termsetFileName, 0)!=0)
{ /* file not exist, create an emergency one */
MessageBox(NULL, "DTelnet.set file not found, creating new.", "DTelnet", MB_OK);
telnetCreateDefaultTermProfile(emulGetTerm());
telnetSaveTermProfile(emulGetTerm(), "linux");
if(access(termsetFileName, 0)!=0)
{ /* Still not exist ?? We have a problem */
MessageBox(NULL, "DTelnet.set cannot be created.", "DTelnet Error", MB_OK);
}
}
emulSetTerm("linux");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -