mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-04-10 15:48:06 -05:00
Turn the Windows PuTTY main window into a Unicode window.
This causes WM_CHAR messages sent to us to have a wParam containing a 16-bit value encoded in UTF-16, rather than an 8-bit value encoded in the system code page. As far as I can tell, there aren't many other knock-on effects - e.g. you can still interact with the window using ordinary char-based API functions such as SetWindowText, and the Windows API will do the necessary conversions behind the scenes. However, even so, I'm half expecting some sort of unforeseen bug to show up as a result of this. (cherry picked from commit 67e5ceb9a8e6bc20fa0e0cf82ee9f89582e94112)
This commit is contained in:
parent
1f7f422d7a
commit
3dfb9ac885
@ -332,7 +332,6 @@ static void close_session(void *ignored_context)
|
||||
|
||||
int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
|
||||
{
|
||||
WNDCLASS wndclass;
|
||||
MSG msg;
|
||||
HRESULT hr;
|
||||
int guess_width, guess_height;
|
||||
@ -645,6 +644,8 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
|
||||
}
|
||||
|
||||
if (!prev) {
|
||||
WNDCLASSW wndclass;
|
||||
|
||||
wndclass.style = 0;
|
||||
wndclass.lpfnWndProc = WndProc;
|
||||
wndclass.cbClsExtra = 0;
|
||||
@ -654,9 +655,9 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
|
||||
wndclass.hCursor = LoadCursor(NULL, IDC_IBEAM);
|
||||
wndclass.hbrBackground = NULL;
|
||||
wndclass.lpszMenuName = NULL;
|
||||
wndclass.lpszClassName = appname;
|
||||
wndclass.lpszClassName = dup_mb_to_wc(DEFAULT_CODEPAGE, 0, appname);
|
||||
|
||||
RegisterClass(&wndclass);
|
||||
RegisterClassW(&wndclass);
|
||||
}
|
||||
|
||||
memset(&ucsdata, 0, sizeof(ucsdata));
|
||||
@ -690,6 +691,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
|
||||
{
|
||||
int winmode = WS_OVERLAPPEDWINDOW | WS_VSCROLL;
|
||||
int exwinmode = 0;
|
||||
wchar_t *uappname = dup_mb_to_wc(DEFAULT_CODEPAGE, 0, appname);
|
||||
if (!conf_get_int(conf, CONF_scrollbar))
|
||||
winmode &= ~(WS_VSCROLL);
|
||||
if (conf_get_int(conf, CONF_resize_action) == RESIZE_DISABLED)
|
||||
@ -698,10 +700,11 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
|
||||
exwinmode |= WS_EX_TOPMOST;
|
||||
if (conf_get_int(conf, CONF_sunken_edge))
|
||||
exwinmode |= WS_EX_CLIENTEDGE;
|
||||
hwnd = CreateWindowEx(exwinmode, appname, appname,
|
||||
winmode, CW_USEDEFAULT, CW_USEDEFAULT,
|
||||
guess_width, guess_height,
|
||||
NULL, NULL, inst, NULL);
|
||||
hwnd = CreateWindowExW(exwinmode, uappname, uappname,
|
||||
winmode, CW_USEDEFAULT, CW_USEDEFAULT,
|
||||
guess_width, guess_height,
|
||||
NULL, NULL, inst, NULL);
|
||||
sfree(uappname);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -888,12 +891,12 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
|
||||
} else
|
||||
sfree(handles);
|
||||
|
||||
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
|
||||
while (PeekMessageW(&msg, NULL, 0, 0, PM_REMOVE)) {
|
||||
if (msg.message == WM_QUIT)
|
||||
goto finished; /* two-level break */
|
||||
|
||||
if (!(IsWindow(logbox) && IsDialogMessage(logbox, &msg)))
|
||||
DispatchMessage(&msg);
|
||||
DispatchMessageW(&msg);
|
||||
|
||||
/*
|
||||
* WM_NETEVENT messages seem to jump ahead of others in
|
||||
@ -3095,7 +3098,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
|
||||
} else {
|
||||
len = TranslateKey(message, wParam, lParam, buf);
|
||||
if (len == -1)
|
||||
return DefWindowProc(hwnd, message, wParam, lParam);
|
||||
return DefWindowProcW(hwnd, message, wParam, lParam);
|
||||
|
||||
if (len != 0) {
|
||||
/*
|
||||
@ -3199,10 +3202,21 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
|
||||
* we're ready to cope.
|
||||
*/
|
||||
{
|
||||
char c = (unsigned char)wParam;
|
||||
term_seen_key_event(term);
|
||||
if (ldisc)
|
||||
lpage_send(ldisc, CP_ACP, &c, 1, 1);
|
||||
static wchar_t pending_surrogate = 0;
|
||||
wchar_t c = wParam;
|
||||
|
||||
if (IS_HIGH_SURROGATE(c)) {
|
||||
pending_surrogate = c;
|
||||
} else if (IS_SURROGATE_PAIR(pending_surrogate, c)) {
|
||||
wchar_t pair[2];
|
||||
pair[0] = pending_surrogate;
|
||||
pair[1] = c;
|
||||
term_seen_key_event(term);
|
||||
luni_send(ldisc, pair, 2, 1);
|
||||
} else if (!IS_SURROGATE(c)) {
|
||||
term_seen_key_event(term);
|
||||
luni_send(ldisc, &c, 1, 1);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
case WM_SYSCOLORCHANGE:
|
||||
@ -3287,7 +3301,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
|
||||
* Any messages we don't process completely above are passed through to
|
||||
* DefWindowProc() for default processing.
|
||||
*/
|
||||
return DefWindowProc(hwnd, message, wParam, lParam);
|
||||
return DefWindowProcW(hwnd, message, wParam, lParam);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user