X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/5bc238bbefc16c6d86a914aa5baa51d34acb20b3..c9def1b8e8960113ab4fd91d0b69d5b422cf339f:/windlg.c diff --git a/windlg.c b/windlg.c index 0a8f8009..23bf2cb4 100644 --- a/windlg.c +++ b/windlg.c @@ -116,9 +116,13 @@ 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" : - cfg.protocol == PROT_TELNET ? "telnet" : "raw" ); + 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); @@ -151,13 +155,15 @@ static void save_settings (char *section, int do_host) { 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); @@ -192,7 +198,13 @@ 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); } @@ -234,15 +246,14 @@ static void load_settings (char *section, int do_host) { gpps (sesskey, "HostName", "", cfg.host, sizeof(cfg.host)); gppi (sesskey, "PortNumber", default_port, &cfg.port); + gpps (sesskey, "Protocol", "default", prot, 10); - if (!strcmp(prot, "ssh")) - cfg.protocol = PROT_SSH; - else if (!strcmp(prot, "telnet")) - cfg.protocol = PROT_TELNET; - else if (!strcmp(prot, "raw")) - cfg.protocol = PROT_RAW; - else - cfg.protocol = default_protocol; + 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); @@ -254,7 +265,7 @@ static void load_settings (char *section, int do_host) { char buf[2*sizeof(cfg.environmt)], *p, *q; gpps (sesskey, "Environment", "", buf, sizeof(buf)); p = buf; - q = cfg.environmt; + q = cfg.environmt; while (*p) { while (*p && *p != ',') { int c = *p++; @@ -262,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'; @@ -285,13 +296,15 @@ static void load_settings (char *section, int do_host) { 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); @@ -303,7 +316,7 @@ static void load_settings (char *section, int do_host) { 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++) { @@ -315,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) { @@ -345,11 +362,35 @@ static void load_settings (char *section, int do_host) { } } 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; @@ -629,8 +670,11 @@ static int CALLBACK KeyboardProc (HWND hwnd, UINT msg, cfg.bksp_is_delete ? IDC1_DEL127 : IDC1_DEL008); CheckRadioButton (hwnd, IDC1_HOMETILDE, IDC1_HOMERXVT, cfg.rxvt_homeend ? IDC1_HOMERXVT : IDC1_HOMETILDE); - CheckRadioButton (hwnd, IDC1_FUNCTILDE, IDC1_FUNCLINUX, - cfg.linux_funkeys ? IDC1_FUNCLINUX : IDC1_FUNCTILDE); + CheckRadioButton (hwnd, IDC1_FUNCTILDE, IDC1_FUNCXTERM, + cfg.funky_type ? + (cfg.funky_type==2 ? IDC1_FUNCXTERM + : IDC1_FUNCLINUX ) + : IDC1_FUNCTILDE); CheckRadioButton (hwnd, IDC1_CURNORMAL, IDC1_CURAPPLIC, cfg.app_cursor ? IDC1_CURAPPLIC : IDC1_CURNORMAL); CheckRadioButton (hwnd, IDC1_KPNORMAL, IDC1_KPNH, @@ -639,6 +683,7 @@ static int CALLBACK KeyboardProc (HWND hwnd, UINT msg, CheckDlgButton (hwnd, IDC1_ALTF4, cfg.alt_f4); CheckDlgButton (hwnd, IDC1_ALTSPACE, cfg.alt_space); CheckDlgButton (hwnd, IDC1_LDISCTERM, cfg.ldisc_term); + CheckDlgButton (hwnd, IDC1_SCROLLKEY, cfg.scroll_on_key); break; case WM_COMMAND: if (HIWORD(wParam) == BN_CLICKED || @@ -652,9 +697,12 @@ static int CALLBACK KeyboardProc (HWND hwnd, UINT msg, case IDC1_HOMERXVT: cfg.rxvt_homeend = IsDlgButtonChecked (hwnd, IDC1_HOMERXVT); break; + case IDC1_FUNCXTERM: + cfg.funky_type = 2; + break; case IDC1_FUNCTILDE: case IDC1_FUNCLINUX: - cfg.linux_funkeys = IsDlgButtonChecked (hwnd, IDC1_FUNCLINUX); + cfg.funky_type = IsDlgButtonChecked (hwnd, IDC1_FUNCLINUX); break; case IDC1_KPNORMAL: case IDC1_KPAPPLIC: @@ -684,6 +732,11 @@ static int CALLBACK KeyboardProc (HWND hwnd, UINT msg, HIWORD(wParam) == BN_DOUBLECLICKED) cfg.ldisc_term = IsDlgButtonChecked (hwnd, IDC1_LDISCTERM); break; + case IDC1_SCROLLKEY: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) + cfg.scroll_on_key = IsDlgButtonChecked (hwnd, IDC1_SCROLLKEY); + break; } } return GeneralPanelProc (hwnd, msg, wParam, lParam); @@ -718,11 +771,12 @@ static int CALLBACK TerminalProc (HWND hwnd, UINT msg, SetDlgItemInt (hwnd, IDC2_SAVEEDIT, cfg.savelines, FALSE); fmtfont (fontstatic); SetDlgItemText (hwnd, IDC2_FONTSTATIC, fontstatic); - 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); + CheckDlgButton (hwnd, IDC1_BLINKCUR, cfg.blink_cur); + CheckDlgButton (hwnd, IDC1_BEEP, cfg.beep); + CheckDlgButton (hwnd, IDC2_SCROLLBAR, cfg.scrollbar); + CheckDlgButton (hwnd, IDC2_LOCKSIZE, cfg.locksize); + CheckDlgButton (hwnd, IDC2_BCE, cfg.bce); + CheckDlgButton (hwnd, IDC2_BLINKTEXT, cfg.blinktext); break; case WM_COMMAND: switch (LOWORD(wParam)) { @@ -787,16 +841,36 @@ static int CALLBACK TerminalProc (HWND hwnd, UINT msg, SetDlgItemText (hwnd, IDC2_FONTSTATIC, fontstatic); } 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; + case IDC1_BLINKCUR: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) + cfg.blink_cur = IsDlgButtonChecked (hwnd, IDC1_BLINKCUR); + break; + case IDC1_BEEP: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) + cfg.beep = IsDlgButtonChecked (hwnd, IDC1_BEEP); + break; + case IDC2_SCROLLBAR: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) + cfg.scrollbar = IsDlgButtonChecked (hwnd, IDC2_SCROLLBAR); + break; + case IDC2_LOCKSIZE: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) + cfg.locksize = IsDlgButtonChecked (hwnd, IDC2_LOCKSIZE); + break; + case IDC2_BLINKTEXT: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) + cfg.blinktext = IsDlgButtonChecked (hwnd, IDC2_BLINKTEXT); + break; + case IDC2_BCE: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) + cfg.bce = IsDlgButtonChecked (hwnd, IDC2_BCE); + break; } break; } @@ -1120,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]); @@ -1147,20 +1221,29 @@ static int CALLBACK ColourProc (HWND hwnd, UINT msg, return GeneralPanelProc (hwnd, msg, wParam, lParam); } -static int CALLBACK LanguageProc (HWND hwnd, UINT msg, +static int CALLBACK TranslationProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: - CheckDlgButton (hwnd, IDC6_ENABLEKOIWINXLAT, cfg.xlat_enablekoiwin); + 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_ENABLEKOIWINXLAT: - if (HIWORD(wParam) == BN_CLICKED || - HIWORD(wParam) == BN_DOUBLECLICKED) { - cfg.xlat_enablekoiwin = - IsDlgButtonChecked (hwnd, IDC6_ENABLEKOIWINXLAT); - } + 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 || @@ -1169,6 +1252,16 @@ static int CALLBACK LanguageProc (HWND hwnd, UINT msg, 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); @@ -1176,7 +1269,7 @@ static int CALLBACK LanguageProc (HWND hwnd, UINT msg, static DLGPROC panelproc[NPANELS] = { ConnectionProc, KeyboardProc, TerminalProc, - TelnetProc, SshProc, SelectionProc, ColourProc, LanguageProc + TelnetProc, SshProc, SelectionProc, ColourProc, TranslationProc }; static char *panelids[NPANELS] = { MAKEINTRESOURCE(IDD_PANEL0), @@ -1191,7 +1284,7 @@ static char *panelids[NPANELS] = { static char *names[NPANELS] = { "Connection", "Keyboard", "Terminal", "Telnet", - "SSH", "Selection", "Colours", "Language" + "SSH", "Selection", "Colours", "Translation" }; static int mainp[MAIN_NPANELS] = { 0, 1, 2, 3, 4, 5, 6, 7}; @@ -1269,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; } @@ -1384,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; } @@ -1423,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");