X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/3da0b1d2851d9ab4e15bf611be157ab3a8b33e75..3332c06e056a2a3dd57a3c8951b24210f660832a:/window.c?ds=sidebyside diff --git a/window.c b/window.c index b9f509e7..2e68239c 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' && @@ -426,6 +422,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) { caretbm = CreateBitmap(font_width, font_height, 1, 1, bits); sfree(bits); } + CreateCaret(hwnd, caretbm, font_width, font_height); /* * Initialise the scroll bar. @@ -536,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; @@ -1052,6 +1054,17 @@ static void click (Mouse_Button b, int x, int y) { lasttime = thistime; } +static void show_mouseptr(int show) { + static int cursor_visible = 1; + if (!cfg.hide_mouseptr) /* override if this feature disabled */ + show = 1; + if (cursor_visible && !show) + ShowCursor(FALSE); + else if (!cursor_visible && show) + ShowCursor(TRUE); + cursor_visible = show; +} + static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; @@ -1059,6 +1072,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: @@ -1074,7 +1088,7 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, { time_t now; time(&now); - if (now-last_movement > cfg.ping_interval * 60 - 10) + if (now-last_movement > cfg.ping_interval) { back->special(TS_PING); last_movement = now; @@ -1084,6 +1098,7 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, case WM_CREATE: break; case WM_CLOSE: + show_mouseptr(1); if (!cfg.warn_on_close || session_closed || MessageBox(hwnd, "Are you sure you want to close this session?", "PuTTY Exit Confirmation", @@ -1091,6 +1106,7 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, DestroyWindow(hwnd); return 0; case WM_DESTROY: + show_mouseptr(1); PostQuitMessage (0); return 0; case WM_SYSCOMMAND: @@ -1169,11 +1185,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; @@ -1249,6 +1282,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); @@ -1261,6 +1296,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); @@ -1306,40 +1342,47 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, #define TO_CHR_Y(y) (((y)<0 ? (y)-font_height+1: (y)) / font_height) case WM_LBUTTONDOWN: + show_mouseptr(1); click (MB_SELECT, TO_CHR_X(X_POS(lParam)), TO_CHR_Y(Y_POS(lParam))); SetCapture(hwnd); return 0; case WM_LBUTTONUP: + show_mouseptr(1); term_mouse (MB_SELECT, MA_RELEASE, TO_CHR_X(X_POS(lParam)), TO_CHR_Y(Y_POS(lParam))); ReleaseCapture(); return 0; case WM_MBUTTONDOWN: + show_mouseptr(1); SetCapture(hwnd); click (cfg.mouse_is_xterm ? MB_PASTE : MB_EXTEND, TO_CHR_X(X_POS(lParam)), TO_CHR_Y(Y_POS(lParam))); return 0; case WM_MBUTTONUP: + show_mouseptr(1); term_mouse (cfg.mouse_is_xterm ? MB_PASTE : MB_EXTEND, MA_RELEASE, TO_CHR_X(X_POS(lParam)), TO_CHR_Y(Y_POS(lParam))); ReleaseCapture(); return 0; case WM_RBUTTONDOWN: + show_mouseptr(1); SetCapture(hwnd); click (cfg.mouse_is_xterm ? MB_EXTEND : MB_PASTE, TO_CHR_X(X_POS(lParam)), TO_CHR_Y(Y_POS(lParam))); return 0; case WM_RBUTTONUP: + show_mouseptr(1); term_mouse (cfg.mouse_is_xterm ? MB_EXTEND : MB_PASTE, MA_RELEASE, TO_CHR_X(X_POS(lParam)), TO_CHR_Y(Y_POS(lParam))); ReleaseCapture(); return 0; case WM_MOUSEMOVE: + show_mouseptr(1); /* * Add the mouse position and message time to the random * number noise. @@ -1398,13 +1441,14 @@ 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(); term_update(); break; case WM_KILLFOCUS: + show_mouseptr(1); has_focus = FALSE; DestroyCaret(); term_out(); @@ -1416,11 +1460,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: { @@ -1496,6 +1542,8 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, */ if (!resizing) back->size(); + else + need_backend_resize = TRUE; just_reconfigged = FALSE; } } @@ -1567,6 +1615,9 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, if (len == -1) return DefWindowProc (hwnd, message, wParam, lParam); ldisc->send (buf, len); + + if (len > 0) + show_mouseptr(0); } } return 0; @@ -1636,7 +1687,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; } @@ -1797,7 +1848,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; @@ -1809,6 +1860,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) { @@ -1864,11 +1943,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 @@ -1901,7 +1983,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)); @@ -2058,6 +2140,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; @@ -2285,7 +2368,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; @@ -2334,7 +2417,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)