OSDN Git Service

[Feature] Unicode文字セットでの日本語入力対応
authorshimitei <shimitei@gmail.com>
Mon, 10 May 2021 11:08:55 +0000 (20:08 +0900)
committershimitei <shimitei@gmail.com>
Mon, 10 May 2021 11:11:36 +0000 (20:11 +0900)
src/main-win.cpp
src/main-win/main-win-utils.h

index 48446ac..7e794b4 100644 (file)
@@ -1915,6 +1915,22 @@ static errr term_keypress(int k)
 }
 
 /*!
+ * @brief Add a keypress to the "queue"
+ * @details マルチバイト文字をkey_queueに追加する。
+ * @param str マルチバイト文字列
+ */
+static void term_keypress(char *str)
+{
+    if (str) {
+        char *psrc = str;
+        while (*psrc) {
+            term_keypress(*psrc);
+            ++psrc;
+        }
+    }
+}
+
+/*!
  * @brief キーダウンのハンドラ
  */
 static bool process_keydown(WPARAM wParam, LPARAM lParam)
@@ -2083,10 +2099,13 @@ LRESULT PASCAL AngbandWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
         break;
     }
     case WM_CHAR: {
+        // wParam is WCHAR because using RegisterClassW
         if (term_no_press)
             term_no_press = FALSE;
-        else
-            term_keypress(wParam);
+        else {
+            WCHAR wc[2] = { (WCHAR)wParam , '\0'};
+            term_keypress(to_multibyte(wc).c_str());
+        }
         return 0;
     }
     case WM_LBUTTONDOWN: {
@@ -2410,10 +2429,13 @@ LRESULT PASCAL AngbandListProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPara
         break;
     }
     case WM_CHAR: {
+        // wParam is WCHAR because using RegisterClassW
         if (term_no_press)
             term_no_press = FALSE;
-        else
-            term_keypress(wParam);
+        else {
+            WCHAR wc[2] = { (WCHAR)wParam, '\0' };
+            term_keypress(to_multibyte(wc).c_str());
+        }
         return 0;
     }
     case WM_NCLBUTTONDOWN: {
index c1c6f7b..a2311b3 100644 (file)
@@ -9,7 +9,7 @@
 #include <windows.h>
 
 /*!
- * @brief マルチバイト文字列をワイド文字列へ変換するクラス
+ * @brief マルチバイト文字列(CP932)をワイド文字列へ変換するクラス
  */
 class to_wchar {
 public:
@@ -59,7 +59,7 @@ protected:
 
 
 /*!
- * @brief ワイド文字列をマルチバイト文字列へ変換するクラス
+ * @brief ワイド文字列をマルチバイト文字列(CP932)へ変換するクラス
  */
 class to_multibyte {
 public:
@@ -70,11 +70,11 @@ public:
         if (!src)
             return;
 
-        int size = ::WideCharToMultiByte(CP_ACP, 0, src, -1, buf, 0, NULL, NULL);
+        int size = ::WideCharToMultiByte(932, 0, src, -1, buf, 0, NULL, NULL);
         if (size > 0) {
             buf_size = size + 1;
             C_MAKE(buf, buf_size, char);
-            if (::WideCharToMultiByte(CP_ACP, 0, src, -1, buf, buf_size, NULL, NULL) == 0) {
+            if (::WideCharToMultiByte(932, 0, src, -1, buf, buf_size, NULL, NULL) == 0) {
                 // fail
                 kill();
             }