Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /branches/ttcomtester/teraterm/teraterm/setupdirdlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 9916 - (hide annotations) (download) (as text)
Thu May 12 13:55:37 2022 UTC (23 months ago) by zmatsuo
Original Path: trunk/teraterm/teraterm/setupdirdlg.cpp
File MIME type: text/x-c++src
File size: 24299 byte(s)
[Setup]/[Setup directory...] に表示できるパスを追加

- リストビューを追加、
- 次のフォルダ,ファイルも表示
  - カレントディレクトリ
  - HomeDir, 個人設定ファイルのあるフォルダ
  - ExeDir, 実行ファイル(ttermpro.exeなど)のあるフォルダ
  - LogDir, Tera Termの動作ログやダンプを置くフォルダ
  - LogDefaultPathW, 端末ログを置くフォルダ
  - Download, ダウンロードフォルダ
  - Susie Plugin Path, Susiプラグイン
  - UI language file, UI langファイル
1 zmatsuo 9339 /*
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.h"
32     #include "tttypes_key.h"
33    
34     #include "ttcommon.h"
35     #include "ttdialog.h"
36     #include "commlib.h"
37     #include "ttlib.h"
38     #include "dlglib.h"
39    
40     #include <stdio.h>
41     #define _CRTDBG_MAP_ALLOC
42     #include <stdlib.h>
43     #include <crtdbg.h>
44     #include <string.h>
45 zmatsuo 9503 #include <assert.h>
46 zmatsuo 9339
47     #include <shlobj.h>
48     #include <windows.h>
49     #include <wchar.h>
50     #include <htmlhelp.h>
51    
52     #include "tt_res.h"
53     #include "vtwin.h"
54     #include "compat_win.h"
55     #include "codeconv.h"
56     #include "asprintf.h"
57 zmatsuo 9412 #include "helpid.h"
58 zmatsuo 9543 #include "win32helper.h"
59 zmatsuo 9339
60     #include "setupdirdlg.h"
61    
62 zmatsuo 9340 // Virtual Store���L���������������������������B
63 zmatsuo 9339 //
64 zmatsuo 9340 // [Windows 95-XP]
65     // return FALSE (always)
66     //
67     // [Windows Vista-10]
68     // return TRUE: Virtual Store Enabled
69     // FALSE: Virtual Store Disabled or Unknown
70     //
71     static BOOL GetVirtualStoreEnvironment(void)
72     {
73     #if _MSC_VER == 1400 // VSC2005(VC8.0)
74     typedef struct _TOKEN_ELEVATION {
75     DWORD TokenIsElevated;
76     } TOKEN_ELEVATION, *PTOKEN_ELEVATION;
77     int TokenElevation = 20;
78     #endif
79     BOOL ret = FALSE;
80     int flag = 0;
81     HANDLE hToken;
82     DWORD dwLength;
83     TOKEN_ELEVATION tokenElevation;
84     LONG lRet;
85     HKEY hKey;
86     char lpData[256];
87     DWORD dwDataSize;
88     DWORD dwType;
89     BYTE bValue;
90    
91     // Windows Vista���O�����������B
92     if (!IsWindowsVistaOrLater())
93     goto error;
94    
95     // UAC���L�����������B
96     // HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System��EnableLUA(DWORD�l)��0�������������f��������(0��UAC�����A1��UAC�L��)�B
97     flag = 0;
98 zmatsuo 9543 lRet = RegOpenKeyExA(HKEY_LOCAL_MACHINE,
99     "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System",
100     0, KEY_QUERY_VALUE, &hKey);
101 zmatsuo 9340 if (lRet == ERROR_SUCCESS) {
102     dwDataSize = sizeof(lpData) / sizeof(lpData[0]);
103 zmatsuo 9543 lRet = RegQueryValueExA(
104 zmatsuo 9340 hKey,
105 zmatsuo 9543 "EnableLUA",
106 zmatsuo 9340 0,
107     &dwType,
108     (LPBYTE)lpData,
109     &dwDataSize);
110     if (lRet == ERROR_SUCCESS) {
111     bValue = ((LPBYTE)lpData)[0];
112     if (bValue == 1)
113     // UAC���L���������AVirtual Store�������B
114     flag = 1;
115     }
116     RegCloseKey(hKey);
117     }
118     if (flag == 0)
119     goto error;
120    
121     // UAC���L�����A�v���Z�X�����������������i�����������B
122     flag = 0;
123     if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_DEFAULT, &hToken)) {
124     if (GetTokenInformation(hToken, (TOKEN_INFORMATION_CLASS)TokenElevation, &tokenElevation, sizeof(TOKEN_ELEVATION), &dwLength)) {
125     // (0�����i�����������A��0�����i��������)�B
126     if (tokenElevation.TokenIsElevated == 0) {
127     // �����������������������������AVirtual Store�������B
128     flag = 1;
129     }
130     }
131     CloseHandle(hToken);
132     }
133     if (flag == 0)
134     goto error;
135    
136     ret = TRUE;
137     return (ret);
138    
139     error:
140     return (ret);
141     }
142    
143     //
144 zmatsuo 9339 // �w�������A�v���P�[�V�������t�@�C�����J���B
145     //
146     // return TRUE: success
147     // FALSE: failure
148     //
149 zmatsuo 9543 static BOOL openFileWithApplication(const wchar_t *filename, const char *editor, const wchar_t *UILanguageFile)
150 zmatsuo 9339 {
151 zmatsuo 9340 wchar_t *commandW = NULL;
152 zmatsuo 9339 BOOL ret = FALSE;
153    
154 zmatsuo 9340 if (GetFileAttributesW(filename) == INVALID_FILE_ATTRIBUTES) {
155     // �t�@�C��������������
156     DWORD no = GetLastError();
157     static const TTMessageBoxInfoW info = {
158     "Tera Term",
159     "MSG_ERROR", L"ERROR",
160 zmatsuo 9342 "DLG_SETUPDIR_NOFILE_ERROR", L"File does not exist.(%d)",
161     MB_OK | MB_ICONWARNING
162     };
163 zmatsuo 9543 TTMessageBoxW(NULL, &info, UILanguageFile, no);
164 zmatsuo 9339
165     goto error;
166     }
167    
168 zmatsuo 9340 aswprintf(&commandW, L"%hs \"%s\"", editor, filename);
169 zmatsuo 9339
170 zmatsuo 9340 STARTUPINFOW si;
171     PROCESS_INFORMATION pi;
172 zmatsuo 9339 memset(&si, 0, sizeof(si));
173 zmatsuo 9340 GetStartupInfoW(&si);
174 zmatsuo 9339 memset(&pi, 0, sizeof(pi));
175    
176 zmatsuo 9340 if (CreateProcessW(NULL, commandW, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi) == 0) {
177     // �N�����s
178 zmatsuo 9339 DWORD no = GetLastError();
179 zmatsuo 9340 static const TTMessageBoxInfoW info = {
180     "Tera Term",
181     "MSG_ERROR", L"ERROR",
182 zmatsuo 9342 "DLG_SETUPDIR_OPENFILE_ERROR", L"Cannot open file.(%d)",
183     MB_OK | MB_ICONWARNING
184     };
185 zmatsuo 9543 TTMessageBoxW(NULL, &info, UILanguageFile, no);
186 zmatsuo 9340
187 zmatsuo 9339 goto error;
188 zmatsuo 9340 }
189     else {
190 zmatsuo 9339 CloseHandle(pi.hThread);
191     CloseHandle(pi.hProcess);
192     }
193    
194     ret = TRUE;
195    
196     error:;
197 zmatsuo 9340 free(commandW);
198    
199 zmatsuo 9339 return (ret);
200     }
201    
202 zmatsuo 9543 /**
203     * �G�N�X�v���[�����w���t�@�C�����t�H���_���J��
204     * �t�@�C�������������������t�@�C�����I�������������J��
205     * �t�@�C���������������������t�H���_���J��
206     *
207     * @param file �t�@�C��
208     * @retval TRUE: success
209     * @retval FALSE: failure
210     */
211     static BOOL openDirectoryWithExplorer(const wchar_t *file, const wchar_t *UILanguageFile)
212 zmatsuo 9339 {
213 zmatsuo 9340 BOOL ret;
214 zmatsuo 9339
215 zmatsuo 9543 DWORD attr = GetFileAttributesW(file);
216 zmatsuo 9340 if (attr == INVALID_FILE_ATTRIBUTES) {
217 zmatsuo 9543 // �t�@�C��������������, �f�B���N�g�����I�[�v������
218     wchar_t *dir = ExtractDirNameW(file);
219     attr = GetFileAttributesW(dir);
220     if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) {
221     // �t�H���_���J��
222     INT_PTR h = (INT_PTR)ShellExecuteW(NULL, L"open", L"explorer.exe", dir, NULL, SW_NORMAL);
223     ret = h > 32 ? TRUE : FALSE;
224     }
225     else {
226     // �t�@�C�����t�H���_������������
227     DWORD no = GetLastError();
228     static const TTMessageBoxInfoW info = {
229     "Tera Term",
230     "MSG_ERROR", L"ERROR",
231     "DLG_SETUPDIR_NOFILE_ERROR", L"File does not exist.(%d)",
232     MB_OK | MB_ICONWARNING
233     };
234     TTMessageBoxW(NULL, &info, UILanguageFile, no);
235     ret = FALSE;
236     }
237     free(dir);
238 zmatsuo 9340 } else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) {
239 zmatsuo 9543 // �w�������������t�H���_�������A�t�H���_���J��
240     INT_PTR h = (INT_PTR)ShellExecuteW(NULL, L"open", L"explorer.exe", file, NULL, SW_NORMAL);
241 zmatsuo 9340 ret = h > 32 ? TRUE : FALSE;
242     } else {
243     // �t�H���_���J�� + �t�@�C���I��
244     wchar_t *param;
245 zmatsuo 9543 aswprintf(&param, L"/select,%s", file);
246 zmatsuo 9340 INT_PTR h = (INT_PTR)ShellExecuteW(NULL, L"open", L"explorer.exe", param, NULL, SW_NORMAL);
247     free(param);
248     ret = h > 32 ? TRUE : FALSE;
249 zmatsuo 9339 }
250 zmatsuo 9340 return ret;
251 zmatsuo 9339 }
252    
253 zmatsuo 9340 /**
254     * �t���p�X�t�@�C������ Virtual Store�p�X�����������B
255     * @param[in] filename �����O���t�@�C����
256     * @param[out] vstore_filename Virtual Store���t�@�C����
257     * @retval TRUE ��������
258     * FALSE ��������������(Virtual Store������������������)
259     */
260     static BOOL convertVirtualStoreW(const wchar_t *filename, wchar_t **vstore_filename)
261 zmatsuo 9339 {
262 zmatsuo 9340 wchar_t *path = ExtractDirNameW(filename);
263     wchar_t *file = ExtractFileNameW(filename);
264    
265     // �s�v���h���C�u���^�[�����������B
266     // �h���C�u���^�[���������������������_�������B(1��������?)
267     wchar_t *path_nodrive = wcsstr(path, L":\\");
268     if (path_nodrive == NULL) {
269     // �t���p�X��������, VS���l������������ok
270     free(path);
271     free(file);
272     return FALSE;
273 zmatsuo 9339 }
274 zmatsuo 9340 path_nodrive++;
275 zmatsuo 9339
276     BOOL ret = FALSE;
277 zmatsuo 9340 static const wchar_t* virstore_env[] = {
278     L"ProgramFiles",
279     L"ProgramData",
280     L"SystemRoot",
281 zmatsuo 9339 NULL
282     };
283 zmatsuo 9340 const wchar_t** p = virstore_env;
284 zmatsuo 9339
285 zmatsuo 9340 if (GetVirtualStoreEnvironment() == FALSE)
286 zmatsuo 9339 goto error;
287    
288     // Virtual Store�����������t�H���_���B
289     while (*p) {
290 zmatsuo 9340 const wchar_t *s = _wgetenv(*p);
291     if (s != NULL && wcsstr(path, s) != NULL) {
292 zmatsuo 9339 break;
293     }
294     p++;
295     }
296     if (*p == NULL)
297     goto error;
298    
299    
300     // Virtual Store�p�X�������B
301 zmatsuo 9421 wchar_t *local_appdata;
302     _SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &local_appdata);
303     wchar_t *vs_file;
304 zmatsuo 9503 aswprintf(&vs_file, L"%s\\VirtualStore%s\\%s", local_appdata, path_nodrive, file);
305 zmatsuo 9421 free(local_appdata);
306 zmatsuo 9339
307     // �������AVirtual Store���t�@�C�������������������������B
308 zmatsuo 9340 if (GetFileAttributesW(vs_file) == INVALID_FILE_ATTRIBUTES) {
309     free(vs_file);
310 zmatsuo 9339 goto error;
311     }
312    
313 zmatsuo 9340 *vstore_filename = vs_file;
314 zmatsuo 9339
315     ret = TRUE;
316 zmatsuo 9340 goto epilogue;
317 zmatsuo 9339
318     error:
319 zmatsuo 9340 *vstore_filename = NULL;
320     ret = FALSE;
321     epilogue:
322     free(path);
323     free(file);
324     return ret;
325 zmatsuo 9339 }
326    
327 zmatsuo 9916 /**
328     * ���X�g���`�p�\����
329     */
330     typedef enum {
331     LIST_PARAM_STR = 1, // ������
332     LIST_PARAM_FUNC = 2, // ����
333     } SetupListParam;
334     typedef struct {
335     const char *key; // �e�L�X�g���L�[
336     const wchar_t *def_text; // �f�t�H���g�e�L�X�g
337     SetupListParam param; // param_ptr �����e������
338     void *param_ptr; // param�������l
339     void *data_ptr; // ���������g�p�����f�[�^
340     } SetupList;
341    
342     /**
343     * ���j���[���o�����I�����������������s����
344     */
345     static void PopupAndExec(HWND hWnd, const POINT *pointer_pos, const wchar_t *path, const TTTSet *pts)
346     {
347     const wchar_t *UILanguageFile = pts->UILanguageFileW;
348     const DWORD file_stat = GetFileAttributesW(path);
349     const BOOL dir = (file_stat & FILE_ATTRIBUTE_DIRECTORY) != 0 ? TRUE : FALSE;
350    
351     HMENU hMenu= CreatePopupMenu();
352     AppendMenuW(hMenu, (dir ? MF_DISABLED : MF_ENABLED) | MF_STRING | 0, 1, L"&Open file");
353     AppendMenuW(hMenu, MF_ENABLED | MF_STRING | 0, 2, L"Open folder(with explorer)");
354     AppendMenuW(hMenu, MF_ENABLED | MF_STRING | 0, 3, L"Send path to clipboard");
355     int result = TrackPopupMenu(hMenu, TPM_RETURNCMD, pointer_pos->x, pointer_pos->y, 0 , hWnd, NULL);
356     DestroyMenu(hMenu);
357     switch (result) {
358     case 1: {
359     // �A�v�����J��
360     const char *editor = pts->ViewlogEditor;
361     openFileWithApplication(path, editor, UILanguageFile);
362     break;
363     }
364     case 2: {
365     // �t�H���_���J�����A�t�@�C�����I������
366     openDirectoryWithExplorer(path, UILanguageFile);
367     break;
368     }
369     case 3: {
370     // �N���b�v�{�[�h�����������M
371     CBSetTextW(hWnd, path, 0);
372     break;
373     }
374     default:
375     break;
376     }
377     }
378    
379     static wchar_t *GetCygtermIni(const SetupList *list, const TTTSet *pts)
380     {
381     wchar_t *cygterm_ini;
382     aswprintf(&cygterm_ini, L"%s\\cygterm.cfg", pts->HomeDirW);
383     if (list->data_ptr != 0) {
384     wchar_t *virtual_store_path;
385     BOOL ret = convertVirtualStoreW(cygterm_ini, &virtual_store_path);
386     free(cygterm_ini);
387     if (ret) {
388     return virtual_store_path;
389     } else {
390     return NULL;
391     }
392     }
393     return cygterm_ini;
394     }
395    
396     static wchar_t *GetTTXSSHKwnownHostFile(const SetupList *list, const TTTSet *)
397     {
398     HMODULE h = GetModuleHandle("ttxssh.dll");
399     if (h == NULL) {
400     return NULL;
401     }
402    
403     size_t (CALLBACK *func)(wchar_t *, size_t) = NULL;
404     void **pfunc = (void **)&func;
405     *pfunc = (void *)GetProcAddress(h, "TTXReadKnownHostsFile");
406     if (func == NULL) {
407     return NULL;
408     }
409    
410     size_t size = func(NULL, 0);
411     if (size == 0) {
412     return NULL;
413     }
414    
415     wchar_t *temp = (wchar_t *)malloc(sizeof(wchar_t) * size);
416     func(temp, size);
417     assert(!IsRelativePathW(temp));
418    
419     if (list->data_ptr != 0) {
420     wchar_t *virtual_store_path;
421     BOOL ret = convertVirtualStoreW(temp, &virtual_store_path);
422     if (ret) {
423     return virtual_store_path;
424     } else {
425     return NULL;
426     }
427     }
428    
429     return temp;
430     }
431    
432     /**
433     * Virtaul Store�����p�X������
434     */
435     static wchar_t *GetVirtualStorePath(const SetupList *list, const TTTSet *)
436     {
437     const wchar_t *path = (wchar_t *)list->data_ptr;
438     wchar_t *virtual_store_path;
439     BOOL ret = convertVirtualStoreW(path, &virtual_store_path);
440     if (ret) {
441     return virtual_store_path;
442     } else {
443     // virtual store���g�p������������
444     return NULL;
445     }
446     }
447    
448     /**
449     * Susie plug-in �p�X
450     */
451     static wchar_t *GetSusiePluginPath(const SetupList *, const TTTSet *pts)
452     {
453     const char *spi_path = pts->EtermLookfeel.BGSPIPath;
454     wchar_t *path;
455     aswprintf(&path, L"%s\\%hs", pts->ExeDirW, spi_path);
456     return path;
457     }
458    
459     /**
460     * Susie plug-in �p�X
461     */
462     static wchar_t *GetCurrentPath(const SetupList *, const TTTSet *)
463     {
464     wchar_t *path;
465     hGetCurrentDirectoryW(&path);
466     return path;
467     }
468    
469 zmatsuo 9339 static INT_PTR CALLBACK OnSetupDirectoryDlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp)
470     {
471     static const DlgTextInfo TextInfos[] = {
472     { 0, "DLG_SETUPDIR_TITLE" },
473     { IDC_INI_SETUPDIR_GROUP, "DLG_SETUPDIR_INIFILE" },
474     { IDC_KEYCNF_SETUPDIR_GROUP, "DLG_SETUPDIR_KEYBOARDFILE" },
475     { IDC_CYGTERM_SETUPDIR_GROUP, "DLG_SETUPDIR_CYGTERMFILE" },
476     { IDC_SSH_SETUPDIR_GROUP, "DLG_SETUPDIR_KNOWNHOSTSFILE" },
477     };
478 zmatsuo 9340 TTTSet *pts = (TTTSet *)GetWindowLongPtr(hDlgWnd, DWLP_USER);
479     wchar_t *tmpbufW;
480 zmatsuo 9339 HWND hWnd;
481    
482     switch (msg) {
483 zmatsuo 9340 case WM_INITDIALOG: {
484     BOOL ret;
485     pts = (TTTSet *)lp;
486     SetWindowLongPtr(hDlgWnd, DWLP_USER, (LONG_PTR)pts);
487    
488 zmatsuo 9339 // I18N
489 zmatsuo 9359 SetDlgTextsW(hDlgWnd, TextInfos, _countof(TextInfos), pts->UILanguageFileW);
490 zmatsuo 9339
491     // �����t�@�C��(teraterm.ini)���p�X�����������B
492     /// (1)
493 zmatsuo 9340 SetDlgItemTextW(hDlgWnd, IDC_INI_SETUPDIR_EDIT, pts->SetupFNameW);
494 zmatsuo 9339 /// (2) Virutal Store��������
495 zmatsuo 9340 wchar_t *vs;
496     ret = convertVirtualStoreW(pts->SetupFNameW, &vs);
497     hWnd = GetDlgItem(hDlgWnd, IDC_INI_SETUPDIR_STATIC_VSTORE);
498     EnableWindow(hWnd, ret);
499     hWnd = GetDlgItem(hDlgWnd, IDC_INI_SETUPDIR_EDIT_VSTORE);
500     EnableWindow(hWnd, ret);
501 zmatsuo 9339 if (ret) {
502 zmatsuo 9340 SetDlgItemTextW(hDlgWnd, IDC_INI_SETUPDIR_EDIT_VSTORE, vs);
503     free(vs);
504 zmatsuo 9339 }
505     else {
506 zmatsuo 9340 SetDlgItemTextA(hDlgWnd, IDC_INI_SETUPDIR_EDIT_VSTORE, "");
507 zmatsuo 9339 }
508    
509     // �����t�@�C��(KEYBOARD.CNF)���p�X�����������B
510     /// (1)
511 zmatsuo 9340 SetDlgItemTextW(hDlgWnd, IDC_KEYCNF_SETUPDIR_EDIT, pts->KeyCnfFNW);
512 zmatsuo 9339 /// (2) Virutal Store��������
513 zmatsuo 9340 ret = convertVirtualStoreW(pts->KeyCnfFNW, &vs);
514     hWnd = GetDlgItem(hDlgWnd, IDC_KEYCNF_SETUPDIR_STATIC_VSTORE);
515     EnableWindow(hWnd, ret);
516     hWnd = GetDlgItem(hDlgWnd, IDC_KEYCNF_SETUPDIR_EDIT_VSTORE);
517     EnableWindow(hWnd, ret);
518 zmatsuo 9339 if (ret) {
519 zmatsuo 9340 SetDlgItemTextW(hDlgWnd, IDC_KEYCNF_SETUPDIR_EDIT_VSTORE, vs);
520     free(vs);
521 zmatsuo 9339 }
522     else {
523 zmatsuo 9340 SetDlgItemTextA(hDlgWnd, IDC_KEYCNF_SETUPDIR_EDIT_VSTORE, "");
524 zmatsuo 9339 }
525    
526     // cygterm.cfg �� ttermpro.exe �z�������u�����B
527     /// (1)
528 zmatsuo 9340 aswprintf(&tmpbufW, L"%s\\cygterm.cfg", pts->HomeDirW);
529     SetDlgItemTextW(hDlgWnd, IDC_CYGTERM_SETUPDIR_EDIT, tmpbufW);
530 zmatsuo 9339 /// (2) Virutal Store��������
531 zmatsuo 9340 ret = convertVirtualStoreW(tmpbufW, &vs);
532     free(tmpbufW);
533     hWnd = GetDlgItem(hDlgWnd, IDC_CYGTERM_SETUPDIR_STATIC_VSTORE);
534     EnableWindow(hWnd, ret);
535     hWnd = GetDlgItem(hDlgWnd, IDC_CYGTERM_SETUPDIR_EDIT_VSTORE);
536     EnableWindow(hWnd, ret);
537 zmatsuo 9339 if (ret) {
538 zmatsuo 9340 SetDlgItemTextW(hDlgWnd, IDC_CYGTERM_SETUPDIR_EDIT_VSTORE, vs);
539     free(vs);
540 zmatsuo 9339 }
541     else {
542 zmatsuo 9340 SetDlgItemTextA(hDlgWnd, IDC_CYGTERM_SETUPDIR_EDIT_VSTORE, "");
543 zmatsuo 9339 }
544    
545     // ssh_known_hosts
546 zmatsuo 9340 {
547 zmatsuo 9503 HMODULE h = GetModuleHandle("ttxssh.dll");
548     if (h != NULL) {
549     size_t (CALLBACK *func)(wchar_t *, size_t) = NULL;
550     void **pfunc = (void **)&func;
551     *pfunc = (void *)GetProcAddress(h, "TTXReadKnownHostsFile");
552 zmatsuo 9339 if (func) {
553 zmatsuo 9503 size_t size = func(NULL, 0);
554     if (size != 0) {
555     wchar_t *temp = (wchar_t *)malloc(sizeof(wchar_t) * size);
556     func(temp, size);
557     assert(!IsRelativePathW(temp));
558 zmatsuo 9339
559 zmatsuo 9503 SetDlgItemTextW(hDlgWnd, IDC_SSH_SETUPDIR_EDIT, temp);
560 zmatsuo 9339
561     /// (2) Virutal Store��������
562 zmatsuo 9503 ret = convertVirtualStoreW(temp, &vs);
563 zmatsuo 9340 hWnd = GetDlgItem(hDlgWnd, IDC_SSH_SETUPDIR_STATIC_VSTORE);
564     EnableWindow(hWnd, ret);
565     hWnd = GetDlgItem(hDlgWnd, IDC_SSH_SETUPDIR_EDIT_VSTORE);
566     EnableWindow(hWnd, ret);
567 zmatsuo 9339 if (ret) {
568 zmatsuo 9340 SetDlgItemTextW(hDlgWnd, IDC_SSH_SETUPDIR_EDIT_VSTORE, vs);
569     free(vs);
570 zmatsuo 9339 }
571     else {
572 zmatsuo 9340 SetDlgItemTextA(hDlgWnd, IDC_SSH_SETUPDIR_EDIT_VSTORE, "");
573 zmatsuo 9339 }
574 zmatsuo 9503 free(temp);
575 zmatsuo 9339 }
576     }
577     }
578     else {
579     hWnd = GetDlgItem(hDlgWnd, IDC_SSH_SETUPDIR_EDIT);
580     EnableWindow(hWnd, FALSE);
581 zmatsuo 9340 SetDlgItemTextA(hDlgWnd, IDC_SSH_SETUPDIR_EDIT, "");
582 zmatsuo 9339 hWnd = GetDlgItem(hDlgWnd, IDC_SSH_SETUPDIR_BUTTON);
583     EnableWindow(hWnd, FALSE);
584     hWnd = GetDlgItem(hDlgWnd, IDC_SSH_SETUPDIR_BUTTON_FILE);
585     EnableWindow(hWnd, FALSE);
586     hWnd = GetDlgItem(hDlgWnd, IDC_SSH_SETUPDIR_STATIC_VSTORE);
587     EnableWindow(hWnd, FALSE);
588     hWnd = GetDlgItem(hDlgWnd, IDC_SSH_SETUPDIR_EDIT_VSTORE);
589     EnableWindow(hWnd, FALSE);
590 zmatsuo 9340 SetDlgItemTextA(hDlgWnd, IDC_SSH_SETUPDIR_EDIT_VSTORE, "");
591 zmatsuo 9339 }
592     }
593    
594 zmatsuo 9916 /////////////////////////////////////////////////////////////
595     HWND hWndList = GetDlgItem(hDlgWnd, IDC_SETUP_DIR_LIST);
596     ListView_SetExtendedListViewStyleEx(hWndList, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);
597    
598     LV_COLUMNA lvcol;
599     lvcol.mask = LVCF_TEXT | LVCF_SUBITEM;
600     lvcol.pszText = (LPSTR)"name";
601     lvcol.iSubItem = 0;
602     //ListView_InsertColumn(hWndList, 0, &lvcol);
603     SendMessage(hWndList, LVM_INSERTCOLUMNA, 0, (LPARAM)&lvcol);
604    
605     lvcol.pszText = (LPSTR)"path/file";
606     lvcol.iSubItem = 1;
607     //ListView_InsertColumn(hWndList, 1, &lvcol);
608     SendMessage(hWndList, LVM_INSERTCOLUMNA, 1, (LPARAM)&lvcol);
609    
610     // ��������
611     static const SetupList setup_list[] = {
612     { "DLG_SETUPDIR_INIFILE", L"Tera Term Configuration File",
613     LIST_PARAM_STR, pts->SetupFNameW, },
614     { NULL, L" Virtual Store",
615     LIST_PARAM_FUNC, (void *)GetVirtualStorePath, pts->SetupFNameW },
616     { "DLG_SETUPDIR_KEYBOARDFILE", L"Keyboard Configuration File",
617     LIST_PARAM_STR, pts->KeyCnfFNW },
618     { NULL, L" Virtual Store",
619     LIST_PARAM_FUNC, (void*)GetVirtualStorePath, pts->KeyCnfFNW },
620     { "DLG_SETUPDIR_CYGTERMFILE", L"CygTerm Configuration File",
621     LIST_PARAM_FUNC, (void*)GetCygtermIni, (void *)0 },
622     { NULL, L" Virtual Store",
623     LIST_PARAM_FUNC, (void*)GetCygtermIni, (void *)1 },
624     { "DLG_SETUPDIR_KNOWNHOSTSFILE", L"SSH known_hosts File",
625     LIST_PARAM_FUNC, (void*)GetTTXSSHKwnownHostFile, (void *)0 },
626     { NULL, L" Virtual Store",
627     LIST_PARAM_FUNC, (void*)GetTTXSSHKwnownHostFile, (void *)1 },
628     { NULL, L"CurrentDirectry",
629     LIST_PARAM_FUNC, (void*)GetCurrentPath },
630     { NULL, L"HomeDir",
631     LIST_PARAM_STR, pts->HomeDirW },
632     { NULL, L"ExeDir",
633     LIST_PARAM_STR, pts->ExeDirW },
634     { NULL, L"LogDir",
635     LIST_PARAM_STR, pts->LogDirW },
636     { NULL, L"LogDefaultPathW",
637     LIST_PARAM_STR, pts->LogDefaultPathW },
638     { NULL, L"Download",
639     LIST_PARAM_STR, pts->FileDirW },
640     { NULL, L"Susie Plugin Path",
641     LIST_PARAM_FUNC, (void*)GetSusiePluginPath },
642     { NULL, L"UI language file",
643     LIST_PARAM_STR, pts->UILanguageFileW },
644     };
645    
646     int y = 0;
647     for (const SetupList *list = &setup_list[0]; list != &setup_list[_countof(setup_list)]; list++) {
648    
649     const SetupListParam param = list->param;
650     wchar_t *s;
651     if (param & LIST_PARAM_STR) {
652     // �����������|�C���^
653     s = (wchar_t *)list->param_ptr;
654     } else if (param & LIST_PARAM_FUNC) {
655     // ����������������������
656     typedef wchar_t *(*func_t)(const SetupList *list, TTTSet *pts);
657     func_t func = (func_t)list->param_ptr;
658     s = func(list, pts);
659     } else {
660     assert("bad list?");
661     s = NULL;
662     }
663     if (s == NULL) {
664     // �\���s�v
665     continue;
666     }
667    
668     const char *key = list->key;
669     const wchar_t *def_text = list->def_text;
670     wchar_t *text;
671     GetI18nStrWW("Tera Term", key, def_text, pts->UILanguageFileW, &text);
672    
673     LVITEMW item;
674     item.mask = LVIF_TEXT;
675     item.iItem = y;
676     item.iSubItem = 0;
677     item.pszText = text;
678     SendMessage(hWndList, LVM_INSERTITEMW, 0, (LPARAM)&item);
679     free(text);
680    
681     item.mask = LVIF_TEXT;
682     item.iItem = y;
683     item.iSubItem = 1;
684     item.pszText = s;
685     SendMessage(hWndList, LVM_SETITEMW, 0, (LPARAM)&item);
686    
687     y++;
688    
689     if (param & LIST_PARAM_FUNC) {
690     // �\���p�������������������J��
691     free(s);
692     }
693     }
694    
695     // ��������
696     for (int i = 0; i < 2; i++) {
697     ListView_SetColumnWidth(hWndList, i, LVSCW_AUTOSIZE);
698     }
699    
700 zmatsuo 9341 CenterWindow(hDlgWnd, GetParent(hDlgWnd));
701    
702 zmatsuo 9339 return TRUE;
703 zmatsuo 9340 }
704 zmatsuo 9339
705 zmatsuo 9340 case WM_COMMAND: {
706     BOOL button_pressed = FALSE;
707     BOOL open_dir = FALSE;
708     int edit;
709     int edit_vstore;
710 zmatsuo 9339 switch (LOWORD(wp)) {
711     case IDC_INI_SETUPDIR_BUTTON | (BN_CLICKED << 16) :
712 zmatsuo 9340 edit = IDC_INI_SETUPDIR_EDIT;
713     edit_vstore = IDC_INI_SETUPDIR_EDIT_VSTORE;
714 zmatsuo 9339 open_dir = TRUE;
715 zmatsuo 9340 button_pressed = TRUE;
716 zmatsuo 9339 break;
717 zmatsuo 9340
718 zmatsuo 9339 case IDC_INI_SETUPDIR_BUTTON_FILE | (BN_CLICKED << 16) :
719 zmatsuo 9340 edit = IDC_INI_SETUPDIR_EDIT;
720     edit_vstore = IDC_INI_SETUPDIR_EDIT_VSTORE;
721 zmatsuo 9339 open_dir = FALSE;
722 zmatsuo 9340 button_pressed = TRUE;
723 zmatsuo 9339 break;
724    
725     case IDC_KEYCNF_SETUPDIR_BUTTON | (BN_CLICKED << 16) :
726 zmatsuo 9340 edit = IDC_KEYCNF_SETUPDIR_EDIT;
727     edit_vstore = IDC_KEYCNF_SETUPDIR_EDIT_VSTORE;
728 zmatsuo 9339 open_dir = TRUE;
729 zmatsuo 9340 button_pressed = TRUE;
730 zmatsuo 9339 break;
731 zmatsuo 9340
732 zmatsuo 9339 case IDC_KEYCNF_SETUPDIR_BUTTON_FILE | (BN_CLICKED << 16) :
733 zmatsuo 9340 edit = IDC_KEYCNF_SETUPDIR_EDIT;
734     edit_vstore = IDC_KEYCNF_SETUPDIR_EDIT_VSTORE;
735 zmatsuo 9339 open_dir = FALSE;
736 zmatsuo 9340 button_pressed = TRUE;
737 zmatsuo 9339 break;
738    
739     case IDC_CYGTERM_SETUPDIR_BUTTON | (BN_CLICKED << 16) :
740 zmatsuo 9340 edit = IDC_CYGTERM_SETUPDIR_EDIT;
741     edit_vstore = IDC_CYGTERM_SETUPDIR_EDIT_VSTORE;
742 zmatsuo 9339 open_dir = TRUE;
743 zmatsuo 9340 button_pressed = TRUE;
744 zmatsuo 9339 break;
745 zmatsuo 9340
746 zmatsuo 9339 case IDC_CYGTERM_SETUPDIR_BUTTON_FILE | (BN_CLICKED << 16) :
747 zmatsuo 9340 edit = IDC_CYGTERM_SETUPDIR_EDIT;
748     edit_vstore = IDC_CYGTERM_SETUPDIR_EDIT_VSTORE;
749 zmatsuo 9339 open_dir = FALSE;
750 zmatsuo 9340 button_pressed = TRUE;
751 zmatsuo 9339 break;
752    
753     case IDC_SSH_SETUPDIR_BUTTON | (BN_CLICKED << 16) :
754 zmatsuo 9340 edit = IDC_SSH_SETUPDIR_EDIT;
755     edit_vstore = IDC_SSH_SETUPDIR_EDIT_VSTORE;
756 zmatsuo 9339 open_dir = TRUE;
757 zmatsuo 9340 button_pressed = TRUE;
758 zmatsuo 9339 break;
759 zmatsuo 9340
760 zmatsuo 9339 case IDC_SSH_SETUPDIR_BUTTON_FILE | (BN_CLICKED << 16) :
761 zmatsuo 9340 edit = IDC_SSH_SETUPDIR_EDIT;
762     edit_vstore = IDC_SSH_SETUPDIR_EDIT_VSTORE;
763 zmatsuo 9339 open_dir = FALSE;
764 zmatsuo 9340 button_pressed = TRUE;
765 zmatsuo 9339 break;
766    
767 zmatsuo 9412 case IDHELP:
768     OpenHelp(HH_HELP_CONTEXT, HlpMenuSetupDir, pts->UILanguageFile);
769     break;
770    
771     case IDOK:
772     TTEndDialog(hDlgWnd, IDOK);
773     return TRUE;
774     break;
775    
776 zmatsuo 9339 case IDCANCEL:
777     TTEndDialog(hDlgWnd, IDCANCEL);
778     return TRUE;
779     break;
780    
781     default:
782     return FALSE;
783     }
784    
785     if (button_pressed) {
786 zmatsuo 9543 wchar_t *filename;
787 zmatsuo 9340 if (!IsWindowEnabled(GetDlgItem(hDlgWnd, edit_vstore))) {
788 zmatsuo 9543 hGetWindowTextW(GetDlgItem(hDlgWnd, edit), &filename);
789 zmatsuo 9340 } else {
790 zmatsuo 9543 hGetWindowTextW(GetDlgItem(hDlgWnd, edit_vstore), &filename);
791 zmatsuo 9340 }
792 zmatsuo 9339
793 zmatsuo 9543 const wchar_t *UILanguageFile = pts->UILanguageFileW;
794 zmatsuo 9340 if (open_dir) {
795     // �t�H���_���J�����A�t�@�C�����I������
796 zmatsuo 9543 openDirectoryWithExplorer(filename, UILanguageFile);
797 zmatsuo 9340 }
798     else {
799 zmatsuo 9543 const char *editor = pts->ViewlogEditor;
800     openFileWithApplication(filename, editor, UILanguageFile);
801 zmatsuo 9340 }
802 zmatsuo 9339
803 zmatsuo 9543 free(filename);
804 zmatsuo 9339 return TRUE;
805     }
806     return FALSE;
807 zmatsuo 9340 }
808 zmatsuo 9339 case WM_CLOSE:
809     TTEndDialog(hDlgWnd, 0);
810     return TRUE;
811    
812 zmatsuo 9916 case WM_NOTIFY: {
813     NMHDR *nmhdr = (NMHDR *)lp;
814     if (nmhdr->idFrom == IDC_SETUP_DIR_LIST) {
815     NMLISTVIEW *nmlist = (NMLISTVIEW *)lp;
816     switch (nmlist->hdr.code) {
817     // case NM_CLICK:
818     case NM_RCLICK: {
819     POINT pointer_pos;
820     GetCursorPos(&pointer_pos);
821     LVHITTESTINFO ht = {};
822     ht.pt = pointer_pos;
823     ScreenToClient(nmlist->hdr.hwndFrom, &ht.pt);
824     ListView_HitTest(nmlist->hdr.hwndFrom, &ht);
825     if (ht.flags & LVHT_ONITEM) {
826     int hit_item = ht.iItem;
827    
828     wchar_t path[MAX_PATH];
829     LV_ITEMW item;
830     item.mask = TVIF_TEXT;
831     item.iItem = hit_item;
832     item.iSubItem = 1;
833     item.pszText = path;
834     item.cchTextMax = _countof(path);
835     SendMessageW(nmlist->hdr.hwndFrom, LVM_GETITEMW, 0, (LPARAM)&item);
836    
837     PopupAndExec(nmlist->hdr.hwndFrom, &pointer_pos, path, pts);
838     }
839     break;
840     }
841     }
842     }
843     break;
844     }
845 zmatsuo 9339 default:
846     return FALSE;
847     }
848     return TRUE;
849     }
850    
851 zmatsuo 9340 void SetupDirectoryDialog(HINSTANCE hInst, HWND hWnd, TTTSet *pts)
852 zmatsuo 9339 {
853 zmatsuo 9340 TTDialogBoxParam(hInst, MAKEINTRESOURCE(IDD_SETUP_DIR_DIALOG),
854     hWnd, OnSetupDirectoryDlgProc, (LPARAM)pts);
855 zmatsuo 9339 }

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