X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/c5e9c988d0706d1abb7fab7b2d2b1514bc119584..cabfd08c97213abe46f996a93407f8209fc38b94:/window.c diff --git a/window.c b/window.c index 6afd10e8..fd46be4c 100644 --- a/window.c +++ b/window.c @@ -3,6 +3,7 @@ #include #include #include +#include #define PUTTY_DO_GLOBALS /* actually _define_ globals */ #include "putty.h" @@ -150,7 +151,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) { */ HANDLE filemap; Config *cp; - if (sscanf(p+1, "%x", &filemap) == 1 && + if (sscanf(p+1, "%p", &filemap) == 1 && (cp = MapViewOfFile(filemap, FILE_MAP_READ, 0, 0, sizeof(Config))) != NULL) { cfg = *cp; @@ -181,7 +182,10 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) { } back = (cfg.protocol == PROT_SSH ? &ssh_backend : - cfg.protocol == PROT_TELNET ? &telnet_backend : &raw_backend ); + cfg.protocol == PROT_TELNET ? &telnet_backend : + &raw_backend); + + ldisc = (cfg.ldisc_term ? &ldisc_term : &ldisc_simple); if (!prev) { wndclass.style = 0; @@ -306,6 +310,11 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) { inbuf_reap = inbuf_head = 0; outbuf_reap = outbuf_head = 0; + /* + * Choose unscroll method + */ + unscroll_event = US_DISP; + /* * Prepare the mouse handler. */ @@ -668,15 +677,17 @@ static int WINAPI WndProc (HWND hwnd, UINT message, UnmapViewOfFile(p); } } - sprintf(c, "putty &%08x", filemap); + sprintf(c, "putty &%p", filemap); cl = c; } else if (wParam == IDM_SAVEDSESS) { char *session = sessions[(lParam - IDM_SAVED_MIN) / 16]; cl = malloc(16 + strlen(session)); /* 8, but play safe */ if (!cl) cl = NULL; /* not a very important failure mode */ - sprintf(cl, "putty @%s", session); - freecl = TRUE; + else { + sprintf(cl, "putty @%s", session); + freecl = TRUE; + } } else cl = NULL; @@ -711,6 +722,7 @@ static int WINAPI WndProc (HWND hwnd, UINT message, und_mode = UND_FONT; init_fonts(); sfree(logpal); + ldisc = (cfg.ldisc_term ? &ldisc_term : &ldisc_simple); if (pal) DeleteObject(pal); logpal = NULL; @@ -1016,7 +1028,7 @@ static int WINAPI WndProc (HWND hwnd, UINT message, len = TranslateKey (wParam, lParam, buf); if (len == -1) return DefWindowProc (hwnd, message, wParam, lParam); - back->send (buf, len); + ldisc->send (buf, len); } return 0; case WM_KEYUP: @@ -1056,7 +1068,7 @@ static int WINAPI WndProc (HWND hwnd, UINT message, */ { char c = xlat_kbd2tty((unsigned char)wParam); - back->send (&c, 1); + ldisc->send (&c, 1); } return 0; } @@ -1218,6 +1230,14 @@ static int TranslateKey(WPARAM wParam, LPARAM lParam, unsigned char *output) { ret = GetKeyboardState(keystate); /* + * Record that we pressed key so the scroll window can be reset, but + * be careful to avoid Shift-UP/Down + */ + if( wParam != VK_SHIFT && wParam != VK_PRIOR && wParam != VK_NEXT ) { + seen_key_event = 1; + } + + /* * Windows does not always want to distinguish left and right * Alt or Control keys. Thus we keep track of them ourselves. * See also the WM_KEYUP handler. @@ -1245,6 +1265,29 @@ static int TranslateKey(WPARAM wParam, LPARAM lParam, unsigned char *output) { } /* + * NetHack keypad mode. This may conflict with Shift-PgUp/PgDn, + * so we do it first. + */ + if (cfg.nethack_keypad) { + int shift = keystate[VK_SHIFT] & 0x80; + /* + * NB the shifted versions only work with numlock off. + */ + switch ( (lParam >> 16) & 0x1FF ) { + case 0x047: *p++ = shift ? 'Y' : 'y'; return p - output; + case 0x048: *p++ = shift ? 'K' : 'k'; return p - output; + case 0x049: *p++ = shift ? 'U' : 'u'; return p - output; + case 0x04B: *p++ = shift ? 'H' : 'h'; return p - output; + case 0x04C: *p++ = '.'; return p - output; + case 0x04D: *p++ = shift ? 'L' : 'l'; return p - output; + case 0x04F: *p++ = shift ? 'B' : 'b'; return p - output; + case 0x050: *p++ = shift ? 'J' : 'j'; return p - output; + case 0x051: *p++ = shift ? 'N' : 'n'; return p - output; + case 0x053: *p++ = '.'; return p - output; + } + } + + /* * Shift-PgUp, Shift-PgDn, and Alt-F4 all produce window * events: we'll deal with those now. */ @@ -1287,24 +1330,7 @@ static int TranslateKey(WPARAM wParam, LPARAM lParam, unsigned char *output) { return p - output; } - if (cfg.nethack_keypad) { - int shift = keystate[VK_SHIFT] & 0x80; - /* - * NB the shifted versions only work with numlock off. - */ - switch ( (lParam >> 16) & 0x1FF ) { - case 0x047: *p++ = shift ? 'Y' : 'y'; return p - output; - case 0x048: *p++ = shift ? 'K' : 'k'; return p - output; - case 0x049: *p++ = shift ? 'U' : 'u'; return p - output; - case 0x04B: *p++ = shift ? 'H' : 'h'; return p - output; - case 0x04C: *p++ = '.'; return p - output; - case 0x04D: *p++ = shift ? 'L' : 'l'; return p - output; - case 0x04F: *p++ = shift ? 'B' : 'b'; return p - output; - case 0x050: *p++ = shift ? 'J' : 'j'; return p - output; - case 0x051: *p++ = shift ? 'N' : 'n'; return p - output; - case 0x053: *p++ = '.'; return p - output; - } - } else if (app_keypad_keys) { + if (app_keypad_keys) { /* * If we're in applications keypad mode, we have to process it * before char-map translation, because it will pre-empt lots