X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/8f22582cf466052917dad28301545cfa60db76e8..b2a1eade5dd99b8252fab726a6f78f419e0d52a2:/window.c diff --git a/window.c b/window.c index 9948763e..46bf64f2 100644 --- a/window.c +++ b/window.c @@ -128,6 +128,8 @@ static char *window_name, *icon_name; static int compose_state = 0; +static OSVERSIONINFO osVersion; + /* Dummy routine, only required in plink. */ void ldisc_update(int echo, int edit) { @@ -166,6 +168,16 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) * config box. */ defuse_showwindow(); + { + ZeroMemory(&osVersion, sizeof(osVersion)); + osVersion.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); + if (!GetVersionEx ( (OSVERSIONINFO *) &osVersion)) { + MessageBox(NULL, "Windows refuses to report a version", + "PuTTY Fatal Error", MB_OK | MB_ICONEXCLAMATION); + return 1; + } + } + /* * Process the command line. */ @@ -574,6 +586,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) * Finally show the window! */ ShowWindow(hwnd, show); + SetForegroundWindow(hwnd); /* * Open the initial log file if there is one. @@ -693,7 +706,7 @@ char *do_select(SOCKET skt, int startup) int msg, events; if (startup) { msg = WM_NETEVENT; - events = FD_READ | FD_WRITE | FD_OOB | FD_CLOSE; + events = FD_READ | FD_WRITE | FD_OOB | FD_CLOSE | FD_ACCEPT; } else { msg = events = 0; } @@ -1850,10 +1863,19 @@ 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); - if (len > 0) + if (len != 0) { + /* + * We need not bother about stdin backlogs + * here, because in GUI PuTTY we can't do + * anything about it anyway; there's no means + * of asking Windows to hold off on KEYDOWN + * messages. We _have_ to buffer everything + * we're sent. + */ + ldisc_send(buf, len); show_mouseptr(0); + } } } return 0; @@ -1872,6 +1894,31 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, kbd_codepage = atoi(lbuf); } break; + case WM_IME_COMPOSITION: + { + HIMC hIMC; + int n; + char *buff; + + if(osVersion.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS || + osVersion.dwPlatformId == VER_PLATFORM_WIN32s) break; /* no Unicode */ + + if ((lParam & GCS_RESULTSTR) == 0) /* Composition unfinished. */ + break; /* fall back to DefWindowProc */ + + hIMC = ImmGetContext(hwnd); + n = ImmGetCompositionStringW(hIMC, GCS_RESULTSTR, NULL, 0); + + if (n > 0) { + buff = (char*) smalloc(n); + ImmGetCompositionStringW(hIMC, GCS_RESULTSTR, buff, n); + luni_send((unsigned short *)buff, n / 2); + free(buff); + } + ImmReleaseContext(hwnd, hIMC); + return 1; + } + case WM_IME_CHAR: if (wParam & 0xFF00) { unsigned char buf[2]; @@ -1915,8 +1962,27 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, */ void sys_cursor(int x, int y) { - if (has_focus) - SetCaretPos(x * font_width, y * font_height); + COMPOSITIONFORM cf; + HIMC hIMC; + + if (!has_focus) return; + + SetCaretPos(x * font_width, y * font_height); + + /* IMM calls on Win98 and beyond only */ + if(osVersion.dwPlatformId == VER_PLATFORM_WIN32s) return; /* 3.11 */ + + if(osVersion.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS && + osVersion.dwMinorVersion == 0) return; /* 95 */ + + /* we should have the IMM functions */ + hIMC = ImmGetContext(hwnd); + cf.dwStyle = CFS_POINT; + cf.ptCurrentPos.x = x * font_width; + cf.ptCurrentPos.y = y * font_height; + ImmSetCompositionWindow(hIMC, &cf); + + ImmReleaseContext(hwnd, hIMC); } /* @@ -2757,7 +2823,8 @@ static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam, return p - output; } - if (cfg.funky_type == 5 && code >= 11 && code <= 34) { + if (cfg.funky_type == 5 && /* SCO function keys */ + code >= 11 && code <= 34) { char codes[] = "MNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz@[\\]^_`{"; int index = 0; switch (wParam) { @@ -2779,6 +2846,16 @@ static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam, p += sprintf((char *) p, "\x1B[%c", codes[index]); return p - output; } + if (cfg.funky_type == 5 && /* SCO small keypad */ + code >= 1 && code <= 6) { + char codes[] = "HL.FIG"; + if (code == 3) { + *p++ = '\x7F'; + } else { + p += sprintf((char *) p, "\x1B[%c", codes[code-1]); + } + return p - output; + } if ((vt52_mode || cfg.funky_type == 4) && code >= 11 && code <= 24) { int offt = 0; if (code > 15) @@ -2930,6 +3007,15 @@ static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam, luni_send(&keybuf, 1); } else { ch = (char) alt_sum; + /* + * We need not bother about stdin + * backlogs here, because in GUI PuTTY + * we can't do anything about it + * anyway; there's no means of asking + * Windows to hold off on KEYDOWN + * messages. We _have_ to buffer + * everything we're sent. + */ ldisc_send(&ch, 1); } alt_sum = 0; @@ -2941,6 +3027,7 @@ static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam, lpage_send(kbd_codepage, cbuf + !left_alt, 1 + !!left_alt); } + show_mouseptr(0); } /* This is so the ALT-Numpad and dead keys work correctly. */