]> asedeno.scripts.mit.edu Git - PuTTY.git/commitdiff
Turn the Windows PuTTY main window into a Unicode window.
authorSimon Tatham <anakin@pobox.com>
Mon, 27 Jul 2015 19:06:02 +0000 (20:06 +0100)
committerSimon Tatham <anakin@pobox.com>
Mon, 27 Jul 2015 19:06:02 +0000 (20:06 +0100)
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.

windows/window.c

index b021b05f0e28d207c02236abfba92b6fdda9d4d4..6b5a5c564bfc193e1e8b65f5df83fddb5d9c63dd 100644 (file)
@@ -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);
 }
 
 /*