X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/374330e25a6b51c40436fa869a381dd510790f6e..c9def1b8e8960113ab4fd91d0b69d5b422cf339f:/windlg.c diff --git a/windlg.c b/windlg.c index ecd3e5f2..23bf2cb4 100644 --- a/windlg.c +++ b/windlg.c @@ -5,20 +5,19 @@ #include #include -#include "putty.h" #include "ssh.h" +#include "putty.h" #include "win_res.h" -#define NPANELS 7 -#define MAIN_NPANELS 7 -#define RECONF_NPANELS 4 +#define NPANELS 8 +#define MAIN_NPANELS 8 +#define RECONF_NPANELS 5 static const char *const puttystr = PUTTY_REG_POS "\\Sessions"; -static void get_sesslist(int allocate); +static char **events = NULL; +static int nevents = 0, negsize = 0; -static char **negots = NULL; -static int nnegots = 0, negsize = 0; static HWND logbox = NULL, abtbox = NULL; static char hex[16] = "0123456789ABCDEF"; @@ -42,8 +41,6 @@ static void mungestr(char *in, char *out) { } static void unmungestr(char *in, char *out) { - int candot = 0; - while (*in) { if (*in == '%' && in[1] && in[2]) { int i, j; @@ -95,16 +92,9 @@ static void gppi(HKEY key, LPCTSTR name, int def, int *i) { *i = val; } -typedef struct { - void *posn; - void *temp; - char dataspace[2048]; -} DTemplate; - static HINSTANCE hinst; -static char **sessions; -static int nsessions; +static int readytogo; static void save_settings (char *section, int do_host) { int i; @@ -116,7 +106,6 @@ static void save_settings (char *section, int do_host) { if (RegCreateKey(HKEY_CURRENT_USER, puttystr, &subkey1)!=ERROR_SUCCESS || RegCreateKey(subkey1, p, &sesskey) != ERROR_SUCCESS) { - free(p); sesskey = NULL; } @@ -127,16 +116,22 @@ static void save_settings (char *section, int do_host) { if (do_host) { wpps (sesskey, "HostName", cfg.host); wppi (sesskey, "PortNumber", cfg.port); - wpps (sesskey, "Protocol", - cfg.protocol == PROT_SSH ? "ssh" : "telnet"); + p = "raw"; + for (i = 0; backends[i].name != NULL; i++) + if (backends[i].protocol == cfg.protocol) { + p = backends[i].name; + break; + } + wpps (sesskey, "Protocol", p); } wppi (sesskey, "CloseOnExit", !!cfg.close_on_exit); + wppi (sesskey, "WarnOnClose", !!cfg.warn_on_close); wpps (sesskey, "TerminalType", cfg.termtype); wpps (sesskey, "TerminalSpeed", cfg.termspeed); { - char buf[2*sizeof(cfg.environ)], *p, *q; + char buf[2*sizeof(cfg.environmt)], *p, *q; p = buf; - q = cfg.environ; + q = cfg.environmt; while (*q) { while (*q) { int c = *q++; @@ -153,20 +148,32 @@ static void save_settings (char *section, int do_host) { wpps (sesskey, "Environment", buf); } wpps (sesskey, "UserName", cfg.username); + wppi (sesskey, "NoPTY", cfg.nopty); + wpps (sesskey, "Cipher", cfg.cipher == CIPHER_BLOWFISH ? "blowfish" : + cfg.cipher == CIPHER_DES ? "des" : "3des"); + wppi (sesskey, "AuthTIS", cfg.try_tis_auth); wppi (sesskey, "RFCEnviron", cfg.rfc_environ); wppi (sesskey, "BackspaceIsDelete", cfg.bksp_is_delete); wppi (sesskey, "RXVTHomeEnd", cfg.rxvt_homeend); - wppi (sesskey, "LinuxFunctionKeys", cfg.linux_funkeys); + wppi (sesskey, "LinuxFunctionKeys", cfg.funky_type); wppi (sesskey, "ApplicationCursorKeys", cfg.app_cursor); wppi (sesskey, "ApplicationKeypad", cfg.app_keypad); + wppi (sesskey, "NetHackKeypad", cfg.nethack_keypad); + wppi (sesskey, "AltF4", cfg.alt_f4); + wppi (sesskey, "AltSpace", cfg.alt_space); + wppi (sesskey, "LdiscTerm", cfg.ldisc_term); + wppi (sesskey, "BlinkCur", cfg.blink_cur); + wppi (sesskey, "Beep", cfg.beep); wppi (sesskey, "ScrollbackLines", cfg.savelines); wppi (sesskey, "DECOriginMode", cfg.dec_om); wppi (sesskey, "AutoWrapMode", cfg.wrap_mode); + wppi (sesskey, "LFImpliesCR", cfg.lfhascr); wppi (sesskey, "WinNameAlways", cfg.win_name_always); wppi (sesskey, "TermWidth", cfg.width); wppi (sesskey, "TermHeight", cfg.height); wpps (sesskey, "Font", cfg.font); wppi (sesskey, "FontIsBold", cfg.fontisbold); + wppi (sesskey, "FontCharSet", cfg.fontcharset); wppi (sesskey, "FontHeight", cfg.fontheight); wppi (sesskey, "FontVTMode", cfg.vtmode); wppi (sesskey, "TryPalette", cfg.try_palette); @@ -190,6 +197,14 @@ static void save_settings (char *section, int do_host) { } wpps (sesskey, buf, buf2); } + wppi (sesskey, "KoiWinXlat", cfg.xlat_enablekoiwin); + wppi (sesskey, "88592Xlat", cfg.xlat_88592w1250); + wppi (sesskey, "CapsLockCyr", cfg.xlat_capslockcyr); + wppi (sesskey, "ScrollBar", cfg.scrollbar); + wppi (sesskey, "ScrollOnKey", cfg.scroll_on_key); + wppi (sesskey, "LockSize", cfg.locksize); + wppi (sesskey, "BCE", cfg.bce); + wppi (sesskey, "BlinkText", cfg.blinktext); RegCloseKey(sesskey); } @@ -213,42 +228,44 @@ static void load_settings (char *section, int do_host) { int i; HKEY subkey1, sesskey; char *p; + char prot[10]; p = malloc(3*strlen(section)+1); mungestr(section, p); - - if (RegOpenKey(HKEY_CURRENT_USER, puttystr, &subkey1) != ERROR_SUCCESS || - RegOpenKey(subkey1, p, &sesskey) != ERROR_SUCCESS) { - free(p); + + if (RegOpenKey(HKEY_CURRENT_USER, puttystr, &subkey1) != ERROR_SUCCESS) { sesskey = NULL; + } else { + if (RegOpenKey(subkey1, p, &sesskey) != ERROR_SUCCESS) { + sesskey = NULL; + } + RegCloseKey(subkey1); } free(p); - RegCloseKey(subkey1); - if (do_host) { - char prot[10]; - gpps (sesskey, "HostName", "", cfg.host, sizeof(cfg.host)); - gppi (sesskey, "PortNumber", 23, &cfg.port); - gpps (sesskey, "Protocol", "telnet", prot, 10); - if (!strcmp(prot, "ssh")) - cfg.protocol = PROT_SSH; - else - cfg.protocol = PROT_TELNET; - } else { - cfg.port = 23; - *cfg.host = '\0'; - } + gpps (sesskey, "HostName", "", cfg.host, sizeof(cfg.host)); + gppi (sesskey, "PortNumber", default_port, &cfg.port); + + gpps (sesskey, "Protocol", "default", prot, 10); + cfg.protocol = default_protocol; + for (i = 0; backends[i].name != NULL; i++) + if (!strcmp(prot, backends[i].name)) { + cfg.protocol = backends[i].protocol; + break; + } + gppi (sesskey, "CloseOnExit", 1, &cfg.close_on_exit); + gppi (sesskey, "WarnOnClose", 1, &cfg.warn_on_close); gpps (sesskey, "TerminalType", "xterm", cfg.termtype, sizeof(cfg.termtype)); gpps (sesskey, "TerminalSpeed", "38400,38400", cfg.termspeed, sizeof(cfg.termspeed)); { - char buf[2*sizeof(cfg.environ)], *p, *q; + char buf[2*sizeof(cfg.environmt)], *p, *q; gpps (sesskey, "Environment", "", buf, sizeof(buf)); p = buf; - q = cfg.environ; + q = cfg.environmt; while (*p) { while (*p && *p != ',') { int c = *p++; @@ -256,7 +273,7 @@ static void load_settings (char *section, int do_host) { c = '\t'; if (c == '\\') c = *p++; - *p++ = c; + *q++ = c; } if (*p == ',') p++; *q++ = '\0'; @@ -264,22 +281,42 @@ static void load_settings (char *section, int do_host) { *q = '\0'; } gpps (sesskey, "UserName", "", cfg.username, sizeof(cfg.username)); + gppi (sesskey, "NoPTY", 0, &cfg.nopty); + { + char cipher[10]; + gpps (sesskey, "Cipher", "3des", cipher, 10); + if (!strcmp(cipher, "blowfish")) + cfg.cipher = CIPHER_BLOWFISH; + else if (!strcmp(cipher, "des")) + cfg.cipher = CIPHER_DES; + else + cfg.cipher = CIPHER_3DES; + } + gppi (sesskey, "AuthTIS", 0, &cfg.try_tis_auth); gppi (sesskey, "RFCEnviron", 0, &cfg.rfc_environ); gppi (sesskey, "BackspaceIsDelete", 1, &cfg.bksp_is_delete); gppi (sesskey, "RXVTHomeEnd", 0, &cfg.rxvt_homeend); - gppi (sesskey, "LinuxFunctionKeys", 0, &cfg.linux_funkeys); + gppi (sesskey, "LinuxFunctionKeys", 0, &cfg.funky_type); gppi (sesskey, "ApplicationCursorKeys", 0, &cfg.app_cursor); gppi (sesskey, "ApplicationKeypad", 0, &cfg.app_keypad); + gppi (sesskey, "NetHackKeypad", 0, &cfg.nethack_keypad); + gppi (sesskey, "AltF4", 1, &cfg.alt_f4); + gppi (sesskey, "AltSpace", 0, &cfg.alt_space); + gppi (sesskey, "LdiscTerm", 0, &cfg.ldisc_term); + gppi (sesskey, "BlinkCur", 0, &cfg.blink_cur); + gppi (sesskey, "Beep", 1, &cfg.beep); gppi (sesskey, "ScrollbackLines", 200, &cfg.savelines); gppi (sesskey, "DECOriginMode", 0, &cfg.dec_om); gppi (sesskey, "AutoWrapMode", 1, &cfg.wrap_mode); + gppi (sesskey, "LFImpliesCR", 0, &cfg.lfhascr); gppi (sesskey, "WinNameAlways", 0, &cfg.win_name_always); gppi (sesskey, "TermWidth", 80, &cfg.width); gppi (sesskey, "TermHeight", 24, &cfg.height); gpps (sesskey, "Font", "Courier", cfg.font, sizeof(cfg.font)); gppi (sesskey, "FontIsBold", 0, &cfg.fontisbold); + gppi (sesskey, "FontCharSet", ANSI_CHARSET, &cfg.fontcharset); gppi (sesskey, "FontHeight", 10, &cfg.fontheight); - gppi (sesskey, "FontVTMode", VT_POORMAN, &cfg.vtmode); + gppi (sesskey, "FontVTMode", VT_OEMANSI, (int *)&cfg.vtmode); gppi (sesskey, "TryPalette", 0, &cfg.try_palette); gppi (sesskey, "BoldAsColour", 1, &cfg.bold_colour); for (i=0; i<22; i++) { @@ -291,10 +328,14 @@ static void load_settings (char *section, int do_host) { "85,255,255", "187,187,187", "255,255,255" }; char buf[20], buf2[30]; + int c0, c1, c2; sprintf(buf, "Colour%d", i); gpps (sesskey, buf, defaults[i], buf2, sizeof(buf2)); - sscanf(buf2, "%d,%d,%d", &cfg.colours[i][0], - &cfg.colours[i][1], &cfg.colours[i][2]); + if(sscanf(buf2, "%d,%d,%d", &c0, &c1, &c2) == 3) { + cfg.colours[i][0] = c0; + cfg.colours[i][1] = c1; + cfg.colours[i][2] = c2; + } } gppi (sesskey, "MouseIsXterm", 0, &cfg.mouse_is_xterm); for (i=0; i<256; i+=32) { @@ -320,9 +361,36 @@ static void load_settings (char *section, int do_host) { cfg.wordness[j] = atoi(q); } } + gppi (sesskey, "KoiWinXlat", 0, &cfg.xlat_enablekoiwin); + gppi (sesskey, "88592Xlat", 0, &cfg.xlat_88592w1250); + gppi (sesskey, "CapsLockCyr", 0, &cfg.xlat_capslockcyr); + gppi (sesskey, "ScrollBar", 1, &cfg.scrollbar); + gppi (sesskey, "ScrollOnKey", 0, &cfg.scroll_on_key); + gppi (sesskey, "LockSize", 0, &cfg.locksize); + gppi (sesskey, "BCE", 0, &cfg.bce); + gppi (sesskey, "BlinkText", 0, &cfg.blinktext); + RegCloseKey(sesskey); } +static void force_normal(HWND hwnd) +{ +static int recurse = 0; + + WINDOWPLACEMENT wp; + + if(recurse) return; + recurse = 1; + + wp.length = sizeof(wp); + if (GetWindowPlacement(hwnd, &wp)) + { + wp.showCmd = SW_SHOWNORMAL; + SetWindowPlacement(hwnd, &wp); + } + recurse = 0; +} + static void MyGetDlgItemInt (HWND hwnd, int id, int *result) { BOOL ok; int n; @@ -337,9 +405,9 @@ static int CALLBACK LogProc (HWND hwnd, UINT msg, switch (msg) { case WM_INITDIALOG: - for (i=0; i 0) { if (!*p) goto disaster; @@ -824,6 +999,13 @@ static int CALLBACK SshProc (HWND hwnd, UINT msg, case WM_INITDIALOG: SetDlgItemText (hwnd, IDC3_TTEDIT, cfg.termtype); SetDlgItemText (hwnd, IDC3_LOGEDIT, cfg.username); + CheckDlgButton (hwnd, IDC3_NOPTY, cfg.nopty); + CheckRadioButton (hwnd, IDC3_CIPHER3DES, IDC3_CIPHERDES, + cfg.cipher == CIPHER_BLOWFISH ? IDC3_CIPHERBLOWF : + cfg.cipher == CIPHER_DES ? IDC3_CIPHERDES : + + IDC3_CIPHER3DES); + CheckDlgButton (hwnd, IDC3_AUTHTIS, cfg.try_tis_auth); break; case WM_COMMAND: switch (LOWORD(wParam)) { @@ -837,6 +1019,29 @@ static int CALLBACK SshProc (HWND hwnd, UINT msg, GetDlgItemText (hwnd, IDC3_LOGEDIT, cfg.username, sizeof(cfg.username)-1); break; + case IDC3_NOPTY: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) + cfg.nopty = IsDlgButtonChecked (hwnd, IDC3_NOPTY); + break; + case IDC3_CIPHER3DES: + case IDC3_CIPHERBLOWF: + case IDC3_CIPHERDES: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) { + if (IsDlgButtonChecked (hwnd, IDC3_CIPHER3DES)) + cfg.cipher = CIPHER_3DES; + else if (IsDlgButtonChecked (hwnd, IDC3_CIPHERBLOWF)) + cfg.cipher = CIPHER_BLOWFISH; + else if (IsDlgButtonChecked (hwnd, IDC3_CIPHERDES)) + cfg.cipher = CIPHER_DES; + } + break; + case IDC3_AUTHTIS: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) + cfg.try_tis_auth = IsDlgButtonChecked (hwnd, IDC3_AUTHTIS); + break; } break; } @@ -989,7 +1194,7 @@ static int CALLBACK ColourProc (HWND hwnd, UINT msg, i = (i < 3 ? i*2 : i == 3 ? 5 : i*2-2); cc.lStructSize = sizeof(cc); cc.hwndOwner = hwnd; - cc.hInstance = hinst; + cc.hInstance = (HWND)hinst; cc.lpCustColors = custom; cc.rgbResult = RGB (cfg.colours[i][0], cfg.colours[i][1], cfg.colours[i][2]); @@ -1016,10 +1221,55 @@ static int CALLBACK ColourProc (HWND hwnd, UINT msg, return GeneralPanelProc (hwnd, msg, wParam, lParam); } -static DTemplate negot, main, reconf, panels[NPANELS]; +static int CALLBACK TranslationProc (HWND hwnd, UINT msg, + WPARAM wParam, LPARAM lParam) { + switch (msg) { + case WM_INITDIALOG: + CheckRadioButton (hwnd, IDC6_NOXLAT, IDC6_88592WIN1250, + cfg.xlat_88592w1250 ? IDC6_88592WIN1250 : + cfg.xlat_enablekoiwin ? IDC6_KOI8WIN1251 : + IDC6_NOXLAT); + CheckDlgButton (hwnd, IDC6_CAPSLOCKCYR, cfg.xlat_capslockcyr); + CheckRadioButton (hwnd, IDC2_VTXWINDOWS, IDC2_VTPOORMAN, + cfg.vtmode == VT_XWINDOWS ? IDC2_VTXWINDOWS : + cfg.vtmode == VT_OEMANSI ? IDC2_VTOEMANSI : + cfg.vtmode == VT_OEMONLY ? IDC2_VTOEMONLY : + IDC2_VTPOORMAN); + case WM_COMMAND: + switch (LOWORD(wParam)) { + case IDC6_NOXLAT: + case IDC6_KOI8WIN1251: + case IDC6_88592WIN1250: + cfg.xlat_enablekoiwin = + IsDlgButtonChecked (hwnd, IDC6_KOI8WIN1251); + cfg.xlat_88592w1250 = + IsDlgButtonChecked (hwnd, IDC6_88592WIN1250); + break; + case IDC6_CAPSLOCKCYR: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) { + cfg.xlat_capslockcyr = + IsDlgButtonChecked (hwnd, IDC6_CAPSLOCKCYR); + } + break; + case IDC2_VTXWINDOWS: + case IDC2_VTOEMANSI: + case IDC2_VTOEMONLY: + case IDC2_VTPOORMAN: + cfg.vtmode = + (IsDlgButtonChecked (hwnd, IDC2_VTXWINDOWS) ? VT_XWINDOWS : + IsDlgButtonChecked (hwnd, IDC2_VTOEMANSI) ? VT_OEMANSI : + IsDlgButtonChecked (hwnd, IDC2_VTOEMONLY) ? VT_OEMONLY : + VT_POORMAN); + break; + } + } + return GeneralPanelProc (hwnd, msg, wParam, lParam); +} + static DLGPROC panelproc[NPANELS] = { ConnectionProc, KeyboardProc, TerminalProc, - TelnetProc, SshProc, SelectionProc, ColourProc + TelnetProc, SshProc, SelectionProc, ColourProc, TranslationProc }; static char *panelids[NPANELS] = { MAKEINTRESOURCE(IDD_PANEL0), @@ -1028,14 +1278,17 @@ static char *panelids[NPANELS] = { MAKEINTRESOURCE(IDD_PANEL3), MAKEINTRESOURCE(IDD_PANEL35), MAKEINTRESOURCE(IDD_PANEL4), - MAKEINTRESOURCE(IDD_PANEL5) + MAKEINTRESOURCE(IDD_PANEL5), + MAKEINTRESOURCE(IDD_PANEL6) }; + static char *names[NPANELS] = { - "Connection", "Keyboard", "Terminal", "Telnet", "SSH", "Selection", "Colours" + "Connection", "Keyboard", "Terminal", "Telnet", + "SSH", "Selection", "Colours", "Translation" }; -static int mainp[MAIN_NPANELS] = { 0, 1, 2, 3, 4, 5, 6 }; -static int reconfp[RECONF_NPANELS] = { 1, 2, 5, 6 }; +static int mainp[MAIN_NPANELS] = { 0, 1, 2, 3, 4, 5, 6, 7}; +static int reconfp[RECONF_NPANELS] = { 1, 2, 5, 6, 7}; static int GenericMainDlgProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, @@ -1109,6 +1362,12 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg, case WM_CLOSE: EndDialog (hwnd, 0); return 0; + + /* Grrr Explorer will maximize Dialogs! */ + case WM_SIZE: + if (wParam == SIZE_MAXIMIZED) + force_normal(hwnd); + return 0; } return 0; } @@ -1154,7 +1413,7 @@ static int CALLBACK ReconfDlgProc (HWND hwnd, UINT msg, RECONF_NPANELS, reconfp, &page); } -static void get_sesslist(int allocate) { +void get_sesslist(int allocate) { static char *buffer; int buflen, bufsize, i, ret; char otherbuf[2048]; @@ -1224,6 +1483,9 @@ int do_reconfig (HWND hwnd) { ret = DialogBox (hinst, MAKEINTRESOURCE(IDD_RECONF), hwnd, ReconfDlgProc); if (!ret) cfg = backup_cfg; /* structure copy */ + else + force_normal(hwnd); + return ret; } @@ -1234,20 +1496,20 @@ void do_defaults (char *session) { load_settings ("Default Settings", FALSE); } -void lognegot (char *string) { - if (nnegots >= negsize) { +void logevent (char *string) { + if (nevents >= negsize) { negsize += 64; - negots = srealloc (negots, negsize * sizeof(*negots)); + events = srealloc (events, negsize * sizeof(*events)); } - negots[nnegots] = smalloc(1+strlen(string)); - strcpy (negots[nnegots], string); - nnegots++; + events[nevents] = smalloc(1+strlen(string)); + strcpy (events[nevents], string); + nevents++; if (logbox) SendDlgItemMessage (logbox, IDN_LIST, LB_ADDSTRING, 0, (LPARAM)string); } -void shownegot (HWND hwnd) { +void showeventlog (HWND hwnd) { if (!logbox) { logbox = CreateDialog (hinst, MAKEINTRESOURCE(IDD_LOGBOX), hwnd, LogProc); @@ -1263,26 +1525,19 @@ void showabout (HWND hwnd) { } } -void verify_ssh_host_key(char *host, struct RSAKey *key) { - char *keystr, *otherstr, *mungedhost; +void verify_ssh_host_key(char *host, char *keystr) { + char *otherstr, *mungedhost; int len; HKEY rkey; - /* - * Format the key into a string. - */ - len = rsastr_len(key); - keystr = malloc(len); - if (!keystr) - fatalbox("Out of memory"); - rsastr_fmt(keystr, key); + len = 1 + strlen(keystr); /* * Now read a saved key in from the registry and see what it * says. */ - otherstr = malloc(len); - mungedhost = malloc(3*strlen(host)+1); + otherstr = smalloc(len); + mungedhost = smalloc(3*strlen(host)+1); if (!otherstr || !mungedhost) fatalbox("Out of memory");