X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/bc1235d46977981e2ce7a8684f123da84d07286b..b65d182beff5f0a5a2b743c886416c8d65a5b921:/window.c diff --git a/window.c b/window.c index 572b0c56..a9456c8c 100644 --- a/window.c +++ b/window.c @@ -149,6 +149,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) { default_protocol = DEFAULT_PROTOCOL; default_port = DEFAULT_PORT; + cfg.logtype = LGTYP_NONE; do_defaults(NULL, &cfg); @@ -169,11 +170,6 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) { tolower(p[2]) == 'h') { default_protocol = cfg.protocol = PROT_SSH; default_port = cfg.port = 22; - } else if (q == p + 3 && - tolower(p[0]) == 'l' && - tolower(p[1]) == 'o' && - tolower(p[2]) == 'g') { - logfile = "putty.log"; } else if (q == p + 7 && tolower(p[0]) == 'c' && tolower(p[1]) == 'l' && @@ -314,6 +310,14 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) { } } + /* Check for invalid Port number (i.e. zero) */ + if (cfg.port == 0) { + MessageBox(NULL, "Invalid Port Number", + "PuTTY Internal Error", MB_OK |MB_ICONEXCLAMATION); + WSACleanup(); + return 1; + } + real_ldisc = (cfg.ldisc_term ? &ldisc_term : &ldisc_simple); /* To start with, we use the simple line discipline, so we can * type passwords etc without fear of them being echoed... */ @@ -413,10 +417,12 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) { { char *bits; int size = (font_width+15)/16 * 2 * font_height; - bits = calloc(size, 1); + bits = smalloc(size); + memset(bits, 0, size); caretbm = CreateBitmap(font_width, font_height, 1, 1, bits); - free(bits); + sfree(bits); } + CreateCaret(hwnd, caretbm, font_width, font_height); /* * Initialise the scroll bar. @@ -527,6 +533,11 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) { ShowWindow (hwnd, show); /* + * Open the initial log file if there is one. + */ + logfopen(); + + /* * Set the palette up. */ pal = NULL; @@ -1050,6 +1061,7 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, static int ignore_clip = FALSE; static int just_reconfigged = FALSE; static int resizing = FALSE; + static int need_backend_resize = FALSE; switch (message) { case WM_TIMER: @@ -1130,7 +1142,7 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, cl = c; } else if (wParam == IDM_SAVEDSESS) { char *session = sessions[(lParam - IDM_SAVED_MIN) / 16]; - cl = malloc(16 + strlen(session)); /* 8, but play safe */ + cl = smalloc(16 + strlen(session)); /* 8, but play safe */ if (!cl) cl = NULL; /* not a very important failure mode */ else { @@ -1154,14 +1166,34 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, if (filemap) CloseHandle(filemap); if (freecl) - free(cl); + sfree(cl); } break; case IDM_RECONF: { int prev_alwaysontop = cfg.alwaysontop; + char oldlogfile[FILENAME_MAX]; + int oldlogtype; + int need_setwpos = FALSE; + int old_fwidth, old_fheight; + + strcpy(oldlogfile, cfg.logfilename); + oldlogtype = cfg.logtype; + cfg.width = cols; + cfg.height = rows; + old_fwidth = font_width; + old_fheight = font_height; + GetWindowText(hwnd, cfg.wintitle, sizeof(cfg.wintitle)); + if (!do_reconfig(hwnd)) break; + + if (strcmp(oldlogfile, cfg.logfilename) || + oldlogtype != cfg.logtype) { + logfclose(); /* reset logging */ + logfopen(); + } + just_reconfigged = TRUE; { int i; @@ -1222,6 +1254,7 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, SetWindowLong(hwnd, GWL_EXSTYLE, nexflag); SendMessage (hwnd, WM_IGNORE_SIZE, 0, 0); + SetWindowPos(hwnd, NULL, 0,0,0,0, SWP_NOACTIVATE|SWP_NOCOPYBITS| SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER| @@ -1234,13 +1267,23 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, } } + if (cfg.height != rows || + cfg.width != cols || + old_fwidth != font_width || + old_fheight != font_height || + cfg.savelines != savelines) + need_setwpos = TRUE; term_size(cfg.height, cfg.width, cfg.savelines); InvalidateRect(hwnd, NULL, TRUE); - SetWindowPos (hwnd, NULL, 0, 0, - extra_width + font_width * cfg.width, - extra_height + font_height * cfg.height, - SWP_NOACTIVATE | SWP_NOCOPYBITS | - SWP_NOMOVE | SWP_NOZORDER); + if (need_setwpos) { + force_normal(hwnd); + SetWindowPos (hwnd, NULL, 0, 0, + extra_width + font_width * cfg.width, + extra_height + font_height * cfg.height, + SWP_NOACTIVATE | SWP_NOCOPYBITS | + SWP_NOMOVE | SWP_NOZORDER); + } + set_title(cfg.wintitle); if (IsIconic(hwnd)) { SetWindowText (hwnd, cfg.win_name_always ? window_name : icon_name); @@ -1378,7 +1421,7 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, return 0; case WM_SETFOCUS: has_focus = TRUE; - CreateCaret(hwnd, caretbm, 0, 0); + CreateCaret(hwnd, caretbm, font_width, font_height); ShowCaret(hwnd); compose_state = 0; term_out(); @@ -1396,11 +1439,13 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, case WM_ENTERSIZEMOVE: EnableSizeTip(1); resizing = TRUE; + need_backend_resize = FALSE; break; case WM_EXITSIZEMOVE: EnableSizeTip(0); resizing = FALSE; - back->size(); + if (need_backend_resize) + back->size(); break; case WM_SIZING: { @@ -1476,6 +1521,8 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, */ if (!resizing) back->size(); + else + need_backend_resize = TRUE; just_reconfigged = FALSE; } } @@ -1844,11 +1891,14 @@ static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam, int scan, left_alt = 0, key_down, shift_state; int r, i, code; unsigned char * p = output; + static int alt_state = 0; + + HKL kbd_layout = GetKeyboardLayout(0); static WORD keys[3]; static int compose_char = 0; static WPARAM compose_key = 0; - + r = GetKeyboardState(keystate); if (!r) memset(keystate, 0, sizeof(keystate)); else @@ -1881,7 +1931,7 @@ static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam, debug(("*")); debug((", S%02x", scan=(HIWORD(lParam) & 0xFF) )); - ch = MapVirtualKey(wParam, 2); + ch = MapVirtualKeyEx(wParam, 2, kbd_layout); if (ch>=' ' && ch<='~') debug((", '%c'", ch)); else if (ch) debug((", $%02x", ch)); @@ -1910,11 +1960,14 @@ static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam, } #endif + if (wParam == VK_MENU && (HIWORD(lParam)&KF_EXTENDED)) { + keystate[VK_RMENU] = keystate[VK_MENU]; + } + /* Note if AltGr was pressed and if it was used as a compose key */ if (cfg.compose_key) { if (wParam == VK_MENU && (HIWORD(lParam)&KF_EXTENDED)) { - keystate[VK_RMENU] = keystate[VK_MENU]; if (!compose_state) compose_key = wParam; } if (wParam == VK_APPS && !compose_state) @@ -1931,8 +1984,9 @@ static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam, } else if (compose_state==1 && wParam != VK_CONTROL) compose_state = 0; - } else + } else { compose_state = 0; + } /* Nastyness with NUMLock - Shift-NUMLock is left alone though */ if ( (cfg.funky_type == 3 || @@ -2034,6 +2088,7 @@ static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam, return -1; } if (left_alt && wParam == VK_SPACE && cfg.alt_space) { + alt_state = 0; PostMessage(hwnd, WM_CHAR, ' ', 0); SendMessage (hwnd, WM_SYSCOMMAND, SC_KEYMENU, 0); return -1; @@ -2261,7 +2316,7 @@ static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam, if(cfg.xlat_capslockcyr) keystate[VK_CAPITAL] = 0; - r = ToAscii (wParam, scan, keystate, keys, 0); + r = ToAsciiEx(wParam, scan, keystate, keys, 0, kbd_layout); if(r>0) { p = output; @@ -2310,7 +2365,6 @@ static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam, /* ALT alone may or may not want to bring up the System menu */ if (wParam == VK_MENU) { if (cfg.alt_only) { - static int alt_state = 0; if (message == WM_SYSKEYDOWN) alt_state = 1; else if (message == WM_SYSKEYUP && alt_state)