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 10134 - (hide annotations) (download) (as text)
Tue Aug 9 15:11:40 2022 UTC (20 months ago) by zmatsuo
Original Path: trunk/teraterm/teraterm/setupdirdlg.cpp
File MIME type: text/x-c++src
File size: 18669 byte(s)
Theme Editor Dialog を追加

- Theme Editor Dialog の追加
  - 背景画像、文字色の修正を行うダイアログ
  - teraterm/themedlg.*
  - doc/ja/html/menu/setup-additional-visual-theme.html(ヘルプ)
- [その他の設定]-[表示タブ]変更(teraterm/addsetting.cpp)
  - eterm関連を無効化(非表示)
  - 起動時テーマファイル指定を追加
  - テーマエディタ起動ボタンを追加
- tttset 変更
  - eterm_lookfeel_t.BGEnable の内容を変更
    - 0/1/2 = theme使用しない/固定テーマ/ランダムテーマ
  - 削除
    - BGImageFilePath
    - BGImgBrightness
- vtdisp.c
  - テーマ(色、背景)を操作するAPIを追加
  - 自動でテーマを読み込まないようにした
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 10012 #include "tipwin2.h"
60 zmatsuo 9339
61     #include "setupdirdlg.h"
62    
63 zmatsuo 9340 // Virtual Store���L���������������������������B
64 zmatsuo 9339 //
65 zmatsuo 9340 // [Windows 95-XP]
66     // return FALSE (always)
67     //
68     // [Windows Vista-10]
69     // return TRUE: Virtual Store Enabled
70     // FALSE: Virtual Store Disabled or Unknown
71     //
72     static BOOL GetVirtualStoreEnvironment(void)
73     {
74     #if _MSC_VER == 1400 // VSC2005(VC8.0)
75     typedef struct _TOKEN_ELEVATION {
76     DWORD TokenIsElevated;
77     } TOKEN_ELEVATION, *PTOKEN_ELEVATION;
78     int TokenElevation = 20;
79     #endif
80     BOOL ret = FALSE;
81     int flag = 0;
82     HANDLE hToken;
83     DWORD dwLength;
84     TOKEN_ELEVATION tokenElevation;
85     LONG lRet;
86     HKEY hKey;
87     char lpData[256];
88     DWORD dwDataSize;
89     DWORD dwType;
90     BYTE bValue;
91    
92     // Windows Vista���O�����������B
93     if (!IsWindowsVistaOrLater())
94     goto error;
95    
96     // UAC���L�����������B
97     // HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System��EnableLUA(DWORD�l)��0�������������f��������(0��UAC�����A1��UAC�L��)�B
98     flag = 0;
99 zmatsuo 9543 lRet = RegOpenKeyExA(HKEY_LOCAL_MACHINE,
100     "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System",
101     0, KEY_QUERY_VALUE, &hKey);
102 zmatsuo 9340 if (lRet == ERROR_SUCCESS) {
103     dwDataSize = sizeof(lpData) / sizeof(lpData[0]);
104 zmatsuo 9543 lRet = RegQueryValueExA(
105 zmatsuo 9340 hKey,
106 zmatsuo 9543 "EnableLUA",
107 zmatsuo 9340 0,
108     &dwType,
109     (LPBYTE)lpData,
110     &dwDataSize);
111     if (lRet == ERROR_SUCCESS) {
112     bValue = ((LPBYTE)lpData)[0];
113     if (bValue == 1)
114     // UAC���L���������AVirtual Store�������B
115     flag = 1;
116     }
117     RegCloseKey(hKey);
118     }
119     if (flag == 0)
120     goto error;
121    
122     // UAC���L�����A�v���Z�X�����������������i�����������B
123     flag = 0;
124     if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_DEFAULT, &hToken)) {
125     if (GetTokenInformation(hToken, (TOKEN_INFORMATION_CLASS)TokenElevation, &tokenElevation, sizeof(TOKEN_ELEVATION), &dwLength)) {
126     // (0�����i�����������A��0�����i��������)�B
127     if (tokenElevation.TokenIsElevated == 0) {
128     // �����������������������������AVirtual Store�������B
129     flag = 1;
130     }
131     }
132     CloseHandle(hToken);
133     }
134     if (flag == 0)
135     goto error;
136    
137     ret = TRUE;
138     return (ret);
139    
140     error:
141     return (ret);
142     }
143    
144     //
145 zmatsuo 9339 // �w�������A�v���P�[�V�������t�@�C�����J���B
146     //
147     // return TRUE: success
148     // FALSE: failure
149     //
150 zmatsuo 9543 static BOOL openFileWithApplication(const wchar_t *filename, const char *editor, const wchar_t *UILanguageFile)
151 zmatsuo 9339 {
152 zmatsuo 9340 wchar_t *commandW = NULL;
153 zmatsuo 9339 BOOL ret = FALSE;
154    
155 zmatsuo 9340 if (GetFileAttributesW(filename) == INVALID_FILE_ATTRIBUTES) {
156     // �t�@�C��������������
157     DWORD no = GetLastError();
158     static const TTMessageBoxInfoW info = {
159     "Tera Term",
160     "MSG_ERROR", L"ERROR",
161 zmatsuo 9342 "DLG_SETUPDIR_NOFILE_ERROR", L"File does not exist.(%d)",
162     MB_OK | MB_ICONWARNING
163     };
164 zmatsuo 9543 TTMessageBoxW(NULL, &info, UILanguageFile, no);
165 zmatsuo 9339
166     goto error;
167     }
168    
169 zmatsuo 9340 aswprintf(&commandW, L"%hs \"%s\"", editor, filename);
170 zmatsuo 9339
171 zmatsuo 9340 STARTUPINFOW si;
172     PROCESS_INFORMATION pi;
173 zmatsuo 9339 memset(&si, 0, sizeof(si));
174 zmatsuo 9340 GetStartupInfoW(&si);
175 zmatsuo 9339 memset(&pi, 0, sizeof(pi));
176    
177 zmatsuo 9340 if (CreateProcessW(NULL, commandW, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi) == 0) {
178     // �N�����s
179 zmatsuo 9339 DWORD no = GetLastError();
180 zmatsuo 9340 static const TTMessageBoxInfoW info = {
181     "Tera Term",
182     "MSG_ERROR", L"ERROR",
183 zmatsuo 9342 "DLG_SETUPDIR_OPENFILE_ERROR", L"Cannot open file.(%d)",
184     MB_OK | MB_ICONWARNING
185     };
186 zmatsuo 9543 TTMessageBoxW(NULL, &info, UILanguageFile, no);
187 zmatsuo 9340
188 zmatsuo 9339 goto error;
189 zmatsuo 9340 }
190     else {
191 zmatsuo 9339 CloseHandle(pi.hThread);
192     CloseHandle(pi.hProcess);
193     }
194    
195     ret = TRUE;
196    
197     error:;
198 zmatsuo 9340 free(commandW);
199    
200 zmatsuo 9339 return (ret);
201     }
202    
203 zmatsuo 9543 /**
204     * �G�N�X�v���[�����w���t�@�C�����t�H���_���J��
205     * �t�@�C�������������������t�@�C�����I�������������J��
206     * �t�@�C���������������������t�H���_���J��
207     *
208     * @param file �t�@�C��
209     * @retval TRUE: success
210     * @retval FALSE: failure
211     */
212     static BOOL openDirectoryWithExplorer(const wchar_t *file, const wchar_t *UILanguageFile)
213 zmatsuo 9339 {
214 zmatsuo 9340 BOOL ret;
215 zmatsuo 9339
216 zmatsuo 9543 DWORD attr = GetFileAttributesW(file);
217 zmatsuo 9340 if (attr == INVALID_FILE_ATTRIBUTES) {
218 zmatsuo 9543 // �t�@�C��������������, �f�B���N�g�����I�[�v������
219     wchar_t *dir = ExtractDirNameW(file);
220     attr = GetFileAttributesW(dir);
221     if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) {
222     // �t�H���_���J��
223     INT_PTR h = (INT_PTR)ShellExecuteW(NULL, L"open", L"explorer.exe", dir, NULL, SW_NORMAL);
224     ret = h > 32 ? TRUE : FALSE;
225     }
226     else {
227     // �t�@�C�����t�H���_������������
228     DWORD no = GetLastError();
229     static const TTMessageBoxInfoW info = {
230     "Tera Term",
231     "MSG_ERROR", L"ERROR",
232     "DLG_SETUPDIR_NOFILE_ERROR", L"File does not exist.(%d)",
233     MB_OK | MB_ICONWARNING
234     };
235     TTMessageBoxW(NULL, &info, UILanguageFile, no);
236     ret = FALSE;
237     }
238     free(dir);
239 zmatsuo 9340 } else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) {
240 zmatsuo 9543 // �w�������������t�H���_�������A�t�H���_���J��
241     INT_PTR h = (INT_PTR)ShellExecuteW(NULL, L"open", L"explorer.exe", file, NULL, SW_NORMAL);
242 zmatsuo 9340 ret = h > 32 ? TRUE : FALSE;
243     } else {
244     // �t�H���_���J�� + �t�@�C���I��
245     wchar_t *param;
246 zmatsuo 9543 aswprintf(&param, L"/select,%s", file);
247 zmatsuo 9340 INT_PTR h = (INT_PTR)ShellExecuteW(NULL, L"open", L"explorer.exe", param, NULL, SW_NORMAL);
248     free(param);
249     ret = h > 32 ? TRUE : FALSE;
250 zmatsuo 9339 }
251 zmatsuo 9340 return ret;
252 zmatsuo 9339 }
253    
254 zmatsuo 9340 /**
255     * �t���p�X�t�@�C������ Virtual Store�p�X�����������B
256     * @param[in] filename �����O���t�@�C����
257     * @param[out] vstore_filename Virtual Store���t�@�C����
258     * @retval TRUE ��������
259     * FALSE ��������������(Virtual Store������������������)
260     */
261     static BOOL convertVirtualStoreW(const wchar_t *filename, wchar_t **vstore_filename)
262 zmatsuo 9339 {
263 zmatsuo 9340 wchar_t *path = ExtractDirNameW(filename);
264     wchar_t *file = ExtractFileNameW(filename);
265    
266     // �s�v���h���C�u���^�[�����������B
267     // �h���C�u���^�[���������������������_�������B(1��������?)
268     wchar_t *path_nodrive = wcsstr(path, L":\\");
269     if (path_nodrive == NULL) {
270     // �t���p�X��������, VS���l������������ok
271     free(path);
272     free(file);
273     return FALSE;
274 zmatsuo 9339 }
275 zmatsuo 9340 path_nodrive++;
276 zmatsuo 9339
277     BOOL ret = FALSE;
278 zmatsuo 9340 static const wchar_t* virstore_env[] = {
279     L"ProgramFiles",
280     L"ProgramData",
281     L"SystemRoot",
282 zmatsuo 9339 NULL
283     };
284 zmatsuo 9340 const wchar_t** p = virstore_env;
285 zmatsuo 9339
286 zmatsuo 9340 if (GetVirtualStoreEnvironment() == FALSE)
287 zmatsuo 9339 goto error;
288    
289     // Virtual Store�����������t�H���_���B
290     while (*p) {
291 zmatsuo 9340 const wchar_t *s = _wgetenv(*p);
292     if (s != NULL && wcsstr(path, s) != NULL) {
293 zmatsuo 9339 break;
294     }
295     p++;
296     }
297     if (*p == NULL)
298     goto error;
299    
300    
301     // Virtual Store�p�X�������B
302 zmatsuo 9421 wchar_t *local_appdata;
303     _SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &local_appdata);
304     wchar_t *vs_file;
305 zmatsuo 9503 aswprintf(&vs_file, L"%s\\VirtualStore%s\\%s", local_appdata, path_nodrive, file);
306 zmatsuo 9421 free(local_appdata);
307 zmatsuo 9339
308     // �������AVirtual Store���t�@�C�������������������������B
309 zmatsuo 9340 if (GetFileAttributesW(vs_file) == INVALID_FILE_ATTRIBUTES) {
310     free(vs_file);
311 zmatsuo 9339 goto error;
312     }
313    
314 zmatsuo 9340 *vstore_filename = vs_file;
315 zmatsuo 9339
316     ret = TRUE;
317 zmatsuo 9340 goto epilogue;
318 zmatsuo 9339
319     error:
320 zmatsuo 9340 *vstore_filename = NULL;
321     ret = FALSE;
322     epilogue:
323     free(path);
324     free(file);
325     return ret;
326 zmatsuo 9339 }
327    
328 zmatsuo 9916 /**
329     * ���X�g���`�p�\����
330     */
331     typedef enum {
332     LIST_PARAM_STR = 1, // ������
333     LIST_PARAM_FUNC = 2, // ����
334     } SetupListParam;
335     typedef struct {
336     const char *key; // �e�L�X�g���L�[
337     const wchar_t *def_text; // �f�t�H���g�e�L�X�g
338     SetupListParam param; // param_ptr �����e������
339     void *param_ptr; // param�������l
340     void *data_ptr; // ���������g�p�����f�[�^
341     } SetupList;
342    
343     /**
344     * ���j���[���o�����I�����������������s����
345     */
346     static void PopupAndExec(HWND hWnd, const POINT *pointer_pos, const wchar_t *path, const TTTSet *pts)
347     {
348     const wchar_t *UILanguageFile = pts->UILanguageFileW;
349     const DWORD file_stat = GetFileAttributesW(path);
350     const BOOL dir = (file_stat & FILE_ATTRIBUTE_DIRECTORY) != 0 ? TRUE : FALSE;
351    
352     HMENU hMenu= CreatePopupMenu();
353     AppendMenuW(hMenu, (dir ? MF_DISABLED : MF_ENABLED) | MF_STRING | 0, 1, L"&Open file");
354     AppendMenuW(hMenu, MF_ENABLED | MF_STRING | 0, 2, L"Open folder(with explorer)");
355     AppendMenuW(hMenu, MF_ENABLED | MF_STRING | 0, 3, L"Send path to clipboard");
356     int result = TrackPopupMenu(hMenu, TPM_RETURNCMD, pointer_pos->x, pointer_pos->y, 0 , hWnd, NULL);
357     DestroyMenu(hMenu);
358     switch (result) {
359     case 1: {
360     // �A�v�����J��
361     const char *editor = pts->ViewlogEditor;
362     openFileWithApplication(path, editor, UILanguageFile);
363     break;
364     }
365     case 2: {
366     // �t�H���_���J�����A�t�@�C�����I������
367     openDirectoryWithExplorer(path, UILanguageFile);
368     break;
369     }
370     case 3: {
371     // �N���b�v�{�[�h�����������M
372     CBSetTextW(hWnd, path, 0);
373     break;
374     }
375     default:
376     break;
377     }
378     }
379    
380     static wchar_t *GetCygtermIni(const SetupList *list, const TTTSet *pts)
381     {
382     wchar_t *cygterm_ini;
383     aswprintf(&cygterm_ini, L"%s\\cygterm.cfg", pts->HomeDirW);
384     if (list->data_ptr != 0) {
385     wchar_t *virtual_store_path;
386     BOOL ret = convertVirtualStoreW(cygterm_ini, &virtual_store_path);
387     free(cygterm_ini);
388     if (ret) {
389     return virtual_store_path;
390     } else {
391     return NULL;
392     }
393     }
394     return cygterm_ini;
395     }
396    
397     static wchar_t *GetTTXSSHKwnownHostFile(const SetupList *list, const TTTSet *)
398     {
399     HMODULE h = GetModuleHandle("ttxssh.dll");
400     if (h == NULL) {
401     return NULL;
402     }
403    
404     size_t (CALLBACK *func)(wchar_t *, size_t) = NULL;
405     void **pfunc = (void **)&func;
406     *pfunc = (void *)GetProcAddress(h, "TTXReadKnownHostsFile");
407     if (func == NULL) {
408     return NULL;
409     }
410    
411     size_t size = func(NULL, 0);
412     if (size == 0) {
413     return NULL;
414     }
415    
416     wchar_t *temp = (wchar_t *)malloc(sizeof(wchar_t) * size);
417     func(temp, size);
418     assert(!IsRelativePathW(temp));
419    
420     if (list->data_ptr != 0) {
421     wchar_t *virtual_store_path;
422     BOOL ret = convertVirtualStoreW(temp, &virtual_store_path);
423     if (ret) {
424     return virtual_store_path;
425     } else {
426     return NULL;
427     }
428     }
429    
430     return temp;
431     }
432    
433     /**
434     * Virtaul Store�����p�X������
435     */
436     static wchar_t *GetVirtualStorePath(const SetupList *list, const TTTSet *)
437     {
438     const wchar_t *path = (wchar_t *)list->data_ptr;
439     wchar_t *virtual_store_path;
440     BOOL ret = convertVirtualStoreW(path, &virtual_store_path);
441     if (ret) {
442     return virtual_store_path;
443     } else {
444     // virtual store���g�p������������
445     return NULL;
446     }
447     }
448    
449     /**
450     * Susie plug-in �p�X
451     */
452     static wchar_t *GetSusiePluginPath(const SetupList *, const TTTSet *pts)
453     {
454     wchar_t *path;
455 zmatsuo 10134 aswprintf(&path, L"%s\\%s", pts->ExeDirW, pts->EtermLookfeel.BGSPIPathW);
456 zmatsuo 9916 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 10012 typedef struct {
470     TComVar *pcv;
471     TipWin2 *tipwin;
472     } dlg_data_t;
473    
474 zmatsuo 9339 static INT_PTR CALLBACK OnSetupDirectoryDlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp)
475     {
476     static const DlgTextInfo TextInfos[] = {
477     { 0, "DLG_SETUPDIR_TITLE" },
478     };
479 zmatsuo 10012 dlg_data_t *dlg_data = (dlg_data_t *)GetWindowLongPtr(hDlgWnd, DWLP_USER);
480     TComVar *pcv = (dlg_data == NULL) ? NULL : dlg_data->pcv;
481     TTTSet *pts = (pcv == NULL) ? NULL : pcv->ts;
482 zmatsuo 9339
483     switch (msg) {
484 zmatsuo 9340 case WM_INITDIALOG: {
485 zmatsuo 10012 dlg_data = (dlg_data_t *)lp;
486     pcv = dlg_data->pcv;
487 nmaya 10009 pts = pcv->ts;
488 zmatsuo 10012 SetWindowLongPtr(hDlgWnd, DWLP_USER, (LONG_PTR)dlg_data);
489 zmatsuo 9340
490 zmatsuo 9339 // I18N
491 zmatsuo 9359 SetDlgTextsW(hDlgWnd, TextInfos, _countof(TextInfos), pts->UILanguageFileW);
492 zmatsuo 9339
493 zmatsuo 9916 HWND hWndList = GetDlgItem(hDlgWnd, IDC_SETUP_DIR_LIST);
494     ListView_SetExtendedListViewStyleEx(hWndList, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);
495    
496     LV_COLUMNA lvcol;
497     lvcol.mask = LVCF_TEXT | LVCF_SUBITEM;
498     lvcol.pszText = (LPSTR)"name";
499     lvcol.iSubItem = 0;
500     //ListView_InsertColumn(hWndList, 0, &lvcol);
501     SendMessage(hWndList, LVM_INSERTCOLUMNA, 0, (LPARAM)&lvcol);
502    
503     lvcol.pszText = (LPSTR)"path/file";
504     lvcol.iSubItem = 1;
505     //ListView_InsertColumn(hWndList, 1, &lvcol);
506     SendMessage(hWndList, LVM_INSERTCOLUMNA, 1, (LPARAM)&lvcol);
507    
508     // ��������
509     static const SetupList setup_list[] = {
510     { "DLG_SETUPDIR_INIFILE", L"Tera Term Configuration File",
511     LIST_PARAM_STR, pts->SetupFNameW, },
512     { NULL, L" Virtual Store",
513     LIST_PARAM_FUNC, (void *)GetVirtualStorePath, pts->SetupFNameW },
514     { "DLG_SETUPDIR_KEYBOARDFILE", L"Keyboard Configuration File",
515     LIST_PARAM_STR, pts->KeyCnfFNW },
516     { NULL, L" Virtual Store",
517     LIST_PARAM_FUNC, (void*)GetVirtualStorePath, pts->KeyCnfFNW },
518     { "DLG_SETUPDIR_CYGTERMFILE", L"CygTerm Configuration File",
519     LIST_PARAM_FUNC, (void*)GetCygtermIni, (void *)0 },
520     { NULL, L" Virtual Store",
521     LIST_PARAM_FUNC, (void*)GetCygtermIni, (void *)1 },
522     { "DLG_SETUPDIR_KNOWNHOSTSFILE", L"SSH known_hosts File",
523     LIST_PARAM_FUNC, (void*)GetTTXSSHKwnownHostFile, (void *)0 },
524     { NULL, L" Virtual Store",
525     LIST_PARAM_FUNC, (void*)GetTTXSSHKwnownHostFile, (void *)1 },
526     { NULL, L"CurrentDirectry",
527     LIST_PARAM_FUNC, (void*)GetCurrentPath },
528     { NULL, L"HomeDir",
529     LIST_PARAM_STR, pts->HomeDirW },
530     { NULL, L"ExeDir",
531     LIST_PARAM_STR, pts->ExeDirW },
532     { NULL, L"LogDir",
533     LIST_PARAM_STR, pts->LogDirW },
534     { NULL, L"LogDefaultPathW",
535     LIST_PARAM_STR, pts->LogDefaultPathW },
536     { NULL, L"Download",
537     LIST_PARAM_STR, pts->FileDirW },
538     { NULL, L"Susie Plugin Path",
539     LIST_PARAM_FUNC, (void*)GetSusiePluginPath },
540     { NULL, L"UI language file",
541     LIST_PARAM_STR, pts->UILanguageFileW },
542     };
543    
544     int y = 0;
545     for (const SetupList *list = &setup_list[0]; list != &setup_list[_countof(setup_list)]; list++) {
546    
547     const SetupListParam param = list->param;
548     wchar_t *s;
549     if (param & LIST_PARAM_STR) {
550     // �����������|�C���^
551     s = (wchar_t *)list->param_ptr;
552     } else if (param & LIST_PARAM_FUNC) {
553     // ����������������������
554     typedef wchar_t *(*func_t)(const SetupList *list, TTTSet *pts);
555     func_t func = (func_t)list->param_ptr;
556     s = func(list, pts);
557     } else {
558     assert("bad list?");
559     s = NULL;
560     }
561     if (s == NULL) {
562     // �\���s�v
563     continue;
564     }
565    
566     const char *key = list->key;
567     const wchar_t *def_text = list->def_text;
568     wchar_t *text;
569     GetI18nStrWW("Tera Term", key, def_text, pts->UILanguageFileW, &text);
570    
571     LVITEMW item;
572     item.mask = LVIF_TEXT;
573     item.iItem = y;
574     item.iSubItem = 0;
575     item.pszText = text;
576     SendMessage(hWndList, LVM_INSERTITEMW, 0, (LPARAM)&item);
577     free(text);
578    
579     item.mask = LVIF_TEXT;
580     item.iItem = y;
581     item.iSubItem = 1;
582     item.pszText = s;
583     SendMessage(hWndList, LVM_SETITEMW, 0, (LPARAM)&item);
584    
585     y++;
586    
587     if (param & LIST_PARAM_FUNC) {
588     // �\���p�������������������J��
589     free(s);
590     }
591     }
592    
593     // ��������
594     for (int i = 0; i < 2; i++) {
595     ListView_SetColumnWidth(hWndList, i, LVSCW_AUTOSIZE);
596     }
597    
598 zmatsuo 9341 CenterWindow(hDlgWnd, GetParent(hDlgWnd));
599    
600 zmatsuo 10012 static const wchar_t *str = L"Right click to open submenu";
601     dlg_data->tipwin = TipWin2Create(NULL, hDlgWnd);
602     TipWin2SetTextW(dlg_data->tipwin, IDC_SETUP_DIR_LIST, str);
603 zmatsuo 9339 return TRUE;
604 zmatsuo 9340 }
605 zmatsuo 9339
606 zmatsuo 9340 case WM_COMMAND: {
607 zmatsuo 9339 switch (LOWORD(wp)) {
608 zmatsuo 9412 case IDHELP:
609 nmaya 10009 OpenHelpCV(pcv, HH_HELP_CONTEXT, HlpMenuSetupDir);
610 zmatsuo 9412 break;
611    
612     case IDOK:
613     TTEndDialog(hDlgWnd, IDOK);
614     return TRUE;
615     break;
616    
617 zmatsuo 9339 case IDCANCEL:
618     TTEndDialog(hDlgWnd, IDCANCEL);
619     return TRUE;
620     break;
621    
622     default:
623     return FALSE;
624     }
625     return FALSE;
626 zmatsuo 9340 }
627 zmatsuo 9339 case WM_CLOSE:
628 zmatsuo 10012 TipWin2Destroy(dlg_data->tipwin);
629     dlg_data->tipwin = NULL;
630 zmatsuo 9339 TTEndDialog(hDlgWnd, 0);
631     return TRUE;
632    
633 zmatsuo 9916 case WM_NOTIFY: {
634     NMHDR *nmhdr = (NMHDR *)lp;
635     if (nmhdr->idFrom == IDC_SETUP_DIR_LIST) {
636     NMLISTVIEW *nmlist = (NMLISTVIEW *)lp;
637     switch (nmlist->hdr.code) {
638     // case NM_CLICK:
639     case NM_RCLICK: {
640     POINT pointer_pos;
641     GetCursorPos(&pointer_pos);
642     LVHITTESTINFO ht = {};
643     ht.pt = pointer_pos;
644     ScreenToClient(nmlist->hdr.hwndFrom, &ht.pt);
645     ListView_HitTest(nmlist->hdr.hwndFrom, &ht);
646     if (ht.flags & LVHT_ONITEM) {
647     int hit_item = ht.iItem;
648    
649     wchar_t path[MAX_PATH];
650     LV_ITEMW item;
651     item.mask = TVIF_TEXT;
652     item.iItem = hit_item;
653     item.iSubItem = 1;
654     item.pszText = path;
655     item.cchTextMax = _countof(path);
656     SendMessageW(nmlist->hdr.hwndFrom, LVM_GETITEMW, 0, (LPARAM)&item);
657    
658     PopupAndExec(nmlist->hdr.hwndFrom, &pointer_pos, path, pts);
659     }
660     break;
661     }
662     }
663     }
664     break;
665     }
666 zmatsuo 9339 default:
667     return FALSE;
668     }
669     return TRUE;
670     }
671    
672 nmaya 10009 void SetupDirectoryDialog(HINSTANCE hInst, HWND hWnd, TComVar *pcv)
673 zmatsuo 9339 {
674 zmatsuo 10012 dlg_data_t* dlg_data = (dlg_data_t*)calloc(sizeof(dlg_data_t), 1);
675     dlg_data->pcv = pcv;
676 zmatsuo 9340 TTDialogBoxParam(hInst, MAKEINTRESOURCE(IDD_SETUP_DIR_DIALOG),
677 zmatsuo 10012 hWnd, OnSetupDirectoryDlgProc, (LPARAM)dlg_data);
678     free(dlg_data);
679 zmatsuo 9339 }

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