• R/O
  • SSH
  • HTTPS

ttssh2: 提交


Commit MetaInfo

修订版8792 (tree)
时间2020-05-27 23:29:55
作者zmatsuo

Log Message

ホスト名入力エディットボックスをUnicode化

- ホスト名に漢字などはないと思われるが、パイプなどはあり得るか
- ttxsshのホスト名コンボボックスのキー処理をdlglib.cの共通関数を使用するよう修正

更改概述

差异

--- trunk/teraterm/common/dlglib.c (revision 8791)
+++ trunk/teraterm/common/dlglib.c (revision 8792)
@@ -240,6 +240,7 @@
240240 // C-d/C-k をサポート (2007.10.3 yutaka)
241241 // ドロップダウンの中のエディットコントロールを
242242 // サブクラス化するためのウインドウプロシージャ
243+// TODO サロゲートペア文字の場合の処理
243244 static LRESULT CALLBACK HostnameEditProc(HWND dlg, UINT msg,
244245 WPARAM wParam, LPARAM lParam)
245246 {
@@ -349,17 +350,17 @@
349350 break;
350351 }
351352
352- SetWindowLongPtr(dlg, GWLP_WNDPROC, (LONG_PTR)data->OrigProc);
353+ _SetWindowLongPtrW(dlg, GWLP_WNDPROC, (LONG_PTR)data->OrigProc);
353354 SetWindowLongPtr(dlg, GWLP_USERDATA, (LONG_PTR)data->OrigUser);
354- Result = CallWindowProc(data->OrigProc, dlg, msg, wParam, lParam);
355+ Result = _CallWindowProcW(data->OrigProc, dlg, msg, wParam, lParam);
355356 data->OrigProc = (WNDPROC)GetWindowLongPtr(dlg, GWLP_WNDPROC);
356357 data->OrigUser = GetWindowLongPtr(dlg, GWLP_USERDATA);
357- SetWindowLongPtr(dlg, GWLP_WNDPROC, (LONG_PTR)HostnameEditProc);
358+ _SetWindowLongPtrW(dlg, GWLP_WNDPROC, (LONG_PTR)HostnameEditProc);
358359 SetWindowLongPtr(dlg, GWLP_USERDATA, (LONG_PTR)data);
359360
360361 switch (msg) {
361362 case WM_NCDESTROY:
362- SetWindowLongPtr(dlg, GWLP_WNDPROC, (LONG_PTR)data->OrigProc);
363+ _SetWindowLongPtrW(dlg, GWLP_WNDPROC, (LONG_PTR)data->OrigProc);
363364 SetWindowLongPtr(dlg, GWLP_USERDATA, (LONG_PTR)data->OrigUser);
364365 free(data);
365366 break;
@@ -368,7 +369,13 @@
368369 return Result;
369370 }
370371
371-// C-n/C-p のためにサブクラス化
372+/**
373+ * エディットボックス/コンボボックスのキー操作を emacs 風にする
374+ * C-n/C-p のためにサブクラス化
375+ * @praram hDlg ダイアログ
376+ * @praram nID emacs風にするエディットボックス または コンボボックス
377+ * @param comboBox TRUE = nIDがコンボボックス
378+ */
372379 void SetEditboxSubclass(HWND hDlg, int nID, BOOL ComboBox)
373380 {
374381 EditSubclassData *data;
@@ -377,10 +384,10 @@
377384 hWndEdit = GetWindow(hWndEdit, GW_CHILD);
378385 }
379386 data = (EditSubclassData *)malloc(sizeof(EditSubclassData));
380- data->OrigProc = (WNDPROC)GetWindowLongPtr(hWndEdit, GWLP_WNDPROC);
387+ data->OrigProc = (WNDPROC)GetWindowLongPtrW(hWndEdit, GWLP_WNDPROC);
381388 data->OrigUser = (LONG_PTR)GetWindowLongPtr(hWndEdit, GWLP_USERDATA);
382389 data->ComboBox = ComboBox;
383- SetWindowLongPtr(hWndEdit, GWLP_WNDPROC, (LONG_PTR)HostnameEditProc);
390+ _SetWindowLongPtrW(hWndEdit, GWLP_WNDPROC, (LONG_PTR)HostnameEditProc);
384391 SetWindowLongPtr(hWndEdit, GWLP_USERDATA, (LONG_PTR)data);
385392 }
386393
--- trunk/ttssh2/ttxssh/ttxssh.c (revision 8791)
+++ trunk/ttssh2/ttxssh/ttxssh.c (revision 8792)
@@ -1183,113 +1183,6 @@
11831183 }
11841184 }
11851185
1186-// C-p/C-n/C-b/C-f/C-a/C-e をサポート (2007.9.5 maya)
1187-// C-d/C-k をサポート (2007.10.3 yutaka)
1188-// ドロップダウンの中のエディットコントロールを
1189-// サブクラス化するためのウインドウプロシージャ
1190-WNDPROC OrigHostnameEditProc; // Original window procedure
1191-LRESULT CALLBACK HostnameEditProc(HWND dlg, UINT msg,
1192- WPARAM wParam, LPARAM lParam)
1193-{
1194- HWND parent;
1195- int max, select, len;
1196- char *str, *orgstr;
1197-
1198- switch (msg) {
1199- // キーが押されたのを検知する
1200- case WM_KEYDOWN:
1201- if (GetKeyState(VK_CONTROL) < 0) {
1202- switch (wParam) {
1203- case 0x50: // Ctrl+p ... up
1204- parent = GetParent(dlg);
1205- select = SendMessage(parent, CB_GETCURSEL, 0, 0);
1206- if (select > 0) {
1207- PostMessage(parent, CB_SETCURSEL, select - 1, 0);
1208- }
1209- return 0;
1210- case 0x4e: // Ctrl+n ... down
1211- parent = GetParent(dlg);
1212- max = SendMessage(parent, CB_GETCOUNT, 0, 0);
1213- select = SendMessage(parent, CB_GETCURSEL, 0, 0);
1214- if (select < max - 1) {
1215- PostMessage(parent, CB_SETCURSEL, select + 1, 0);
1216- }
1217- return 0;
1218- case 0x42: // Ctrl+b ... left
1219- SendMessage(dlg, EM_GETSEL, 0, (LPARAM)&select);
1220- PostMessage(dlg, EM_SETSEL, select-1, select-1);
1221- return 0;
1222- case 0x46: // Ctrl+f ... right
1223- SendMessage(dlg, EM_GETSEL, 0, (LPARAM)&select);
1224- max = GetWindowTextLength(dlg) ;
1225- PostMessage(dlg, EM_SETSEL, select+1, select+1);
1226- return 0;
1227- case 0x41: // Ctrl+a ... home
1228- PostMessage(dlg, EM_SETSEL, 0, 0);
1229- return 0;
1230- case 0x45: // Ctrl+e ... end
1231- max = GetWindowTextLength(dlg) ;
1232- PostMessage(dlg, EM_SETSEL, max, max);
1233- return 0;
1234-
1235- case 0x44: // Ctrl+d
1236- case 0x4b: // Ctrl+k
1237- case 0x55: // Ctrl+u
1238- SendMessage(dlg, EM_GETSEL, 0, (LPARAM)&select);
1239- max = GetWindowTextLength(dlg);
1240- max++; // '\0'
1241- orgstr = str = malloc(max);
1242- if (str != NULL) {
1243- len = GetWindowText(dlg, str, max);
1244- if (select >= 0 && select < len) {
1245- if (wParam == 0x44) { // カーソル配下の文字のみを削除する
1246- memmove(&str[select], &str[select + 1], len - select - 1);
1247- str[len - 1] = '\0';
1248-
1249- } else if (wParam == 0x4b) { // カーソルから行末まで削除する
1250- str[select] = '\0';
1251-
1252- }
1253- }
1254-
1255- if (wParam == 0x55) { // カーソルより左側をすべて消す
1256- if (select >= len) {
1257- str[0] = '\0';
1258- } else {
1259- str = &str[select];
1260- }
1261- select = 0;
1262- }
1263-
1264- SetWindowText(dlg, str);
1265- SendMessage(dlg, EM_SETSEL, select, select);
1266- free(orgstr);
1267- return 0;
1268- }
1269- break;
1270- }
1271- }
1272- break;
1273-
1274- // 上のキーを押した結果送られる文字で音が鳴るので捨てる
1275- case WM_CHAR:
1276- switch (wParam) {
1277- case 0x01:
1278- case 0x02:
1279- case 0x04:
1280- case 0x05:
1281- case 0x06:
1282- case 0x0b:
1283- case 0x0e:
1284- case 0x10:
1285- case 0x15:
1286- return 0;
1287- }
1288- }
1289-
1290- return CallWindowProc(OrigHostnameEditProc, dlg, msg, wParam, lParam);
1291-}
1292-
12931186 static INT_PTR CALLBACK TTXHostDlg(HWND dlg, UINT msg, WPARAM wParam,
12941187 LPARAM lParam)
12951188 {
@@ -1359,11 +1252,7 @@
13591252
13601253 SendDlgItemMessage(dlg, IDC_HOSTNAME, CB_SETCURSEL, 0, 0);
13611254
1362- // C-n/C-p のためにサブクラス化 (2007.9.4 maya)
1363- hwndHostname = GetDlgItem(dlg, IDC_HOSTNAME);
1364- hwndHostnameEdit = GetWindow(hwndHostname, GW_CHILD);
1365- OrigHostnameEditProc = (WNDPROC)GetWindowLongPtr(hwndHostnameEdit, GWLP_WNDPROC);
1366- SetWindowLongPtr(hwndHostnameEdit, GWLP_WNDPROC, (LONG_PTR)HostnameEditProc);
1255+ SetEditboxSubclass(dlg, IDC_HOSTNAME, TRUE);
13671256
13681257 CheckRadioButton(dlg, IDC_HOSTTELNET, IDC_HOSTOTHER,
13691258 pvar->settings.Enabled ? IDC_HOSTSSH : GetHNRec->
@@ -1555,12 +1444,10 @@
15551444 }
15561445 }
15571446 }
1558- SetWindowLongPtr(hwndHostnameEdit, GWLP_WNDPROC, (LONG_PTR)OrigHostnameEditProc);
15591447 EndDialog(dlg, 1);
15601448 return TRUE;
15611449
15621450 case IDCANCEL:
1563- SetWindowLongPtr(hwndHostnameEdit, GWLP_WNDPROC, (LONG_PTR)OrigHostnameEditProc);
15641451 EndDialog(dlg, 0);
15651452 return TRUE;
15661453
Show on old repository browser