X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/2d3411e92334d83d913cac4298fb218dfaebe291..0965bee0865fd8ea129b2de62a3c50e09c59a184:/window.c diff --git a/window.c b/window.c index 26fcb0de..cef6825f 100644 --- a/window.c +++ b/window.c @@ -101,13 +101,10 @@ static Mouse_Button lastbtn; static char *window_name, *icon_name; -static Ldisc *real_ldisc; - static int compose_state = 0; -void begin_session(void) { - ldisc = real_ldisc; -} +/* Dummy routine, only required in plink. */ +void ldisc_update(int echo, int edit) {} int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) { static char appname[] = "PuTTY"; @@ -318,11 +315,6 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) { 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... */ - ldisc = &ldisc_simple; - if (!prev) { wndclass.style = 0; wndclass.lpfnWndProc = WndProc; @@ -564,7 +556,8 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) { } if(!timer_id) timer_id = SetTimer(hwnd, 1, 20, NULL); - DispatchMessage (&msg); + if (!(IsWindow(logbox) && IsDialogMessage(logbox, &msg))) + DispatchMessage (&msg); /* Make sure we blink everything that needs it. */ term_blink(0); @@ -1054,6 +1047,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; @@ -1077,7 +1081,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; @@ -1087,6 +1091,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", @@ -1094,6 +1099,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: @@ -1206,11 +1212,10 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, init_fonts(0); sfree(logpal); /* - * Telnet will change local echo -> remote if the - * remote asks. + * Flush the line discipline's edit buffer in the + * case where local editing has just been disabled. */ - if (cfg.protocol != PROT_TELNET) - ldisc = (cfg.ldisc_term ? &ldisc_term : &ldisc_simple); + ldisc_send(NULL, 0); if (pal) DeleteObject(pal); logpal = NULL; @@ -1329,40 +1334,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. @@ -1428,6 +1440,7 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, term_update(); break; case WM_KILLFOCUS: + show_mouseptr(1); has_focus = FALSE; DestroyCaret(); term_out(); @@ -1593,7 +1606,10 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, len = TranslateKey (message, wParam, lParam, buf); if (len == -1) return DefWindowProc (hwnd, message, wParam, lParam); - ldisc->send (buf, len); + ldisc_send (buf, len); + + if (len > 0) + show_mouseptr(0); } } return 0; @@ -1603,7 +1619,7 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, buf[1] = wParam; buf[0] = wParam >> 8; - ldisc->send (buf, 2); + ldisc_send (buf, 2); } case WM_CHAR: case WM_SYSCHAR: @@ -1615,7 +1631,7 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, */ { char c = xlat_kbd2tty((unsigned char)wParam); - ldisc->send (&c, 1); + ldisc_send (&c, 1); } return 0; }