default_protocol = DEFAULT_PROTOCOL;
default_port = DEFAULT_PORT;
+ cfg.logtype = LGTYP_NONE;
do_defaults(NULL, &cfg);
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' &&
}
}
+ /* 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... */
{
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.
ShowWindow (hwnd, show);
/*
+ * Open the initial log file if there is one.
+ */
+ logfopen();
+
+ /*
* Set the palette up.
*/
pal = NULL;
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:
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 {
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;
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|
}
}
+ 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);
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();
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:
{
*/
if (!resizing)
back->size();
+ else
+ need_backend_resize = TRUE;
just_reconfigged = FALSE;
}
}
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
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));
}
#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)
}
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 ||
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;
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;
/* 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)