X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/5b7ce734d2e126ebebf27b0a6ece1db672cd3eae..126ea1abe12d4f9e771d7148b4d8aa11b0c40282:/window.c?ds=sidebyside diff --git a/window.c b/window.c index 8c2d96c9..26fcb0de 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' && @@ -537,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; @@ -1060,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: @@ -1170,11 +1172,28 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, 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; @@ -1250,6 +1269,8 @@ 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); @@ -1262,6 +1283,7 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, 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); @@ -1417,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: { @@ -1497,6 +1521,8 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, */ if (!resizing) back->size(); + else + need_backend_resize = TRUE; just_reconfigged = FALSE; } } @@ -1637,7 +1663,7 @@ void do_text (Context ctx, int x, int y, char *text, int len, x *= fnt_width; y *= font_height; - if (attr & ATTR_ACTCURS) { + if ((attr & ATTR_ACTCURS) && cfg.cursor_type == 0) { attr &= (bold_mode == BOLD_COLOURS ? 0x300200 : 0x300300); attr ^= ATTR_CUR_XOR; } @@ -1798,7 +1824,7 @@ void do_text (Context ctx, int x, int y, char *text, int len, oldpen = SelectObject (hdc, oldpen); DeleteObject (oldpen); } - if (attr & ATTR_PASCURS) { + if ((attr & ATTR_PASCURS) && cfg.cursor_type == 0) { POINT pts[5]; HPEN oldpen; pts[0].x = pts[1].x = pts[4].x = x; @@ -1810,6 +1836,34 @@ void do_text (Context ctx, int x, int y, char *text, int len, oldpen = SelectObject (hdc, oldpen); DeleteObject (oldpen); } + if ((attr & (ATTR_ACTCURS | ATTR_PASCURS)) && cfg.cursor_type != 0) { + int startx, starty, dx, dy, length, i; + if (cfg.cursor_type == 1) { + startx = x; starty = y+descent; + dx = 1; dy = 0; length = fnt_width; + } else { + int xadjust = 0; + if (attr & ATTR_RIGHTCURS) + xadjust = fnt_width-1; + startx = x+xadjust; starty = y; + dx = 0; dy = 1; length = font_height; + } + if (attr & ATTR_ACTCURS) { + HPEN oldpen; + oldpen = SelectObject (hdc, CreatePen(PS_SOLID, 0, colours[23])); + MoveToEx (hdc, startx, starty, NULL); + LineTo (hdc, startx+dx*length, starty+dy*length); + oldpen = SelectObject (hdc, oldpen); + DeleteObject (oldpen); + } else { + for (i = 0; i < length; i++) { + if (i % 2 == 0) { + SetPixel(hdc, startx, starty, colours[23]); + } + startx += dx; starty += dy; + } + } + } } static int check_compose(int first, int second) { @@ -1865,11 +1919,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 @@ -1902,7 +1959,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)); @@ -2059,6 +2116,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; @@ -2286,7 +2344,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; @@ -2335,7 +2393,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)