ReactOS 0.3.8 その2

ReactOSをJapaneseでインストールするとコマンドプロンプトが暴走する件、修正してみた。ReactOSのbase/shell/cmd/をVisual C++にもってきてステップ実行してみたら、WideCharToMultiByte()のバッファの長さが足りてないことが判明。lenの二倍確保するように修正したら(ダブルバイトの処理系をやってない人が書いてるんですな)、漢字は表示できてないけど死ななくなった。(入力もバグってるが未対処)

気を良くして、¥キーが反応しないのも対応してみた。キーコードを調べるソフトでスキャンコードと仮想キーコードを調べて、VK_OEM_5とVK_OEM_102が未対応ということがわかったので、追加した。

なおJapaneseFontsの部分だが、"IPA モナー UIゴシック"を埋め込むとビルドが通らなかった。実験的に名前を変えてみようかとフォント情報を調べるツール(TTModify)でテーブルを表示させたところ、IPAMonaUIGothicという名前もあるようだったので、それを埋め込んだところOKだった。

公式イメージに日本語フォントが入っているとありがたいのだが、一般的にフォントの配布条件は色々付帯条件がつくようなので難しそうではある。
どこか(インストール時のダイアログ?)に使用許諾メッセージを入れないといけないのでは、とか、(VLゴシックフォントに含まれる)さざなみフォントの「フォントとしての再使用を目的としない用途」のようなしばりを維持できるのか、とか。

パッチは以下のようになった。ついでにbAlreadySeparated failedとかいう謎のメッセージボックスも消してみた。

diff -Naur org/ReactOS-0.3.8/base/setup/usetup/muifonts.h new/ReactOS-0.3.8/base/setup/usetup/muifonts.h
--- org/ReactOS-0.3.8/base/setup/usetup/muifonts.h	Wed Sep 24 10:17:16 2008
+++ new/ReactOS-0.3.8/base/setup/usetup/muifonts.h	Thu Feb 05 00:33:20 2009
@@ -73,4 +73,18 @@
     { NULL, NULL }
 };
 
+MUI_SUBFONT JapaneseFonts[] =
+{
+    { L"Arial",           L"IPAMonaUIGothic" },
+    { L"Courier",         L"IPAMonaUIGothic" },
+    { L"Courier New",     L"IPAMonaUIGothic" },
+    { L"Times New Roman", L"IPAMonaUIGothic" },
+    { L"Tahoma",          L"IPAMonaUIGothic" },
+    { L"MS Sans Serif",   L"IPAMonaUIGothic" },
+    { L"MS Shell Dlg",    L"IPAMonaUIGothic" },
+    { L"MS Shell Dlg 2",  L"IPAMonaUIGothic" },
+    { L"Helv",            L"IPAMonaUIGothic" },
+    { NULL, NULL }
+};
+
 #endif
diff -Naur org/ReactOS-0.3.8/base/setup/usetup/muilanguages.h new/ReactOS-0.3.8/base/setup/usetup/muilanguages.h
--- org/ReactOS-0.3.8/base/setup/usetup/muilanguages.h	Thu Dec 18 13:26:48 2008
+++ new/ReactOS-0.3.8/base/setup/usetup/muilanguages.h	Wed Feb 04 23:46:23 2009
@@ -212,7 +212,7 @@
   {L"00000421", L"1252", L"850", L"10079", L"Indonesian",                   enUSPages, enUSErrorEntries, enUSStrings, LatinFonts,    idIDLayouts },
   {L"00000410", L"1252", L"850", L"10000", L"Italian (Italy)",              itITPages, itITErrorEntries, itITStrings, LatinFonts,    itITLayouts },
   {L"00000810", L"1252", L"850", L"10000", L"Italian (Switzerland)",        itITPages, itITErrorEntries, itITStrings, LatinFonts,    itCHLayouts },
-  {L"00000411", L"932",  L"932", L"10001", L"Japanese",                     enUSPages, enUSErrorEntries, enUSStrings, UnicodeFonts,  jaJPLayouts },
+  {L"00000411", L"932",  L"932", L"10001", L"Japanese",                     enUSPages, enUSErrorEntries, enUSStrings, JapaneseFonts,  jaJPLayouts },
   {L"0000044B", L"1252", L"437", L"10079", L"Kannada (India)",              enUSPages, enUSErrorEntries, enUSStrings, LatinFonts,    knINLayouts },
   {L"0000043F", L"1251", L"866", L"10007", L"Kazakh",                       enUSPages, enUSErrorEntries, enUSStrings, CyrillicFonts, kkKZLayouts },
   {L"00000457", L"0",    L"437", L"2",     L"Konkani",                      enUSPages, enUSErrorEntries, enUSStrings, UnicodeFonts,  kokINLayouts},
diff -Naur org/ReactOS-0.3.8/base/shell/cmd/console.c new/ReactOS-0.3.8/base/shell/cmd/console.c
--- org/ReactOS-0.3.8/base/shell/cmd/console.c	Sun Jul 27 16:03:44 2008
+++ new/ReactOS-0.3.8/base/shell/cmd/console.c	Sun Feb 08 19:05:19 2009
@@ -160,11 +160,13 @@
     HANDLE hStdHandle;
 	PCHAR pBuf;
 	INT len;
+	INT mb_alloc_len;
 
 	len = _tcslen(szText);
 #ifdef _UNICODE
-	pBuf = cmd_alloc(len + 1);
-	len = WideCharToMultiByte( OutputCodePage, 0, szText, len + 1, pBuf, len + 1, NULL, NULL) - 1;
+	mb_alloc_len = len * 2 + 1;
+	pBuf = cmd_alloc(mb_alloc_len);
+	len = WideCharToMultiByte( OutputCodePage, 0, szText, len + 1, pBuf, mb_alloc_len, NULL, NULL) - 1;
 #else
 	pBuf = szText;
 #endif
@@ -212,11 +214,13 @@
 	PCHAR pBuf;
 	TCHAR szOut[OUTPUT_BUFFER_SIZE];
 	DWORD dwWritten;
+	INT mb_alloc_len;
 
 	len = _vstprintf (szOut, szFormat, arg_ptr);
 #ifdef _UNICODE
-	pBuf = cmd_alloc(len + 1);
-	len = WideCharToMultiByte( OutputCodePage, 0, szOut, len + 1, pBuf, len + 1, NULL, NULL) - 1;
+	mb_alloc_len = len * 2 + 1;
+	pBuf = cmd_alloc(mb_alloc_len);
+	len = WideCharToMultiByte( OutputCodePage, 0, szOut, len + 1, pBuf, mb_alloc_len, NULL, NULL) - 1;
 #else
 	pBuf = szOut;
 #endif
diff -Naur org/ReactOS-0.3.8/boot/bootdata/packages/reactos.dff new/ReactOS-0.3.8/boot/bootdata/packages/reactos.dff
--- org/ReactOS-0.3.8/boot/bootdata/packages/reactos.dff	Tue Feb 03 14:33:24 2009
+++ new/ReactOS-0.3.8/boot/bootdata/packages/reactos.dff	Thu Feb 05 00:51:59 2009
@@ -478,6 +478,7 @@
 media\fonts\Marlett.ttf                             3
 media\fonts\tahoma.ttf                              3
 media\fonts\tahomabd.ttf                            3
+media\fonts\ipagui-mona.ttf                         3
 
 media\nls\c_037.nls                                 1
 media\nls\c_500.nls                                 1
diff -Naur org/ReactOS-0.3.8/dll/keyboard/kbdja/kbdja.c new/ReactOS-0.3.8/dll/keyboard/kbdja/kbdja.c
--- org/ReactOS-0.3.8/dll/keyboard/kbdja/kbdja.c	Sun Jan 11 20:09:26 2009
+++ new/ReactOS-0.3.8/dll/keyboard/kbdja/kbdja.c	Sun Feb 08 21:13:19 2009
@@ -63,7 +63,7 @@
   /* Third letters row */
   'Z',          'X',          'C',          'V',
   'B',          'N',          'M',          VK_OEM_COMMA,
-  VK_OEM_PERIOD,VK_OEM_2,/*VK_OEM_5,*/    VK_RSHIFT,
+  VK_OEM_PERIOD,VK_OEM_2, VK_RSHIFT,
   /* - 37 - */
   /* Bottom Row */
   VK_MULTIPLY,  VK_LMENU,     VK_SPACE,     VK_CAPITAL,
@@ -100,13 +100,13 @@
   /* Not sure who uses these codes */
   VK_EMPTY, VK_EMPTY, VK_EMPTY,
   /* - 72 - */
-  VK_EMPTY, VK_EMPTY, VK_EMPTY, VK_EMPTY,
+  VK_EMPTY, VK_OEM_102, VK_EMPTY, VK_EMPTY,
   /* - 76 - */
   /* One more f-key */
   VK_F24,
   /* - 77 - */
   VK_EMPTY, VK_EMPTY, VK_EMPTY, VK_EMPTY,
-  VK_EMPTY, VK_EMPTY, VK_EMPTY, VK_EMPTY, /* PA1 */
+  VK_EMPTY, VK_EMPTY, VK_OEM_5, VK_EMPTY, /* PA1 */
   VK_EMPTY,
   /* - 80 - */
   0
@@ -183,7 +183,8 @@
   /* Legacy (telnet-style) ascii escapes */
   { VK_OEM_4, 0, {'[', '{', 0x1b /* ESC */} },
   { VK_OEM_6, 0, {']', '}', 0x1d /* GS */} },
-  { VK_OEM_5, 0, {'\\','|', 0x1c /* FS */} },
+  { VK_OEM_5, 0, {'\\','|', 0x1c /* FS */} }, /* Yen */
+  { VK_OEM_102, 0, {'\\','_', 0x1c /* FS */} }, /* 'ro' */
   { VK_RETURN,0, {'\r', '\r', '\n'} },
   { 0,0 }
 };
diff -Naur org/ReactOS-0.3.8/dll/win32/shell32/shlmenu.c new/ReactOS-0.3.8/dll/win32/shell32/shlmenu.c
--- org/ReactOS-0.3.8/dll/win32/shell32/shlmenu.c	Tue Aug 26 17:50:24 2008
+++ new/ReactOS-0.3.8/dll/win32/shell32/shlmenu.c	Sun Feb 08 21:33:13 2009
@@ -903,7 +903,7 @@
 	    /* This is a separator; don't put two of them in a row */
 	    if (bAlreadySeparated)
 		{
-MessageBoxW(NULL, L"bAlreadySeparated failed", NULL, MB_OK);
+//MessageBoxW(NULL, L"bAlreadySeparated failed", NULL, MB_OK);
 	      continue;
 		}
 	    bAlreadySeparated = TRUE;
diff -Naur org/ReactOS-0.3.8/media/fonts/fonts.rbuild new/ReactOS-0.3.8/media/fonts/fonts.rbuild
--- org/ReactOS-0.3.8/media/fonts/fonts.rbuild	Fri Sep 12 15:32:18 2008
+++ new/ReactOS-0.3.8/media/fonts/fonts.rbuild	Wed Feb 04 23:28:10 2009
@@ -32,4 +32,5 @@
 	<installfile installbase="fonts">Marlett.ttf</installfile>
 	<installfile installbase="fonts">tahoma.ttf</installfile>
 	<installfile installbase="fonts">tahomabd.ttf</installfile>
+	<installfile installbase="fonts">ipagui-mona.ttf</installfile>
 </group>