X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=window.c;h=c7c652bb316fa8ae563934a83c9c0d0a6795e0e2;hb=8446532e4ad4e8e68eb82bf86a36ba1f5a38d78f;hp=decb220643f7b1f61435f1c91c23b8a110130faf;hpb=97994b235de91d807feef8853228d052649e8a38;p=PuTTY.git diff --git a/window.c b/window.c index decb2206..c7c652bb 100644 --- a/window.c +++ b/window.c @@ -3,11 +3,11 @@ #include #include #include +#include #define PUTTY_DO_GLOBALS /* actually _define_ globals */ #include "putty.h" #include "win_res.h" -#include "sizetip.h" #define IDM_SHOWLOG 0x0010 #define IDM_NEWSESS 0x0020 @@ -151,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; @@ -182,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; @@ -342,9 +345,10 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) { AppendMenu (p, MF_ENABLED, IDM_TEL_EOR, "End Of Record"); AppendMenu (p, MF_ENABLED, IDM_TEL_EOF, "End Of File"); AppendMenu (m, MF_POPUP | MF_ENABLED, (UINT) p, "Telnet Command"); - AppendMenu (m, MF_ENABLED, IDM_SHOWLOG, "Show Negotiation"); AppendMenu (m, MF_SEPARATOR, 0, 0); } + AppendMenu (m, MF_ENABLED, IDM_SHOWLOG, "Event Log"); + AppendMenu (m, MF_SEPARATOR, 0, 0); AppendMenu (m, MF_ENABLED, IDM_NEWSESS, "New Session"); AppendMenu (m, MF_ENABLED, IDM_DUPSESS, "Duplicate Session"); s = CreateMenu(); @@ -507,8 +511,8 @@ static void init_fonts(void) { CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, \ FIXED_PITCH | FF_DONTCARE, cfg.font) if (cfg.vtmode != VT_OEMONLY) { - f(FONT_NORMAL, ANSI_CHARSET, fw_dontcare, FALSE); - f(FONT_UNDERLINE, ANSI_CHARSET, fw_dontcare, TRUE); + f(FONT_NORMAL, cfg.fontcharset, fw_dontcare, FALSE); + f(FONT_UNDERLINE, cfg.fontcharset, fw_dontcare, TRUE); } if (cfg.vtmode == VT_OEMANSI || cfg.vtmode == VT_OEMONLY) { f(FONT_OEM, OEM_CHARSET, fw_dontcare, FALSE); @@ -516,8 +520,8 @@ static void init_fonts(void) { } if (bold_mode == BOLD_FONT) { if (cfg.vtmode != VT_OEMONLY) { - f(FONT_BOLD, ANSI_CHARSET, fw_bold, FALSE); - f(FONT_BOLDUND, ANSI_CHARSET, fw_bold, TRUE); + f(FONT_BOLD, cfg.fontcharset, fw_bold, FALSE); + f(FONT_BOLDUND, cfg.fontcharset, fw_bold, TRUE); } if (cfg.vtmode == VT_OEMANSI || cfg.vtmode == VT_OEMONLY) { f(FONT_OEMBOLD, OEM_CHARSET, fw_bold, FALSE); @@ -629,7 +633,7 @@ static int WINAPI WndProc (HWND hwnd, UINT message, case WM_SYSCOMMAND: switch (wParam & ~0xF) { /* low 4 bits reserved to Windows */ case IDM_SHOWLOG: - shownegot(hwnd); + showeventlog(hwnd); break; case IDM_NEWSESS: case IDM_DUPSESS: @@ -668,15 +672,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 +717,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; @@ -1014,7 +1021,9 @@ static int WINAPI WndProc (HWND hwnd, UINT message, int len; len = TranslateKey (wParam, lParam, buf); - back->send (buf, len); + if (len == -1) + return DefWindowProc (hwnd, message, wParam, lParam); + ldisc->send (buf, len); } return 0; case WM_KEYUP: @@ -1053,8 +1062,8 @@ static int WINAPI WndProc (HWND hwnd, UINT message, * we're ready to cope. */ { - char c = wParam; - back->send (&c, 1); + char c = xlat_kbd2tty((unsigned char)wParam); + ldisc->send (&c, 1); } return 0; } @@ -1242,6 +1251,29 @@ static int TranslateKey(WPARAM wParam, LPARAM lParam, unsigned char *output) { cancel_alt = TRUE; } + /* + * 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. @@ -1254,9 +1286,12 @@ static int TranslateKey(WPARAM wParam, LPARAM lParam, unsigned char *output) { SendMessage (hwnd, WM_VSCROLL, SB_PAGEDOWN, 0); return 0; } - if ((lParam & 0x20000000) && wParam == VK_F4) { - SendMessage (hwnd, WM_CLOSE, 0, 0); - return 0; + if ((lParam & 0x20000000) && wParam == VK_F4 && cfg.alt_f4) { + return -1; + } + if ((lParam & 0x20000000) && wParam == VK_SPACE && cfg.alt_space) { + SendMessage (hwnd, WM_SYSCOMMAND, SC_KEYMENU, 0); + return -1; } /* @@ -1282,12 +1317,12 @@ static int TranslateKey(WPARAM wParam, LPARAM lParam, unsigned char *output) { return p - output; } - /* - * If we're in applications keypad mode, we have to process it - * before char-map translation, because it will pre-empt lots - * of stuff, even if NumLock is off. - */ 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 + * of stuff, even if NumLock is off. + */ if (ret) { /* * Hack to ensure NumLock doesn't interfere with @@ -1341,10 +1376,20 @@ static int TranslateKey(WPARAM wParam, LPARAM lParam, unsigned char *output) { */ if (ret) { WORD chr; - int r = ToAscii (wParam, (lParam >> 16) & 0xFF, - keystate, &chr, 0); + int r; + BOOL capsOn=keystate[VK_CAPITAL] !=0; + + /* helg: clear CAPS LOCK state if caps lock switches to cyrillic */ + if(cfg.xlat_capslockcyr) + keystate[VK_CAPITAL] = 0; + + r = ToAscii (wParam, (lParam >> 16) & 0xFF, + keystate, &chr, 0); + + if(capsOn) + chr = xlat_latkbd2win((unsigned char)(chr & 0xFF)); if (r == 1) { - *p++ = chr & 0xFF; + *p++ = xlat_kbd2tty((unsigned char)(chr & 0xFF)); return p - output; } }