⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 termdef.c

📁 dtelent是开源的开发项目
💻 C
📖 第 1 页 / 共 2 页
字号:
		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 + -