[Ttssh2-commit] [9280] keyboard.cfg の "User keys" セクションを Unicode 化

Zurück zum Archiv-Index
scmno****@osdn***** scmno****@osdn*****
2021年 5月 25日 (火) 23:02:48 JST


Revision: 9280
          https://osdn.net/projects/ttssh2/scm/svn/commits/9280
Author:   zmatsuo
Date:     2021-05-25 23:02:48 +0900 (Tue, 25 May 2021)
Log Message:
-----------
keyboard.cfg の "User keys" セクションを Unicode 化

- ユーザーキーの仕様を変更/制限を減らした
  - ユーザーキーデータを Unicode で保持するようにした
  - 100個連続していなくても読み込めるようにした
    - 従来は "User1" から連続して存在しないと読み込みが打ち切られていた
  - キーデータ長の上限をなくした
    - 従来は合計が 1023文字
    - cfgファイル読み込み時の領域が上限となる,ユーザーキー毎に255文字程度
      - GetPrivateProfileStringW()
  - ユーザーキー読み込みを関数化
- ユーザーキー種別タイプ UserKeyType_t を追加
- crtdbg.h追加
- キーボードの送信を Unicodeベースにした
- 文字長を表す変数の型を size_t に変更
- keyboard.cfg を ttermpro.exe で読み込むようにした
  - 変更前は ttpset.dll で読み込んでいた
  - プラグインから呼び出されるかもしれないのでエントリは残した
  - 実態は ttermpro.exe に移動
  - ttpset.dll の ReadKeyboardCnf() からttermpro.exe 内の関数を呼び出す
- Hex2StrW() 追加

Modified Paths:
--------------
    trunk/teraterm/common/ttlib.h
    trunk/teraterm/common/ttlib_static_cpp.cpp
    trunk/teraterm/teraterm/CMakeLists.txt
    trunk/teraterm/teraterm/keyboard.c
    trunk/teraterm/teraterm/keyboard_i.h
    trunk/teraterm/ttpset/CMakeLists.txt
    trunk/teraterm/ttpset/ttset_keyboard.c

Added Paths:
-----------
    trunk/teraterm/ttpset/ttset_keyboard_entry.c

-------------- next part --------------
Modified: trunk/teraterm/common/ttlib.h
===================================================================
--- trunk/teraterm/common/ttlib.h	2021-05-25 14:02:35 UTC (rev 9279)
+++ trunk/teraterm/common/ttlib.h	2021-05-25 14:02:48 UTC (rev 9280)
@@ -53,6 +53,7 @@
 void Str2Hex(PCHAR Str, PCHAR Hex, int Len, int MaxHexLen, BOOL ConvSP);
 BYTE ConvHexChar(BYTE b);
 int Hex2Str(PCHAR Hex, PCHAR Str, int MaxLen);
+int Hex2StrW(const wchar_t *Hex, wchar_t *Str, size_t MaxLen);
 BOOL DoesFileExist(const char *FName);
 BOOL DoesFolderExist(const char *FName);
 long GetFSize(const char *FName);

Modified: trunk/teraterm/common/ttlib_static_cpp.cpp
===================================================================
--- trunk/teraterm/common/ttlib_static_cpp.cpp	2021-05-25 14:02:35 UTC (rev 9279)
+++ trunk/teraterm/common/ttlib_static_cpp.cpp	2021-05-25 14:02:48 UTC (rev 9280)
@@ -732,3 +732,65 @@
 	if (FNPos != NULL) *FNPos = FNPtr-PathName;
 	return TRUE;
 }
+
+/**
+ *	ConvHexCharW() \x82\xCC wchar_t \x94\xC5
+ */
+BYTE ConvHexCharW(wchar_t b)
+{
+	if ((b>='0') && (b<='9')) {
+		return (b - 0x30);
+	}
+	else if ((b>='A') && (b<='F')) {
+		return (b - 0x37);
+	}
+	else if ((b>='a') && (b<='f')) {
+		return (b - 0x57);
+	}
+	else {
+		return 0;
+	}
+}
+
+/**
+ *	Hwx2Str() \x82\xCC wchar_t \x94\xC5
+ */
+int Hex2StrW(const wchar_t *Hex, wchar_t *Str, size_t MaxLen)
+{
+	wchar_t b, c;
+	size_t i, imax, j;
+
+	j = 0;
+	imax = wcslen(Hex);
+	i = 0;
+	while ((i < imax) && (j<MaxLen)) {
+		b = Hex[i];
+		if (b=='$') {
+			i++;
+			if (i < imax) {
+				c = Hex[i];
+			}
+			else {
+				c = 0x30;
+			}
+			b = ConvHexCharW(c) << 4;
+			i++;
+			if (i < imax) {
+				c = (BYTE)Hex[i];
+			}
+			else {
+				c = 0x30;
+			}
+			b = b + ConvHexCharW(c);
+		};
+
+		Str[j] = b;
+		j++;
+		i++;
+	}
+	if (j<MaxLen) {
+		Str[j] = 0;
+	}
+
+	return (int)j;
+}

Modified: trunk/teraterm/teraterm/CMakeLists.txt
===================================================================
--- trunk/teraterm/teraterm/CMakeLists.txt	2021-05-25 14:02:35 UTC (rev 9279)
+++ trunk/teraterm/teraterm/CMakeLists.txt	2021-05-25 14:02:48 UTC (rev 9280)
@@ -42,6 +42,7 @@
   ftdlg.h
   keyboard.c
   keyboard.h
+  ../ttpset/ttset_keyboard.c
   prnabort.cpp
   prnabort.h
   protodlg.cpp

Modified: trunk/teraterm/teraterm/keyboard.c
===================================================================
--- trunk/teraterm/teraterm/keyboard.c	2021-05-25 14:02:35 UTC (rev 9279)
+++ trunk/teraterm/teraterm/keyboard.c	2021-05-25 14:02:48 UTC (rev 9280)
@@ -31,9 +31,11 @@
 
 #include "teraterm.h"
 #include "tttypes.h"
+#define _CRTDBG_MAP_ALLOC
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
+#include <crtdbg.h>
 
 #include "tttypes_key.h"
 #include "ttlib.h"
@@ -41,6 +43,7 @@
 #include "ttcommon.h"
 #include "ttwinman.h"
 #include "ttdde.h"
+#include "codeconv.h"
 
 #include "keyboard.h"
 #include "keyboard_i.h"
@@ -68,6 +71,45 @@
 #define VK_PROCESSKEY 0xE5
 #endif
 
+static void FreeUserKey(PKeyMap KeyMap_)
+{
+	int i;
+	UserKey_t *p;
+
+	if (KeyMap_->UserKeyData == NULL) {
+		KeyMap_->UserKeyCount = 0;
+		return;
+	}
+
+	p = KeyMap_->UserKeyData;
+	for (i = 0; i < KeyMap_->UserKeyCount; i++) {
+		free(p->ptr);
+		p++;
+	}
+	free(KeyMap_->UserKeyData);
+	KeyMap_->UserKeyData = NULL;
+	KeyMap_->UserKeyCount = 0;
+}
+
+/**
+ *	\x95K\x97v\x82Ȃ\xE7KeyMap \x82\xF0\x8Am\x95ہA\x8F\x89\x8A\x{227B0B7}\x82\xE9
+ */
+static void InitKeyMap()
+{
+	int i;
+
+	if (KeyMap == NULL) {
+		KeyMap = (PKeyMap)calloc(sizeof(TKeyMap), 1);
+		if (KeyMap == NULL) {
+			return;
+		}
+	}
+	for (i = 0; i <= IdKeyMax - 1; i++)
+		KeyMap->Map[i] = 0xFFFF;
+
+	FreeUserKey(KeyMap);
+}
+
 void SetKeyMap()
 {
 	char TempDir[MAXPATHLEN];
@@ -83,13 +125,14 @@
 	AppendSlash(ts.KeyCnfFN, sizeof(ts.KeyCnfFN));
 	strncat_s(ts.KeyCnfFN, sizeof(ts.KeyCnfFN), TempName, _TRUNCATE);
 
-	if (KeyMap == NULL)
-		KeyMap = (PKeyMap)malloc(sizeof(TKeyMap));
-	if (KeyMap != NULL) {
-		if (LoadTTSET())
-			(*ReadKeyboardCnf)(ts.KeyCnfFN, KeyMap, TRUE);
-		FreeTTSET();
+	InitKeyMap();
+	if (KeyMap == NULL) {
+		return;
 	}
+
+	if (LoadTTSET())
+		(*ReadKeyboardCnf)(ts.KeyCnfFN, KeyMap, TRUE);
+	FreeTTSET();
 }
 
 void ClearUserKey()
@@ -120,11 +163,10 @@
 	FuncKeyLen[NewKeyId] = NewKeyLen;
 }
 
-static void GetKeyStr(HWND HWin, PKeyMap KeyMap_, WORD KeyCode, BOOL AppliKeyMode_, BOOL AppliCursorMode_,
-					  BOOL Send8BitMode_, PCHAR KeyStr, int destlen, LPINT Len, LPWORD Type)
+static void GetKeyStr(HWND HWin, const PKeyMap KeyMap_, WORD KeyCode, BOOL AppliKeyMode_, BOOL AppliCursorMode_,
+					  BOOL Send8BitMode_, wchar_t *KeyStr, size_t destlen, size_t *Len, UserKeyType_t *Type)
 {
 	MSG Msg;
-	char Temp[201];
 
 	*Type = IdBinary;  // key type
 	*Len = 0;
@@ -133,16 +175,16 @@
 			if (Send8BitMode_) {
 				*Len = 2;
 				if (AppliCursorMode_)
-					strncpy_s(KeyStr, destlen, "\217A", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\217A", _TRUNCATE);
 				else
-					strncpy_s(KeyStr, destlen, "\233A", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\233A", _TRUNCATE);
 			}
 			else {
 				*Len = 3;
 				if (AppliCursorMode_)
-					strncpy_s(KeyStr, destlen, "\033OA", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\033OA", _TRUNCATE);
 				else
-					strncpy_s(KeyStr, destlen, "\033[A", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\033[A", _TRUNCATE);
 			}
 			break;
 		case IdDown:
@@ -149,16 +191,16 @@
 			if (Send8BitMode_) {
 				*Len = 2;
 				if (AppliCursorMode_)
-					strncpy_s(KeyStr, destlen, "\217B", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\217B", _TRUNCATE);
 				else
-					strncpy_s(KeyStr, destlen, "\233B", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\233B", _TRUNCATE);
 			}
 			else {
 				*Len = 3;
 				if (AppliCursorMode_)
-					strncpy_s(KeyStr, destlen, "\033OB", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\033OB", _TRUNCATE);
 				else
-					strncpy_s(KeyStr, destlen, "\033[B", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\033[B", _TRUNCATE);
 			}
 			break;
 		case IdRight:
@@ -165,16 +207,16 @@
 			if (Send8BitMode_) {
 				*Len = 2;
 				if (AppliCursorMode_)
-					strncpy_s(KeyStr, destlen, "\217C", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\217C", _TRUNCATE);
 				else
-					strncpy_s(KeyStr, destlen, "\233C", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\233C", _TRUNCATE);
 			}
 			else {
 				*Len = 3;
 				if (AppliCursorMode_)
-					strncpy_s(KeyStr, destlen, "\033OC", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\033OC", _TRUNCATE);
 				else
-					strncpy_s(KeyStr, destlen, "\033[C", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\033[C", _TRUNCATE);
 			}
 			break;
 		case IdLeft:
@@ -181,16 +223,16 @@
 			if (Send8BitMode_) {
 				*Len = 2;
 				if (AppliCursorMode_)
-					strncpy_s(KeyStr, destlen, "\217D", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\217D", _TRUNCATE);
 				else
-					strncpy_s(KeyStr, destlen, "\233D", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\233D", _TRUNCATE);
 			}
 			else {
 				*Len = 3;
 				if (AppliCursorMode_)
-					strncpy_s(KeyStr, destlen, "\033OD", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\033OD", _TRUNCATE);
 				else
-					strncpy_s(KeyStr, destlen, "\033[D", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\033[D", _TRUNCATE);
 			}
 			break;
 		case Id0:
@@ -197,11 +239,11 @@
 			if (AppliKeyMode_) {
 				if (Send8BitMode_) {
 					*Len = 2;
-					strncpy_s(KeyStr, destlen, "\217p", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\217p", _TRUNCATE);
 				}
 				else {
 					*Len = 3;
-					strncpy_s(KeyStr, destlen, "\033Op", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\033Op", _TRUNCATE);
 				}
 			}
 			else {
@@ -213,11 +255,11 @@
 			if (AppliKeyMode_) {
 				if (Send8BitMode_) {
 					*Len = 2;
-					strncpy_s(KeyStr, destlen, "\217q", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\217q", _TRUNCATE);
 				}
 				else {
 					*Len = 3;
-					strncpy_s(KeyStr, destlen, "\033Oq", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\033Oq", _TRUNCATE);
 				}
 			}
 			else {
@@ -229,11 +271,11 @@
 			if (AppliKeyMode_) {
 				if (Send8BitMode_) {
 					*Len = 2;
-					strncpy_s(KeyStr, destlen, "\217r", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\217r", _TRUNCATE);
 				}
 				else {
 					*Len = 3;
-					strncpy_s(KeyStr, destlen, "\033Or", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\033Or", _TRUNCATE);
 				}
 			}
 			else {
@@ -245,11 +287,11 @@
 			if (AppliKeyMode_) {
 				if (Send8BitMode_) {
 					*Len = 2;
-					strncpy_s(KeyStr, destlen, "\217s", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\217s", _TRUNCATE);
 				}
 				else {
 					*Len = 3;
-					strncpy_s(KeyStr, destlen, "\033Os", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\033Os", _TRUNCATE);
 				}
 			}
 			else {
@@ -261,11 +303,11 @@
 			if (AppliKeyMode_) {
 				if (Send8BitMode_) {
 					*Len = 2;
-					strncpy_s(KeyStr, destlen, "\217t", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\217t", _TRUNCATE);
 				}
 				else {
 					*Len = 3;
-					strncpy_s(KeyStr, destlen, "\033Ot", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\033Ot", _TRUNCATE);
 				}
 			}
 			else {
@@ -277,11 +319,11 @@
 			if (AppliKeyMode_) {
 				if (Send8BitMode_) {
 					*Len = 2;
-					strncpy_s(KeyStr, destlen, "\217u", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\217u", _TRUNCATE);
 				}
 				else {
 					*Len = 3;
-					strncpy_s(KeyStr, destlen, "\033Ou", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\033Ou", _TRUNCATE);
 				}
 			}
 			else {
@@ -293,11 +335,11 @@
 			if (AppliKeyMode_) {
 				if (Send8BitMode_) {
 					*Len = 2;
-					strncpy_s(KeyStr, destlen, "\217v", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\217v", _TRUNCATE);
 				}
 				else {
 					*Len = 3;
-					strncpy_s(KeyStr, destlen, "\033Ov", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\033Ov", _TRUNCATE);
 				}
 			}
 			else {
@@ -309,11 +351,11 @@
 			if (AppliKeyMode_) {
 				if (Send8BitMode_) {
 					*Len = 2;
-					strncpy_s(KeyStr, destlen, "\217w", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\217w", _TRUNCATE);
 				}
 				else {
 					*Len = 3;
-					strncpy_s(KeyStr, destlen, "\033Ow", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\033Ow", _TRUNCATE);
 				}
 			}
 			else {
@@ -325,11 +367,11 @@
 			if (AppliKeyMode_) {
 				if (Send8BitMode_) {
 					*Len = 2;
-					strncpy_s(KeyStr, destlen, "\217x", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\217x", _TRUNCATE);
 				}
 				else {
 					*Len = 3;
-					strncpy_s(KeyStr, destlen, "\033Ox", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\033Ox", _TRUNCATE);
 				}
 			}
 			else {
@@ -341,11 +383,11 @@
 			if (AppliKeyMode_) {
 				if (Send8BitMode_) {
 					*Len = 2;
-					strncpy_s(KeyStr, destlen, "\217y", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\217y", _TRUNCATE);
 				}
 				else {
 					*Len = 3;
-					strncpy_s(KeyStr, destlen, "\033Oy", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\033Oy", _TRUNCATE);
 				}
 			}
 			else {
@@ -357,11 +399,11 @@
 			if (AppliKeyMode_) {
 				if (Send8BitMode_) {
 					*Len = 2;
-					strncpy_s(KeyStr, destlen, "\217m", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\217m", _TRUNCATE);
 				}
 				else {
 					*Len = 3;
-					strncpy_s(KeyStr, destlen, "\033Om", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\033Om", _TRUNCATE);
 				}
 			}
 			else {
@@ -373,11 +415,11 @@
 			if (AppliKeyMode_) {
 				if (Send8BitMode_) {
 					*Len = 2;
-					strncpy_s(KeyStr, destlen, "\217l", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\217l", _TRUNCATE);
 				}
 				else {
 					*Len = 3;
-					strncpy_s(KeyStr, destlen, "\033Ol", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\033Ol", _TRUNCATE);
 				}
 			}
 			else {
@@ -389,11 +431,11 @@
 			if (AppliKeyMode_) {
 				if (Send8BitMode_) {
 					*Len = 2;
-					strncpy_s(KeyStr, destlen, "\217n", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\217n", _TRUNCATE);
 				}
 				else {
 					*Len = 3;
-					strncpy_s(KeyStr, destlen, "\033On", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\033On", _TRUNCATE);
 				}
 			}
 			else {
@@ -405,11 +447,11 @@
 			if (AppliKeyMode_) {
 				if (Send8BitMode_) {
 					*Len = 2;
-					strncpy_s(KeyStr, destlen, "\217M", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\217M", _TRUNCATE);
 				}
 				else {
 					*Len = 3;
-					strncpy_s(KeyStr, destlen, "\033OM", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\033OM", _TRUNCATE);
 				}
 			}
 			else {
@@ -422,11 +464,11 @@
 			if (AppliKeyMode_) {
 				if (Send8BitMode_) {
 					*Len = 2;
-					strncpy_s(KeyStr, destlen, "\217o", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\217o", _TRUNCATE);
 				}
 				else {
 					*Len = 3;
-					strncpy_s(KeyStr, destlen, "\033Oo", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\033Oo", _TRUNCATE);
 				}
 			}
 			else {
@@ -438,11 +480,11 @@
 			if (AppliKeyMode_) {
 				if (Send8BitMode_) {
 					*Len = 2;
-					strncpy_s(KeyStr, destlen, "\217j", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\217j", _TRUNCATE);
 				}
 				else {
 					*Len = 3;
-					strncpy_s(KeyStr, destlen, "\033Oj", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\033Oj", _TRUNCATE);
 				}
 			}
 			else {
@@ -454,11 +496,11 @@
 			if (AppliKeyMode_) {
 				if (Send8BitMode_) {
 					*Len = 2;
-					strncpy_s(KeyStr, destlen, "\217k", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\217k", _TRUNCATE);
 				}
 				else {
 					*Len = 3;
-					strncpy_s(KeyStr, destlen, "\033Ok", _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, L"\033Ok", _TRUNCATE);
 				}
 			}
 			else {
@@ -469,312 +511,312 @@
 		case IdPF1: /* DEC Key: PF1 */
 			if (Send8BitMode_) {
 				*Len = 2;
-				strncpy_s(KeyStr, destlen, "\217P", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\217P", _TRUNCATE);
 			}
 			else {
 				*Len = 3;
-				strncpy_s(KeyStr, destlen, "\033OP", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033OP", _TRUNCATE);
 			}
 			break;
 		case IdPF2: /* DEC Key: PF2 */
 			if (Send8BitMode_) {
 				*Len = 2;
-				strncpy_s(KeyStr, destlen, "\217Q", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\217Q", _TRUNCATE);
 			}
 			else {
 				*Len = 3;
-				strncpy_s(KeyStr, destlen, "\033OQ", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033OQ", _TRUNCATE);
 			}
 			break;
 		case IdPF3: /* DEC Key: PF3 */
 			if (Send8BitMode_) {
 				*Len = 2;
-				strncpy_s(KeyStr, destlen, "\217R", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\217R", _TRUNCATE);
 			}
 			else {
 				*Len = 3;
-				strncpy_s(KeyStr, destlen, "\033OR", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033OR", _TRUNCATE);
 			}
 			break;
 		case IdPF4: /* DEC Key: PF4 */
 			if (Send8BitMode_) {
 				*Len = 2;
-				strncpy_s(KeyStr, destlen, "\217S", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\217S", _TRUNCATE);
 			}
 			else {
 				*Len = 3;
-				strncpy_s(KeyStr, destlen, "\033OS", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033OS", _TRUNCATE);
 			}
 			break;
 		case IdFind: /* DEC Key: Find */
 			if (Send8BitMode_) {
 				*Len = 3;
-				strncpy_s(KeyStr, destlen, "\2331~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\2331~", _TRUNCATE);
 			}
 			else {
 				*Len = 4;
-				strncpy_s(KeyStr, destlen, "\033[1~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033[1~", _TRUNCATE);
 			}
 			break;
 		case IdInsert: /* DEC Key: Insert Here */
 			if (Send8BitMode_) {
 				*Len = 3;
-				strncpy_s(KeyStr, destlen, "\2332~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\2332~", _TRUNCATE);
 			}
 			else {
 				*Len = 4;
-				strncpy_s(KeyStr, destlen, "\033[2~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033[2~", _TRUNCATE);
 			}
 			break;
 		case IdRemove: /* DEC Key: Remove */
 			if (Send8BitMode_) {
 				*Len = 3;
-				strncpy_s(KeyStr, destlen, "\2333~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\2333~", _TRUNCATE);
 			}
 			else {
 				*Len = 4;
-				strncpy_s(KeyStr, destlen, "\033[3~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033[3~", _TRUNCATE);
 			}
 			break;
 		case IdSelect: /* DEC Key: Select */
 			if (Send8BitMode_) {
 				*Len = 3;
-				strncpy_s(KeyStr, destlen, "\2334~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\2334~", _TRUNCATE);
 			}
 			else {
 				*Len = 4;
-				strncpy_s(KeyStr, destlen, "\033[4~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033[4~", _TRUNCATE);
 			}
 			break;
 		case IdPrev: /* DEC Key: Prev */
 			if (Send8BitMode_) {
 				*Len = 3;
-				strncpy_s(KeyStr, destlen, "\2335~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\2335~", _TRUNCATE);
 			}
 			else {
 				*Len = 4;
-				strncpy_s(KeyStr, destlen, "\033[5~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033[5~", _TRUNCATE);
 			}
 			break;
 		case IdNext: /* DEC Key: Next */
 			if (Send8BitMode_) {
 				*Len = 3;
-				strncpy_s(KeyStr, destlen, "\2336~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\2336~", _TRUNCATE);
 			}
 			else {
 				*Len = 4;
-				strncpy_s(KeyStr, destlen, "\033[6~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033[6~", _TRUNCATE);
 			}
 			break;
 		case IdF6: /* DEC Key: F6 */
 			if (Send8BitMode_) {
 				*Len = 4;
-				strncpy_s(KeyStr, destlen, "\23317~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\23317~", _TRUNCATE);
 			}
 			else {
 				*Len = 5;
-				strncpy_s(KeyStr, destlen, "\033[17~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033[17~", _TRUNCATE);
 			}
 			break;
 		case IdF7: /* DEC Key: F7 */
 			if (Send8BitMode_) {
 				*Len = 4;
-				strncpy_s(KeyStr, destlen, "\23318~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\23318~", _TRUNCATE);
 			}
 			else {
 				*Len = 5;
-				strncpy_s(KeyStr, destlen, "\033[18~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033[18~", _TRUNCATE);
 			}
 			break;
 		case IdF8: /* DEC Key: F8 */
 			if (Send8BitMode_) {
 				*Len = 4;
-				strncpy_s(KeyStr, destlen, "\23319~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\23319~", _TRUNCATE);
 			}
 			else {
 				*Len = 5;
-				strncpy_s(KeyStr, destlen, "\033[19~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033[19~", _TRUNCATE);
 			}
 			break;
 		case IdF9: /* DEC Key: F9 */
 			if (Send8BitMode_) {
 				*Len = 4;
-				strncpy_s(KeyStr, destlen, "\23320~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\23320~", _TRUNCATE);
 			}
 			else {
 				*Len = 5;
-				strncpy_s(KeyStr, destlen, "\033[20~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033[20~", _TRUNCATE);
 			}
 			break;
 		case IdF10: /* DEC Key: F10 */
 			if (Send8BitMode_) {
 				*Len = 4;
-				strncpy_s(KeyStr, destlen, "\23321~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\23321~", _TRUNCATE);
 			}
 			else {
 				*Len = 5;
-				strncpy_s(KeyStr, destlen, "\033[21~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033[21~", _TRUNCATE);
 			}
 			break;
 		case IdF11: /* DEC Key: F11 */
 			if (Send8BitMode_) {
 				*Len = 4;
-				strncpy_s(KeyStr, destlen, "\23323~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\23323~", _TRUNCATE);
 			}
 			else {
 				*Len = 5;
-				strncpy_s(KeyStr, destlen, "\033[23~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033[23~", _TRUNCATE);
 			}
 			break;
 		case IdF12: /* DEC Key: F12 */
 			if (Send8BitMode_) {
 				*Len = 4;
-				strncpy_s(KeyStr, destlen, "\23324~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\23324~", _TRUNCATE);
 			}
 			else {
 				*Len = 5;
-				strncpy_s(KeyStr, destlen, "\033[24~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033[24~", _TRUNCATE);
 			}
 			break;
 		case IdF13: /* DEC Key: F13 */
 			if (Send8BitMode_) {
 				*Len = 4;
-				strncpy_s(KeyStr, destlen, "\23325~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\23325~", _TRUNCATE);
 			}
 			else {
 				*Len = 5;
-				strncpy_s(KeyStr, destlen, "\033[25~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033[25~", _TRUNCATE);
 			}
 			break;
 		case IdF14: /* DEC Key: F14 */
 			if (Send8BitMode_) {
 				*Len = 4;
-				strncpy_s(KeyStr, destlen, "\23326~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\23326~", _TRUNCATE);
 			}
 			else {
 				*Len = 5;
-				strncpy_s(KeyStr, destlen, "\033[26~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033[26~", _TRUNCATE);
 			}
 			break;
 		case IdHelp: /* DEC Key: Help */
 			if (Send8BitMode_) {
 				*Len = 4;
-				strncpy_s(KeyStr, destlen, "\23328~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\23328~", _TRUNCATE);
 			}
 			else {
 				*Len = 5;
-				strncpy_s(KeyStr, destlen, "\033[28~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033[28~", _TRUNCATE);
 			}
 			break;
 		case IdDo: /* DEC Key: Do */
 			if (Send8BitMode_) {
 				*Len = 4;
-				strncpy_s(KeyStr, destlen, "\23329~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\23329~", _TRUNCATE);
 			}
 			else {
 				*Len = 5;
-				strncpy_s(KeyStr, destlen, "\033[29~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033[29~", _TRUNCATE);
 			}
 			break;
 		case IdF17: /* DEC Key: F17 */
 			if (Send8BitMode_) {
 				*Len = 4;
-				strncpy_s(KeyStr, destlen, "\23331~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\23331~", _TRUNCATE);
 			}
 			else {
 				*Len = 5;
-				strncpy_s(KeyStr, destlen, "\033[31~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033[31~", _TRUNCATE);
 			}
 			break;
 		case IdF18: /* DEC Key: F18 */
 			if (Send8BitMode_) {
 				*Len = 4;
-				strncpy_s(KeyStr, destlen, "\23332~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\23332~", _TRUNCATE);
 			}
 			else {
 				*Len = 5;
-				strncpy_s(KeyStr, destlen, "\033[32~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033[32~", _TRUNCATE);
 			}
 			break;
 		case IdF19: /* DEC Key: F19 */
 			if (Send8BitMode_) {
 				*Len = 4;
-				strncpy_s(KeyStr, destlen, "\23333~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\23333~", _TRUNCATE);
 			}
 			else {
 				*Len = 5;
-				strncpy_s(KeyStr, destlen, "\033[33~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033[33~", _TRUNCATE);
 			}
 			break;
 		case IdF20: /* DEC Key: F20 */
 			if (Send8BitMode_) {
 				*Len = 4;
-				strncpy_s(KeyStr, destlen, "\23334~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\23334~", _TRUNCATE);
 			}
 			else {
 				*Len = 5;
-				strncpy_s(KeyStr, destlen, "\033[34~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033[34~", _TRUNCATE);
 			}
 			break;
 		case IdXF1: /* XTERM F1 */
 			if (Send8BitMode_) {
 				*Len = 4;
-				strncpy_s(KeyStr, destlen, "\23311~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\23311~", _TRUNCATE);
 			}
 			else {
 				*Len = 5;
 
-				strncpy_s(KeyStr, destlen, "\033[11~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033[11~", _TRUNCATE);
 			}
 			break;
 		case IdXF2: /* XTERM F2 */
 			if (Send8BitMode_) {
 				*Len = 4;
-				strncpy_s(KeyStr, destlen, "\23312~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\23312~", _TRUNCATE);
 			}
 			else {
 				*Len = 5;
-				strncpy_s(KeyStr, destlen, "\033[12~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033[12~", _TRUNCATE);
 			}
 			break;
 		case IdXF3: /* XTERM F3 */
 			if (Send8BitMode_) {
 				*Len = 4;
-				strncpy_s(KeyStr, destlen, "\23313~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\23313~", _TRUNCATE);
 			}
 			else {
 				*Len = 5;
-				strncpy_s(KeyStr, destlen, "\033[13~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033[13~", _TRUNCATE);
 			}
 			break;
 		case IdXF4: /* XTERM F4 */
 			if (Send8BitMode_) {
 				*Len = 4;
-				strncpy_s(KeyStr, destlen, "\23314~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\23314~", _TRUNCATE);
 			}
 			else {
 				*Len = 5;
-				strncpy_s(KeyStr, destlen, "\033[14~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033[14~", _TRUNCATE);
 			}
 			break;
 		case IdXF5: /* XTERM F5 */
 			if (Send8BitMode_) {
 				*Len = 4;
-				strncpy_s(KeyStr, destlen, "\23315~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\23315~", _TRUNCATE);
 			}
 			else {
 				*Len = 5;
-				strncpy_s(KeyStr, destlen, "\033[15~", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033[15~", _TRUNCATE);
 			}
 			break;
 		case IdXBackTab: /* XTERM Back Tab */
 			if (Send8BitMode_) {
 				*Len = 2;
-				strncpy_s(KeyStr, destlen, "\233Z", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\233Z", _TRUNCATE);
 			}
 			else {
 				*Len = 3;
-				strncpy_s(KeyStr, destlen, "\033[Z", _TRUNCATE);
+				wcsncpy_s(KeyStr, destlen, L"\033[Z", _TRUNCATE);
 			}
 			break;
 		case IdHold:
@@ -803,14 +845,27 @@
 			break;
 		default:
 			if ((KeyCode >= IdUser1) && (KeyCode <= IdKeyMax)) {
-				*Type = (WORD)(*KeyMap_).UserKeyType[KeyCode - IdUser1];  // key type
-				*Len = KeyMap_->UserKeyLen[KeyCode - IdUser1];
-				memcpy(Temp, &KeyMap_->UserKeyStr[KeyMap_->UserKeyPtr[KeyCode - IdUser1]], *Len);
-				Temp[*Len] = 0;
+				//
+				UserKey_t *p = KeyMap_->UserKeyData;
+				int i;
+				wchar_t *s;
+				for (i = 0; i < KeyMap_->UserKeyCount; i++) {
+					if (p->ttkeycode == KeyCode) {
+						break;
+					}
+					p++;
+				}
+				if (i == KeyMap_->UserKeyCount){
+					// \x83\x86\x81[\x83U\x81[\x83L\x81[\x82ɐݒ肪\x82Ȃ\xA2
+					return;
+				}
+				*Type = p->type;
+				s = p->ptr;
+				*Len = p->len;
 				if ((*Type == IdBinary) || (*Type == IdText))
-					*Len = Hex2Str(Temp, KeyStr, destlen);
+					*Len = Hex2StrW(s, KeyStr, destlen);
 				else
-					strncpy_s(KeyStr, destlen, Temp, _TRUNCATE);
+					wcsncpy_s(KeyStr, destlen, s, _TRUNCATE);
 			}
 			else
 				return;
@@ -819,10 +874,10 @@
 	PeekMessage(&Msg, HWin, WM_CHAR, WM_CHAR, PM_REMOVE);
 }
 
-static int VKey2KeyStr(WORD VKey, HWND HWin, char *Code, size_t CodeSize, WORD *CodeType, WORD ModStat)
+static size_t VKey2KeyStr(WORD VKey, HWND HWin, wchar_t *Code, size_t CodeSize, UserKeyType_t *CodeType, WORD ModStat)
 {
 	BOOL Single, Control, Shift;
-	int CodeLength = 0;
+	size_t CodeLength = 0;
 
 	Single = FALSE;
 	Shift = FALSE;
@@ -1265,6 +1320,35 @@
 	return Key;
 }
 
+static void SendBinary(const wchar_t *strW, size_t len, size_t repeat)
+{
+	unsigned char *strA = malloc(len + 1);
+	unsigned char *p = strA;
+	size_t i;
+	for (i = 0; i < len + 1; i++) {
+		wchar_t w;
+		unsigned char c;
+		w = strW[i];
+		c = w < 256 ? (unsigned char)w : 0xff;
+		*p++ = c;
+	}
+
+	for (i = 1; i <= repeat; i++) {
+		CommBinaryBuffOut(&cv, strA, len);
+		if (ts.LocalEcho > 0)
+			CommBinaryEcho(&cv, strA, len);
+	}
+
+	free(strA);
+}
+
+static void RunMacroW(const wchar_t *FNameW, BOOL Startup)
+{
+	char *fname = ToCharW(FNameW);
+	RunMacro(fname, Startup);
+	free(fname);
+}
+
 /**
  *	@param	VKey	virtual-key code
  *	@param	count	The value is the number of times the keystroke
@@ -1276,10 +1360,9 @@
 	MSG M;
 	int i;
 	int CodeCount;
-	int CodeLength;
-	char Code[MAXPATHLEN];
-	WORD CodeType;
-	WORD wId;
+	size_t CodeLength;
+	wchar_t Code[MAXPATHLEN];
+	UserKeyType_t CodeType;
 	WORD ModStat;
 
 	if (VKey == VK_PROCESSKEY)
@@ -1344,7 +1427,7 @@
 		Key = 0;
 
 	if (Key == 0) {
-		CodeLength = VKey2KeyStr(VKey, HWin, Code, sizeof(Code), &CodeType, ModStat);
+		CodeLength = VKey2KeyStr(VKey, HWin, Code, _countof(Code), &CodeType, ModStat);
 
 		if (MetaKey(ts.MetaKey) && (CodeLength == 1)) {
 			switch (ts.Meta8Bit) {
@@ -1376,7 +1459,7 @@
 		}
 		else
 			GetKeyStr(HWin, KeyMap, Key, AppliKeyMode && !ts.DisableAppKeypad, AppliCursorMode && !ts.DisableAppCursor,
-					  Send8BitMode, Code, sizeof(Code), &CodeLength, &CodeType);
+					  Send8BitMode, Code, _countof(Code), &CodeLength, &CodeType);
 	}
 
 	if (CodeLength == 0)
@@ -1396,11 +1479,7 @@
 		switch (CodeType) {
 			case IdBinary:
 				if (TalkStatus == IdTalkKeyb) {
-					for (i = 1; i <= CodeCount; i++) {
-						CommBinaryBuffOut(&cv, Code, CodeLength);
-						if (ts.LocalEcho > 0)
-							CommBinaryEcho(&cv, Code, CodeLength);
-					}
+					SendBinary(Code, CodeLength, CodeCount);
 				}
 				break;
 			case IdText:
@@ -1407,20 +1486,22 @@
 				if (TalkStatus == IdTalkKeyb) {
 					for (i = 1; i <= CodeCount; i++) {
 						if (ts.LocalEcho > 0)
-							CommTextEcho(&cv, Code, CodeLength);
-						CommTextOut(&cv, Code, CodeLength);
+							CommTextEchoW(&cv, Code, CodeLength);
+						CommTextOutW(&cv, Code, CodeLength);
 					}
 				}
 				break;
 			case IdMacro:
 				Code[CodeLength] = 0;
-				RunMacro(Code, FALSE);
+				RunMacroW(Code, FALSE);
 				break;
-			case IdCommand:
+			case IdCommand: {
+				WORD wId;
 				Code[CodeLength] = 0;
-				if (sscanf(Code, "%hd", &wId) == 1)
+				if (swscanf(Code, L"%hd", &wId) == 1)
 					PostMessage(HWin, WM_COMMAND, MAKELONG(wId, 0), 0);
 				break;
+			}
 		}
 	}
 	return (CodeType == IdBinary || CodeType == IdText) ? KEYDOWN_COMMOUT : KEYDOWN_CONTROL;
@@ -1429,9 +1510,10 @@
 void KeyCodeSend(WORD KCode, WORD Count)
 {
 	WORD Key;
-	int i, CodeLength;
-	char Code[MAXPATHLEN];
-	WORD CodeType;
+	int i;
+	size_t CodeLength;
+	wchar_t Code[MAXPATHLEN];
+	UserKeyType_t CodeType;
 	WORD Scan, VKey, State;
 	DWORD dw;
 	BOOL Ok;
@@ -1461,7 +1543,7 @@
 			State = State | 16;	   /* bit 4 */
 		}
 
-		CodeLength = VKey2KeyStr(VKey, HWin, Code, sizeof(Code), &CodeType, State);
+		CodeLength = VKey2KeyStr(VKey, HWin, Code, _countof(Code), &CodeType, State);
 
 		if (CodeLength == 0) {
 			i = -1;
@@ -1484,7 +1566,7 @@
 	}
 	else
 		GetKeyStr(HWin, KeyMap, Key, AppliKeyMode && !ts.DisableAppKeypad, AppliCursorMode && !ts.DisableAppCursor,
-				  Send8BitMode, Code, sizeof(Code), &CodeLength, &CodeType);
+				  Send8BitMode, Code, _countof(Code), &CodeLength, &CodeType);
 
 	if (CodeLength == 0)
 		return;
@@ -1491,22 +1573,18 @@
 	if (TalkStatus == IdTalkKeyb) {
 		switch (CodeType) {
 			case IdBinary:
-				for (i = 1; i <= Count; i++) {
-					CommBinaryBuffOut(&cv, Code, CodeLength);
-					if (ts.LocalEcho > 0)
-						CommBinaryEcho(&cv, Code, CodeLength);
-				}
+				SendBinary(Code, CodeLength, Count);
 				break;
 			case IdText:
 				for (i = 1; i <= Count; i++) {
 					if (ts.LocalEcho > 0)
-						CommTextEcho(&cv, Code, CodeLength);
-					CommTextOut(&cv, Code, CodeLength);
+						CommTextEchoW(&cv, Code, CodeLength);
+					CommTextOutW(&cv, Code, CodeLength);
 				}
 				break;
 			case IdMacro:
 				Code[CodeLength] = 0;
-				RunMacro(Code, FALSE);
+				RunMacroW(Code, FALSE);
 				break;
 		}
 	}
@@ -1557,6 +1635,10 @@
 
 void EndKeyboard()
 {
-	if (KeyMap != NULL)
-		free(KeyMap);
+	if (KeyMap == NULL)
+		return;
+
+	FreeUserKey(KeyMap);
+	free(KeyMap);
+	KeyMap = NULL;
 }

Modified: trunk/teraterm/teraterm/keyboard_i.h
===================================================================
--- trunk/teraterm/teraterm/keyboard_i.h	2021-05-25 14:02:35 UTC (rev 9279)
+++ trunk/teraterm/teraterm/keyboard_i.h	2021-05-25 14:02:48 UTC (rev 9280)
@@ -28,21 +28,31 @@
 
 #pragma once
 
-#define KeyStrMax 1023
+#include "tttypes_key.h"
 
-// (user) key type IDs
-#define IdBinary  0  // transmit text without any modification
-#define IdText    1  // transmit text with new-line & DBCS conversions
-#define IdMacro   2  // activate macro
-#define IdCommand 3  // post a WM_COMMAND message
+ // (user) key type IDs
+typedef enum {
+	IdBinary = 0,  // transmit text without any modification
+	IdText = 1,	   // transmit text with new-line & DBCS conversions
+	IdMacro = 2,   // activate macro
+	IdCommand = 3  // post a WM_COMMAND message
+} UserKeyType_t;
 
+/* user key data */
+typedef struct {
+	int keycode;
+	int ttkeycode;
+	UserKeyType_t type;
+	wchar_t *ptr;
+	size_t len;
+} UserKey_t;
+
 struct TKeyMap_st {
 	WORD Map[IdKeyMax];
-	/* user key str position/length in buffer */
-	int UserKeyPtr[NumOfUserKey], UserKeyLen[NumOfUserKey];
-	BYTE UserKeyStr[KeyStrMax+1];
-	/* user key type */
-	BYTE UserKeyType[NumOfUserKey];
+
+	/* user key data */
+	UserKey_t *UserKeyData;
+	int UserKeyCount;
 };
 typedef struct TKeyMap_st *PKeyMap;
 typedef struct TKeyMap_st TKeyMap;

Modified: trunk/teraterm/ttpset/CMakeLists.txt
===================================================================
--- trunk/teraterm/ttpset/CMakeLists.txt	2021-05-25 14:02:35 UTC (rev 9279)
+++ trunk/teraterm/ttpset/CMakeLists.txt	2021-05-25 14:02:48 UTC (rev 9280)
@@ -5,7 +5,8 @@
 add_library(
   ${PACKAGE_NAME} SHARED
   ttset.c
-  ttset_keyboard.c
+#  ttset_keyboard.c
+  ttset_keyboard_entry.c
   ttpset-version.rc
   ttpset.def
   )

Modified: trunk/teraterm/ttpset/ttset_keyboard.c
===================================================================
--- trunk/teraterm/ttpset/ttset_keyboard.c	2021-05-25 14:02:35 UTC (rev 9279)
+++ trunk/teraterm/ttpset/ttset_keyboard.c	2021-05-25 14:02:48 UTC (rev 9280)
@@ -29,8 +29,11 @@
 
 #include "teraterm.h"
 #include "tttypes_key.h"
+#define _CRTDBG_MAP_ALLOC
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
+#include <crtdbg.h>
 #include "ttlib.h"
 #include "codeconv.h"
 #include "../teraterm/keyboard_i.h"
@@ -43,37 +46,86 @@
 #define XFunction "X function keys"
 #define ShortCut "Shortcut keys"
 
-extern DWORD GetPrivateProfileStringAFileW(const char *appA, const char *keyA, const char* defA, char *strA, DWORD size, const wchar_t *filenameW);
-#undef GetPrivateProfileString
-#define GetPrivateProfileString(p1, p2, p3, p4, p5, p6) GetPrivateProfileStringAFileW(p1, p2, p3, p4, p5, p6)
-#define GetPrivateProfileStringA(p1, p2, p3, p4, p5, p6) GetPrivateProfileStringAFileW(p1, p2, p3, p4, p5, p6)
-
-#if	INI_FILE_IS_UNICODE
-static void GetInt(PKeyMap KeyMap, int KeyId, const char *Sect, const char *Key, const wchar_t *FName)
-#else
-static void GetInt(PKeyMap KeyMap, int KeyId, const char *Sect, const char *Key, const char *FName)
-#endif
+static void GetInt(PKeyMap KeyMap, int KeyId, const char *SectA, const char *KeyA, const wchar_t *FName)
 {
-	char Temp[11];
+	wchar_t Temp[11];
 	WORD Num;
-
-	GetPrivateProfileString(Sect, Key, "", Temp, sizeof(Temp), FName);
+	wchar_t *SectW = ToWcharA(SectA);
+	wchar_t *KeyW = ToWcharA(KeyA);
+	GetPrivateProfileStringW(SectW, KeyW, L"", Temp, _countof(Temp), FName);
+	free(SectW);
+	free(KeyW);
 	if (Temp[0] == 0)
 		Num = 0xFFFF;
-	else if (_stricmp(Temp, "off") == 0)
+	else if (_wcsicmp(Temp, L"off") == 0)
 		Num = 0xFFFF;
-	else if (sscanf(Temp, "%hd", &Num) != 1)
+	else if (swscanf(Temp, L"%hd", &Num) != 1)
 		Num = 0xFFFF;
 
 	KeyMap->Map[KeyId - 1] = Num;
 }
 
-void PASCAL ReadKeyboardCnf(PCHAR FNameA, PKeyMap KeyMap, BOOL ShowWarning)
+static void ReadUserkeysSection(const wchar_t *FName, PKeyMap KeyMap)
 {
-	int i, j, Ptr;
-	char EntName[7];
-	char TempStr[221];
-	char KStr[201];
+	int i;
+
+	for (i = 0; i < NumOfUserKey; i++) {
+		const int ttkeycode = IdUser1 + i;	// tera term key code
+		wchar_t EntName[7];
+		wchar_t TempStr[256];
+		_snwprintf_s(EntName, _countof(EntName), _TRUNCATE, L"User%d", i + 1);
+		GetPrivateProfileStringW(L"User keys", EntName, L"",
+								 TempStr, _countof(TempStr), FName);
+		if (TempStr[0] == 0) {
+			continue;
+		}
+
+		if(_wcsnicmp(TempStr, L"off", 3) == 0) {
+			KeyMap->Map[ttkeycode - 1] = 0xFFFF;
+			continue;
+		}
+
+		{
+			int keycode;
+			int type;
+			wchar_t str[256];
+			int r;
+			r = swscanf_s(TempStr, L"%d,%d,%[^\n]", &keycode, &type, &str, (unsigned)_countof(str));
+			if (r != 3) {
+				continue;
+			}
+
+			{
+				UserKey_t *UserKeyData;
+				const int UserKeyCount = KeyMap->UserKeyCount;
+				UserKey_t *p;
+
+				UserKeyData = (UserKey_t *)realloc(KeyMap->UserKeyData, sizeof(UserKey_t) * (UserKeyCount + 1));
+				p = UserKeyData + UserKeyCount;
+				p->ptr = _wcsdup(str);
+				p->len = wcslen(p->ptr);
+				p->type = type;
+				p->keycode = keycode;
+				p->ttkeycode = ttkeycode;
+
+				KeyMap->UserKeyData = UserKeyData;
+				KeyMap->UserKeyCount++;
+
+				KeyMap->Map[ttkeycode - 1] = keycode;
+			}
+		}
+	}
+}
+
+/**
+ *	keyboard.cnf \x82\xF0\x93ǂݍ\x9E\x82\xDE
+ *		\x82\xB1\x82̃t\x83@\x83C\x83\x8B\x82\xCD ttermpro.exe \x82Ƀ\x8A\x83\x93\x83N\x82\xB3\x82\xEA\x82Ă\xA2\x82\xE9
+ *		ttpset.dll ttste_keyboard_entry.c \x82\xCC ReadKeyboardCnf() \x82\xA9\x82炱\x82\xB1\x82\xAA\x83R\x81[\x83\x8B\x82\xB3\x82\xEA\x82\xE9
+ *		KeyMap \x82͏\x89\x8A\xFA\x89\xBB\x8Dς\xDD
+ */
+__declspec(dllexport) void WINAPI ReadKeyboardCnfExe(PCHAR FNameA, PKeyMap KeyMap, BOOL ShowWarning)
+{
+	int i, j;
 #if	INI_FILE_IS_UNICODE
 	const wchar_t *FName = ToWcharA(FNameA);
 #else
@@ -80,14 +132,6 @@
 	const char *FName = FNameA;
 #endif
 
-	// clear key map
-	for (i = 0; i <= IdKeyMax - 1; i++)
-		KeyMap->Map[i] = 0xFFFF;
-	for (i = 0; i <= NumOfUserKey - 1; i++) {
-		KeyMap->UserKeyPtr[i] = 0;
-		KeyMap->UserKeyLen[i] = 0;
-	}
-
 	// VT editor keypad
 	GetInt(KeyMap, IdUp, VTEditor, "Up", FName);
 
@@ -272,49 +316,14 @@
 
 	GetInt(KeyMap, IdCmdScrollLock, ShortCut, "ScrollLock", FName);
 
-	/* user keys */
+	ReadUserkeysSection(FName, KeyMap);
 
-	Ptr = 0;
-
-	i = IdUser1;
-	do {
-		_snprintf_s(EntName, sizeof(EntName), _TRUNCATE, "User%d", i - IdUser1 + 1);
-		GetPrivateProfileString("User keys", EntName, "",
-								TempStr, sizeof(TempStr), FName);
-		if (strlen(TempStr) > 0) {
-			/* scan code */
-			GetNthString(TempStr, 1, sizeof(KStr), KStr);
-			if (_stricmp(KStr, "off") == 0)
-				KeyMap->Map[i - 1] = 0xFFFF;
-			else {
-				GetNthNum(TempStr, 1, &j);
-				KeyMap->Map[i - 1] = (WORD) j;
-			}
-			/* conversion flag */
-			GetNthNum(TempStr, 2, &j);
-			KeyMap->UserKeyType[i - IdUser1] = (BYTE) j;
-			/* key string */
-/*	GetNthString(TempStr,3,sizeof(KStr),KStr); */
-			KeyMap->UserKeyPtr[i - IdUser1] = Ptr;
-/*	KeyMap->UserKeyLen[i-IdUser1] =
-	Hex2Str(KStr,&(KeyMap->UserKeyStr[Ptr]),KeyStrMax-Ptr+1);
-*/
-			GetNthString(TempStr, 3, KeyStrMax - Ptr + 1,
-			             &(KeyMap->UserKeyStr[Ptr]));
-			KeyMap->UserKeyLen[i - IdUser1] =
-				strlen(&(KeyMap->UserKeyStr[Ptr]));
-			Ptr = Ptr + KeyMap->UserKeyLen[i - IdUser1];
-		}
-
-		i++;
-	}
-	while ((i <= IdKeyMax) && (strlen(TempStr) > 0) && (Ptr <= KeyStrMax));
-
 	for (j = 1; j <= IdKeyMax - 1; j++)
 		if (KeyMap->Map[j] != 0xFFFF)
 			for (i = 0; i <= j - 1; i++)
 				if (KeyMap->Map[i] == KeyMap->Map[j]) {
 					if (ShowWarning) {
+						char TempStr[128];
 						_snprintf_s(TempStr, sizeof(TempStr), _TRUNCATE,
 						            "Keycode %d is used more than once",
 						            KeyMap->Map[j]);

Copied: trunk/teraterm/ttpset/ttset_keyboard_entry.c (from rev 9279, trunk/teraterm/teraterm/keyboard_i.h)
===================================================================
--- trunk/teraterm/ttpset/ttset_keyboard_entry.c	                        (rev 0)
+++ trunk/teraterm/ttpset/ttset_keyboard_entry.c	2021-05-25 14:02:48 UTC (rev 9280)
@@ -0,0 +1,44 @@
+/*
+ * (C) 2021- TeraTerm Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <windows.h>
+
+#include "teraterm.h"
+#include "dllutil.h"
+#include "../teraterm/keyboard_i.h"
+
+void PASCAL ReadKeyboardCnf(PCHAR FNameA, PKeyMap KeyMap, BOOL ShowWarning)
+{
+	void (*ReadKeyboardCnfExe)(PCHAR FNameA, PKeyMap KeyMap, BOOL ShowWarning);
+	DWORD r = DLLGetApiAddress("ttermpro.exe", DLL_LOAD_LIBRARY_CURRENT, "ReadKeyboardCnfExe", (void **)&ReadKeyboardCnfExe);
+	if (r != NO_ERROR) {
+		return;
+	}
+
+	ReadKeyboardCnfExe(FNameA, KeyMap, ShowWarning);
+}


Ttssh2-commit メーリングリストの案内
Zurück zum Archiv-Index