📄 termdef.c
字号:
/*
Customizable definitions for terminal type variations.
The definitions are stored in an INI-file called 'DTELNET.SET'
and can be edited from within dtelnet.
-- Mark Melvin
*/
#include <windows.h>
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dialog.h"
#include "dtelnet.h"
#include "emul.h"
#include "term.h"
#include "termdef.h"
#include "utils.h"
extern EmulNames emuls;
static char termsetFileName[_MAX_PATH + 1]; /* INI file to use */
/* Determine the name of the application .INI file
*/
static void makeTermSetFileName(void)
{
getExePath(telnetGetInstance(), termsetFileName);
if (strlen(termsetFileName) + 13 < _MAX_PATH)
strcat(termsetFileName, "dtelnet.set");
else
strcpy(termsetFileName, "dtelnet.set");
}
static BOOL haveTerminalDefDlg;
static char *mescape (const char *from)
{
static char esc[32];
escape (from, strlen (from), esc, sizeof (esc));
return esc;
}
static void munescape (const char *from, char *to)
{
unescape (from, strlen (from), to, KEYCODE_LEN);
}
/* Show the Emul structure onto the dialog items */
void terminalDefinitionDlgShow(HWND dlg, Emul editEmul)
{
char nrFkey[10];
int escStyle;
SetDlgItemText(dlg, IDC_KPGUP, mescape(editEmul.keyPageUp));
SetDlgItemText(dlg, IDC_KPGDN, mescape(editEmul.keyPageDown));
SetDlgItemText(dlg, IDC_KHOME, mescape(editEmul.keyHome));
SetDlgItemText(dlg, IDC_KEND, mescape(editEmul.keyEnd));
SetDlgItemText(dlg, IDC_KINS, mescape(editEmul.keyInsert));
SetDlgItemText(dlg, IDC_KDEL, mescape(editEmul.keyDelete));
SetDlgItemText(dlg, IDC_KBS, mescape(editEmul.keyBackSpace));
SetDlgItemText(dlg, IDC_KABS, mescape(editEmul.keyAltBackSpace));
SetDlgItemText(dlg, IDC_KBTAB, mescape(editEmul.keyBacktab));
sprintf(nrFkey, "%d", editEmul.nMaxFkey);
SetDlgItemText(dlg, IDC_NFFUNCKEYS, nrFkey);
SetDlgItemText(dlg, IDC_KEYF1, mescape(editEmul.keyF[0]));
SetDlgItemText(dlg, IDC_KEYF2, mescape(editEmul.keyF[1]));
SetDlgItemText(dlg, IDC_KEYF3, mescape(editEmul.keyF[2]));
SetDlgItemText(dlg, IDC_KEYF4, mescape(editEmul.keyF[3]));
SetDlgItemText(dlg, IDC_KEYF5, mescape(editEmul.keyF[4]));
SetDlgItemText(dlg, IDC_KEYF6, mescape(editEmul.keyF[5]));
SetDlgItemText(dlg, IDC_KEYF7, mescape(editEmul.keyF[6]));
SetDlgItemText(dlg, IDC_KEYF8, mescape(editEmul.keyF[7]));
SetDlgItemText(dlg, IDC_KEYF9, mescape(editEmul.keyF[8]));
SetDlgItemText(dlg, IDC_KEYF10, mescape(editEmul.keyF[9]));
SetDlgItemText(dlg, IDC_KEYF11, mescape(editEmul.keyF[10]));
SetDlgItemText(dlg, IDC_KEYF12, mescape(editEmul.keyF[11]));
SetDlgItemText(dlg, IDC_KEYF13, mescape(editEmul.keyF[12]));
SetDlgItemText(dlg, IDC_KEYF14, mescape(editEmul.keyF[13]));
SetDlgItemText(dlg, IDC_KEYF15, mescape(editEmul.keyF[14]));
SetDlgItemText(dlg, IDC_KEYF16, mescape(editEmul.keyF[15]));
SetDlgItemText(dlg, IDC_KEYF17, mescape(editEmul.keyF[16]));
SetDlgItemText(dlg, IDC_KEYF18, mescape(editEmul.keyF[17]));
SetDlgItemText(dlg, IDC_KEYF19, mescape(editEmul.keyF[18]));
SetDlgItemText(dlg, IDC_KEYF20, mescape(editEmul.keyF[19]));
CheckDlgButton(dlg, IDC_CKMOUSE, (editEmul.flags & ETF_MOUSE_EVENT)? 1 : 0);
escStyle = editEmul.flags & ETF_ESC_PARO;
CheckDlgButton(dlg, IDC_CKPARO, (escStyle ? 1 : 0));
if (escStyle)
{
CheckRadioButton(dlg, IDC_RPARO_VT320, IDC_RPARO_LINUX,
((escStyle==ETF_ESC_PARO_VT320)?IDC_RPARO_VT320:IDC_RPARO_LINUX));
}
EnableWindow(GetDlgItem(dlg, IDC_RPARO_LINUX), escStyle);
EnableWindow(GetDlgItem(dlg, IDC_RPARO_VT320), escStyle);
}
/* Save the (modified) dialog items into Emul */
void terminalDefinitionDlgSave(HWND dlg, Emul *editEmul)
{
char fkey[KEYCODE_LEN];
#define GETKEYCODE(dlgitemid,keyvar) \
GetDlgItemText(dlg, dlgitemid, fkey, KEYCODE_LEN); munescape(fkey, keyvar);
GETKEYCODE(IDC_KPGUP, editEmul->keyPageUp)
GETKEYCODE(IDC_KPGDN, editEmul->keyPageDown)
GETKEYCODE(IDC_KHOME, editEmul->keyHome)
GETKEYCODE(IDC_KEND, editEmul->keyEnd)
GETKEYCODE(IDC_KINS, editEmul->keyInsert)
GETKEYCODE(IDC_KDEL, editEmul->keyDelete)
GETKEYCODE(IDC_KBS, editEmul->keyBackSpace)
GETKEYCODE(IDC_KABS, editEmul->keyAltBackSpace)
GETKEYCODE(IDC_KBTAB, editEmul->keyBacktab)
editEmul->nMaxFkey = GetDlgItemInt(dlg, IDC_NFFUNCKEYS, NULL, FALSE);
GETKEYCODE(IDC_KEYF1, editEmul->keyF[0])
GETKEYCODE(IDC_KEYF2, editEmul->keyF[1])
GETKEYCODE(IDC_KEYF3, editEmul->keyF[2])
GETKEYCODE(IDC_KEYF4, editEmul->keyF[3])
GETKEYCODE(IDC_KEYF5, editEmul->keyF[4])
GETKEYCODE(IDC_KEYF6, editEmul->keyF[5])
GETKEYCODE(IDC_KEYF7, editEmul->keyF[6])
GETKEYCODE(IDC_KEYF8, editEmul->keyF[7])
GETKEYCODE(IDC_KEYF9, editEmul->keyF[8])
GETKEYCODE(IDC_KEYF10, editEmul->keyF[9])
GETKEYCODE(IDC_KEYF11, editEmul->keyF[10])
GETKEYCODE(IDC_KEYF12, editEmul->keyF[11])
GETKEYCODE(IDC_KEYF13, editEmul->keyF[12])
GETKEYCODE(IDC_KEYF14, editEmul->keyF[13])
GETKEYCODE(IDC_KEYF15, editEmul->keyF[14])
GETKEYCODE(IDC_KEYF16, editEmul->keyF[15])
GETKEYCODE(IDC_KEYF17, editEmul->keyF[16])
GETKEYCODE(IDC_KEYF18, editEmul->keyF[17])
GETKEYCODE(IDC_KEYF19, editEmul->keyF[18])
GETKEYCODE(IDC_KEYF20, editEmul->keyF[19])
editEmul->flags = 0;
if(IsDlgButtonChecked(dlg, IDC_CKMOUSE)){
editEmul->flags |= ETF_MOUSE_EVENT;
}
if(IsDlgButtonChecked(dlg, IDC_CKPARO)){
if (IsDlgButtonChecked(dlg, IDC_RPARO_LINUX)) {
editEmul->flags |= ETF_ESC_PARO_LINUX;
}
else if (IsDlgButtonChecked(dlg, IDC_RPARO_VT320)) {
editEmul->flags |= ETF_ESC_PARO_VT320;
}
}
}
void terminalDefinitionDlgEnableEdit(HWND dlg, BOOL isEnabled)
{
EnableWindow(GetDlgItem(dlg, IDC_KPGUP), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_KPGDN), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_KHOME), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_KEND), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_KINS), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_KDEL), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_KBS), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_KABS), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_KBTAB), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_CKMOUSE), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_CKPARO), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_RPARO_VT320), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_RPARO_LINUX), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_NFFUNCKEYS), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_KEYF1), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_KEYF2), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_KEYF3), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_KEYF4), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_KEYF5), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_KEYF6), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_KEYF7), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_KEYF8), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_KEYF9), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_KEYF10), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_KEYF11), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_KEYF12), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_KEYF13), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_KEYF14), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_KEYF15), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_KEYF16), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_KEYF17), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_KEYF18), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_KEYF19), isEnabled);
EnableWindow(GetDlgItem(dlg, IDC_KEYF20), isEnabled);
}
BOOL CALLBACK termnameDlgProc(HWND dlg,
UINT message, WPARAM wparam, LPARAM lparam)
{
static char* name;
switch (message){
case WM_INITDIALOG:
name = (char*)lparam;
return TRUE;
case WM_COMMAND:
switch LOWORD(wparam){
case IDOK:
GetDlgItemText(dlg, IDC_TERMNAME, name, TERM_NAME_LEN);
EndDialog(dlg, IDOK);
break;
case IDCANCEL:
EndDialog(dlg, IDCANCEL);
}
return TRUE;
}
return FALSE;
}
BOOL CALLBACK terminalDefinitionDlgProc(HWND dlg,
UINT message, WPARAM wparam, LPARAM lparam)
{
Emul editEmul;
unsigned int idx;
static char name[TERM_NAME_LEN];
static BOOL editing;
switch (message) {
case WM_INITDIALOG:
/* Flag that we have created the dialog, and register the
* dialog window handle with the dialog handling code.
*/
haveTerminalDefDlg = TRUE;
dialogRegister(dlg);
telnetEnumTermProfiles(&emuls);
for (idx = 0; idx<emuls.num; idx++)
{
SendDlgItemMessage(dlg, IDC_COMBOBOX1, CB_ADDSTRING, 0,
(LPARAM)emuls.names[idx]);
}
SetDlgItemText(dlg, IDC_BUTTON1, "Add New");
EnableWindow(GetDlgItem(dlg, IDC_BUTTON2), FALSE);
terminalDefinitionDlgEnableEdit(dlg, FALSE);
return TRUE;
case WM_COMMAND:
switch (LOWORD (wparam)) {
case IDC_COMBOBOX1:
/* When user select a terminal name, load definition
and update the dialog entries accordingly.
*/
#ifdef WIN32
if (HIWORD(wparam) != CBN_SELCHANGE)
break;
#else
if (HIWORD(lparam) != CBN_SELCHANGE)
break;
#endif
GetDlgItemText(dlg, IDC_COMBOBOX1, name, sizeof(name));
if (strlen(name)!=0)
{
telnetGetTermProfile(&editEmul, name);
terminalDefinitionDlgShow(dlg, editEmul);
SetDlgItemText(dlg, IDC_BUTTON1, "Modify");
}
break;
case IDC_CKPARO:
/* If checked, the radiobutton linux or vt320 becomes
available, otherwise disabled.
*/
#ifdef WIN32
if (HIWORD(wparam) != BN_CLICKED)
break;
#else
if (HIWORD(lparam) != BN_CLICKED)
break;
#endif
if (IsWindowEnabled(GetDlgItem(dlg, IDC_CKPARO)) &&
IsDlgButtonChecked(dlg, IDC_CKPARO))
{
EnableWindow(GetDlgItem(dlg, IDC_RPARO_LINUX), TRUE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -