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); +}