Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/teraterm/ttpset/ttset_keyboard.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 10129 - (show annotations) (download) (as text)
Tue Aug 9 01:08:26 2022 UTC (21 months, 3 weeks ago) by zmatsuo
File MIME type: text/x-csrc
File size: 7757 byte(s)
ttpset.dll を ttermpro.exe へマージした

- EXE(ttermpro.exe)とDLL(ttpset.dll)の各々にヒープが存在する
- モジュール(各ファイル)をまたいでお互いのヒープを操作すると問題が起きる
  - dll側で確保してexe側で開放するなどの操作
  - ヒープを操作するとアサートが出るなど問題
  - どんな問題が出るのかについてのドキュメントは見当たらない
  - _CrtIsValidHeapPointer()の説明のヒープ部分から…
    - Visual Studio 2010 以降のCRTはヒープは単一になっているのかもしれない
    - でも、DLLにstatic CRTがリンクされているときは、DLL個別のヒープが存在する
    - Tera Term は static CRT を使用している → DLLに個別のヒープが存在する
- Tera Term 5 では、iniファイルから読み込んだファイル,パス文字列をヒープに置くようにした
  - ttpset.dllがiniファイルの読み書きを担っていた
  - Unicode対応と合わせて、ファイル名長の上限を撤廃しようとしている
  - 従来の上限→MAX_PATH文字
  - パスの変更などでモジュールをまたいだヒープ操作が行われることになり、問題が起こる可能性がある
    - ログ保存先フォルダを変更するときなどに、malloc(),free()が行われる
- ttpset.dllをなくして、その機能をttermpro.exeに取り込むことでヒープに関する問題が出る可能性を減らす
- ttssh2-dev 409

ticket #45330
1 /*
2 * Copyright (C) 1994-1998 T. Teranishi
3 * (C) 2004- TeraTerm Project
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30 #include "teraterm.h"
31 #include "tttypes_key.h"
32 #define _CRTDBG_MAP_ALLOC
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include <string.h>
36 #include <crtdbg.h>
37 #include "ttlib.h"
38 #include "codeconv.h"
39 #include "../teraterm/keyboard_i.h"
40 #include "ttset.h"
41
42 typedef struct {
43 int key_id;
44 const wchar_t *key_str;
45 } keymap_list_t;
46
47 static void ReadList(PKeyMap KeyMap, const wchar_t *section, const keymap_list_t *list, size_t count, const wchar_t *FName)
48 {
49 size_t i;
50 const keymap_list_t *p = list;
51 for (i = 0; i < count; p++,i++) {
52 wchar_t Temp[11];
53 WORD Num;
54 GetPrivateProfileStringW(section, p->key_str, L"", Temp, _countof(Temp), FName);
55 if (Temp[0] == 0)
56 Num = 0xFFFF;
57 else if (_wcsicmp(Temp, L"off") == 0)
58 Num = 0xFFFF;
59 else if (swscanf(Temp, L"%hd", &Num) != 1)
60 Num = 0xFFFF;
61
62 KeyMap->Map[p->key_id - 1] = Num;
63 }
64 }
65
66 static void ReadKeyboardMap(PKeyMap KeyMap, const wchar_t* FName)
67 {
68 static const keymap_list_t vteditor_list[] = {
69 // VT editor keypad
70 { IdUp, L"Up" },
71 { IdDown, L"Down" },
72 { IdRight, L"Right" },
73 { IdLeft, L"Left" },
74 { IdFind, L"Find" },
75 { IdInsert, L"Insert" },
76 { IdRemove, L"Remove" },
77 { IdSelect, L"Select" },
78 { IdPrev, L"Prev" },
79 { IdNext, L"Next" },
80 };
81
82 static const keymap_list_t vtnumeric_list[] = {
83 // VT numeric keypad
84 { Id0, L"Num0" },
85 { Id1, L"Num1" },
86 { Id2, L"Num2" },
87 { Id3, L"Num3" },
88 { Id4, L"Num4" },
89 { Id5, L"Num5" },
90 { Id6, L"Num6" },
91 { Id7, L"Num7" },
92 { Id8, L"Num8" },
93 { Id9, L"Num9" },
94 { IdMinus, L"NumMinus" },
95 { IdComma, L"NumComma" },
96 { IdPeriod, L"NumPeriod" },
97 { IdEnter, L"NumEnter" },
98 { IdSlash, L"NumSlash" },
99 { IdAsterisk, L"NumAsterisk" },
100 { IdPlus, L"NumPlus" },
101 { IdPF1, L"PF1" },
102 { IdPF2, L"PF2" },
103 { IdPF3, L"PF3" },
104 { IdPF4, L"PF4" },
105 };
106
107 static const keymap_list_t vtfunction_list[] = {
108 // VT function keys
109 { IdHold, L"Hold" },
110 { IdPrint, L"Print" },
111 { IdBreak, L"Break" },
112 { IdF6, L"F6" },
113 { IdF7, L"F7" },
114 { IdF8, L"F8" },
115 { IdF9, L"F9" },
116 { IdF10, L"F10" },
117 { IdF11, L"F11" },
118 { IdF12, L"F12" },
119 { IdF13, L"F13" },
120 { IdF14, L"F14" },
121 { IdHelp, L"Help" },
122 { IdDo, L"Do" },
123 { IdF17, L"F17" },
124 { IdF18, L"F18" },
125 { IdF19, L"F19" },
126 { IdF20, L"F20" },
127
128 // UDK
129 { IdUDK6, L"UDK6" },
130 { IdUDK7, L"UDK7" },
131 { IdUDK8, L"UDK8" },
132 { IdUDK9, L"UDK9" },
133 { IdUDK10, L"UDK10" },
134 { IdUDK11, L"UDK11" },
135 { IdUDK12, L"UDK12" },
136 { IdUDK13, L"UDK13" },
137 { IdUDK14, L"UDK14" },
138 { IdUDK15, L"UDK15" },
139 { IdUDK16, L"UDK16" },
140 { IdUDK17, L"UDK17" },
141 { IdUDK18, L"UDK18" },
142 { IdUDK19, L"UDK19" },
143 };
144
145 static const keymap_list_t xterm_list[] = {
146 // XTERM function / extended keys
147 { IdXF1, L"XF1" },
148 { IdXF2, L"XF2" },
149 { IdXF3, L"XF3" },
150 { IdXF4, L"XF4" },
151 { IdXF5, L"XF5" },
152 { IdXBackTab, L"XBackTab" },
153 };
154
155 static const keymap_list_t shortcut_list[] = {
156 // accelerator keys
157 { IdCmdEditCopy, L"EditCopy" },
158 { IdCmdEditPaste, L"EditPaste" },
159 { IdCmdEditPasteCR, L"EditPasteCR" },
160 { IdCmdEditCLS, L"EditCLS" },
161 { IdCmdEditCLB, L"EditCLB" },
162 { IdCmdCtrlOpenTEK, L"ControlOpenTEK" },
163 { IdCmdCtrlCloseTEK, L"ControlCloseTEK" },
164 { IdCmdLineUp, L"LineUp" },
165 { IdCmdLineDown, L"LineDown" },
166 { IdCmdPageUp, L"PageUp" },
167 { IdCmdPageDown, L"PageDown" },
168 { IdCmdBuffTop, L"BuffTop" },
169 { IdCmdBuffBottom, L"BuffBottom" },
170 { IdCmdNextWin, L"NextWin" },
171 { IdCmdPrevWin, L"PrevWin" },
172 { IdCmdNextSWin, L"NextShownWin" },
173 { IdCmdPrevSWin, L"PrevShownWin" },
174 { IdCmdLocalEcho, L"LocalEcho" },
175 { IdCmdScrollLock, L"ScrollLock" },
176 };
177
178 ReadList(KeyMap, L"VT editor keypad", vteditor_list, _countof(vteditor_list), FName);
179 ReadList(KeyMap, L"VT numeric keypad", vtnumeric_list, _countof(vtnumeric_list), FName);
180 ReadList(KeyMap, L"VT function keys", vtfunction_list, _countof(vtfunction_list), FName);
181 ReadList(KeyMap, L"X function keys", xterm_list, _countof(xterm_list), FName);
182 ReadList(KeyMap, L"Shortcut keys", shortcut_list, _countof(shortcut_list), FName);
183 }
184
185 static void ReadUserkeysSection(const wchar_t *FName, PKeyMap KeyMap)
186 {
187 int i;
188
189 for (i = 0; i < NumOfUserKey; i++) {
190 const int ttkeycode = IdUser1 + i; // tera term key code
191 wchar_t EntName[7];
192 wchar_t TempStr[256];
193 _snwprintf_s(EntName, _countof(EntName), _TRUNCATE, L"User%d", i + 1);
194 GetPrivateProfileStringW(L"User keys", EntName, L"",
195 TempStr, _countof(TempStr), FName);
196 if (TempStr[0] == 0) {
197 continue;
198 }
199
200 if(_wcsnicmp(TempStr, L"off", 3) == 0) {
201 KeyMap->Map[ttkeycode - 1] = 0xFFFF;
202 continue;
203 }
204
205 {
206 int keycode;
207 int type;
208 wchar_t str[256];
209 int r;
210 r = swscanf_s(TempStr, L"%d,%d,%[^\n]", &keycode, &type, &str, (unsigned)_countof(str));
211 if (r != 3) {
212 continue;
213 }
214
215 {
216 UserKey_t *UserKeyData;
217 const int UserKeyCount = KeyMap->UserKeyCount;
218 UserKey_t *p;
219
220 UserKeyData = (UserKey_t *)realloc(KeyMap->UserKeyData, sizeof(UserKey_t) * (UserKeyCount + 1));
221 p = UserKeyData + UserKeyCount;
222 p->ptr = _wcsdup(str);
223 p->len = wcslen(p->ptr);
224 p->type = type;
225 p->keycode = keycode;
226 p->ttkeycode = ttkeycode;
227
228 KeyMap->UserKeyData = UserKeyData;
229 KeyMap->UserKeyCount++;
230
231 KeyMap->Map[ttkeycode - 1] = (WORD)keycode;
232 }
233 }
234 }
235 }
236
237 /**
238 * keyboard.cnf ����������
239 * KeyMap ������������
240 */
241 void PASCAL _ReadKeyboardCnf(const wchar_t *FName, PKeyMap KeyMap, BOOL ShowWarning)
242 {
243 int i, j;
244
245 ReadKeyboardMap(KeyMap, FName);
246 ReadUserkeysSection(FName, KeyMap);
247
248 // �d���`�F�b�N
249 for (j = 1; j <= IdKeyMax - 1; j++)
250 if (KeyMap->Map[j] != 0xFFFF)
251 for (i = 0; i <= j - 1; i++)
252 if (KeyMap->Map[i] == KeyMap->Map[j]) {
253 if (ShowWarning) {
254 char TempStr[128];
255 _snprintf_s(TempStr, sizeof(TempStr), _TRUNCATE,
256 "Keycode %d is used more than once",
257 KeyMap->Map[j]);
258 MessageBoxA(NULL, TempStr,
259 "Tera Term: Error in keyboard setup file",
260 MB_ICONEXCLAMATION);
261 }
262 KeyMap->Map[i] = 0xFFFF;
263 }
264 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26