Develop and Download Open Source Software

Browse Subversion Repository

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 9230 - (hide annotations) (download) (as text)
Mon May 3 15:04:42 2021 UTC (2 years, 11 months ago) by zmatsuo
Original Path: trunk/teraterm/teraterm/vtwin.cpp
File MIME type: text/x-c++src
File size: 158836 byte(s)
_WIN32_WINNTをコンパイルオプションで指定

- Tera Term は _WIN32_WINNT >= 0x0501 でビルドすることが前提となっている
  - 0x0501=_WIN32_WINNT_WINXP
    - Windows XP
    - Windows Server 2003
  - Visual Studio 2005 のプロジェクトファイルに /D_WIN32_WINNT=0x0501 追加済み(r9191)
- teraterm_conf.h を削除
  - WIN32_WINNT をコンパイルオプションで指定するため r7554 で追加した
  - コマンドラインで明示的に指定するようになったた不要となった
    - SDK 7.0 では _WIN32_WINNT が自動で設定されない
    - SDK 7.0 より新しいSDKでは、特に指定されていない場合、自動で設定される
      - SDKのバージョンによって自動で設定される_WIN32_WINNT の値は異なっている
      - SDK 7.1 の場合 0x0601
      - SDK 10.0.18362.0 の場合 0x0A00
      - sdkddkver.h 内で設定される
        - MinGWの場合は _mingw.h
- Visual Studio 2005 では次のSDKでビルドできることを確認済み
  - SDK 7.0
  - SDK 7.1
- Tera Term は Visual Studio 2005 以上をサポート
  - MSC_VER >= 1400
1 doda 6806 /*
2     * Copyright (C) 1994-1998 T. Teranishi
3 nmaya 9048 * (C) 2004- TeraTerm Project
4 doda 6806 * All rights reserved.
5     *
6 doda 6841 * Redistribution and use in source and binary forms, with or without
7     * modification, are permitted provided that the following conditions
8     * are met:
9 doda 6806 *
10 doda 6841 * 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 doda 6806 *
18 doda 6841 * 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 doda 6806 */
29 maya 3227 /* IPv6 modification is Copyright(C) 2000 Jun-ya Kato <kato@win6.jp> */
30    
31     /* TERATERM.EXE, VT window */
32    
33 zmatsuo 9230 // SDK7.0�������AWIN32_IE���K�������`��������
34     #if _MSC_VER == 1400 // VS2005����������
35     #if !defined(_WIN32_IE)
36     #define _WIN32_IE 0x0501
37     #endif
38     #endif
39    
40 maya 3227 #include "teraterm.h"
41     #include "tttypes.h"
42    
43     #include "ttcommon.h"
44     #include "ttwinman.h"
45     #include "ttsetup.h"
46     #include "keyboard.h"
47     #include "buffer.h"
48     #include "vtterm.h"
49     #include "vtdisp.h"
50     #include "ttdialog.h"
51     #include "ttime.h"
52     #include "commlib.h"
53     #include "clipboar.h"
54     #include "filesys.h"
55     #include "telnet.h"
56     #include "tektypes.h"
57     #include "ttdde.h"
58     #include "ttlib.h"
59 zmatsuo 7528 #include "dlglib.h"
60 maya 3227 #include "helpid.h"
61     #include "teraprn.h"
62     #include <winsock2.h>
63     #include <ws2tcpip.h>
64     #include "ttplug.h" /* TTPLUG */
65 zmatsuo 7589 #include "teraterml.h"
66 zmatsuo 8770 #include "buffer.h"
67 maya 3227
68     #include <stdio.h>
69 zmatsuo 8463 #define _CRTDBG_MAP_ALLOC
70 maya 3227 #include <stdlib.h>
71 zmatsuo 8463 #include <crtdbg.h>
72 maya 3227 #include <string.h>
73     #include <locale.h>
74     #include <io.h>
75     #include <errno.h>
76    
77 zmatsuo 9230 #include <shlobj.h>
78     #include <windows.h>
79 maya 3227 #include <windowsx.h>
80 yutakapon 3898 #include <imm.h>
81 zmatsuo 7542 #include <dbt.h>
82 zmatsuo 7487 #include <assert.h>
83 doda 8445 #include <wchar.h>
84 zmatsuo 9230 #include <htmlhelp.h>
85 maya 3227
86     #include "tt_res.h"
87     #include "vtwin.h"
88     #include "addsetting.h"
89 yutakapon 4385 #include "winjump.h"
90 doda 7089 #include "sizetip.h"
91 zmatsuo 7148 #include "dnddlg.h"
92 zmatsuo 7527 #include "tekwin.h"
93 zmatsuo 7457 #include "compat_win.h"
94 doda 8445 #include "unicode_test.h"
95     #if UNICODE_DEBUG
96 zmatsuo 8122 #include "tipwin.h"
97 doda 8445 #endif
98     #include "codeconv.h"
99     #include "layer_for_unicode.h"
100     #include "sendmem.h"
101 zmatsuo 8588 #include "sendfiledlg.h"
102 zmatsuo 8749 #include "setting.h"
103 zmatsuo 8823 #include "broadcast.h"
104 zmatsuo 8899 #include "asprintf.h"
105 zmatsuo 9115 #include "teraprn.h"
106 maya 3227
107 salarm 6100 #include "initguid.h"
108 maya 6101 //#include "Usbiodef.h"
109     DEFINE_GUID(GUID_DEVINTERFACE_USB_DEVICE, 0xA5DCBF10L, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, \
110     0xC0, 0x4F, 0xB9, 0x51, 0xED);
111 salarm 6100
112 zmatsuo 8519 #define VTClassName L"VTWin32"
113 zmatsuo 7528
114 maya 3227 // �E�B���h�E�������{�^�����L�������� (2005.1.15 yutaka)
115     #define WINDOW_MAXMIMUM_ENABLED 1
116    
117 doda 3580 static BOOL TCPLocalEchoUsed = FALSE;
118     static BOOL TCPCRSendUsed = FALSE;
119    
120 doda 5341 static BOOL IgnoreRelease = FALSE;
121    
122 salarm 6100 static HDEVNOTIFY hDevNotify = NULL;
123    
124 salarm 6076 static int AutoDisconnectedPort = -1;
125    
126 zmatsuo 7485 #ifndef WM_IME_COMPOSITION
127     #define WM_IME_COMPOSITION 0x010F
128     #endif
129    
130 zmatsuo 8771 UnicodeDebugParam_t UnicodeDebugParam;
131 zmatsuo 9115 extern "C" PrintFile *PrintFile_;
132 doda 8445
133 maya 3227 /////////////////////////////////////////////////////////////////////////////
134     // CVTWindow
135    
136     // Tera Term�N������URL������mouse over������������ (2005.4.2 yutaka)
137 zmatsuo 7528 static void SetMouseCursor(const char *cursor)
138 maya 3227 {
139     HCURSOR hc;
140     LPCTSTR name = NULL;
141     int i;
142    
143     for (i = 0 ; MouseCursor[i].name ; i++) {
144     if (_stricmp(cursor, MouseCursor[i].name) == 0) {
145     name = MouseCursor[i].id;
146     break;
147     }
148     }
149 maya 3392 if (name == NULL) {
150 maya 3227 return;
151 maya 3392 }
152 maya 3227
153 yutakapon 6286 hc = (HCURSOR)LoadImage(NULL, name, IMAGE_CURSOR,
154 maya 3227 0, 0, LR_DEFAULTSIZE | LR_SHARED);
155    
156     if (hc != NULL) {
157     SetClassLongPtr(HVTWin, GCLP_HCURSOR, (LONG_PTR)hc);
158     }
159     }
160    
161 zmatsuo 7390 /**
162     * @param[in] alpha 0-255
163     */
164     void CVTWindow::SetWindowAlpha(BYTE alpha)
165 maya 3227 {
166 zmatsuo 7457 if (pSetLayeredWindowAttributes == NULL) {
167     return; // ���C���[�h�E�C���h�E���T�|�[�g����
168     }
169 zmatsuo 7390 if (Alpha == alpha) {
170     return; // ����������������������
171     }
172 zmatsuo 7528 LONG_PTR lp = GetWindowLongPtr(GWL_EXSTYLE);
173 zmatsuo 7390 if (lp == 0) {
174     return;
175     }
176 maya 3227
177     // 2006/03/16 by 337: BGUseAlphaBlendAPI��On������Layered����������
178     //if (ts->EtermLookfeel.BGUseAlphaBlendAPI) {
179     // �A���t�@�l��255�������A�����������������}�����������������������������B(2006.4.1 yutaka)
180     // �����o�������A�l�����X�����������������������f�����B(2007.10.19 maya)
181 zmatsuo 7390 if (alpha < 255) {
182     ::SetWindowLongPtr(HVTWin, GWL_EXSTYLE, lp | WS_EX_LAYERED);
183 zmatsuo 7457 pSetLayeredWindowAttributes(HVTWin, 0, alpha, LWA_ALPHA);
184 maya 3227 }
185     else {
186 zmatsuo 7390 // �A���t�@�l�� 255 �������A�����������������������`�������B(2007.10.22 maya)
187     ::SetWindowLongPtr(HVTWin, GWL_EXSTYLE, lp & ~WS_EX_LAYERED);
188     ::RedrawWindow(HVTWin, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME);
189 maya 3227 }
190 zmatsuo 7390 Alpha = alpha;
191 maya 3227 }
192    
193 salarm 6100 void RegDeviceNotify(HWND hWnd)
194     {
195     typedef HDEVNOTIFY (WINAPI *PRegisterDeviceNotification)(HANDLE hRecipient, LPVOID NotificationFilter, DWORD Flags);
196     HMODULE h;
197     PRegisterDeviceNotification pRegisterDeviceNotification;
198     DEV_BROADCAST_DEVICEINTERFACE filter;
199 maya 3227
200 salarm 6100 if (((h = GetModuleHandle("user32.dll")) == NULL) ||
201     ((pRegisterDeviceNotification = (PRegisterDeviceNotification)GetProcAddress(h, "RegisterDeviceNotificationA")) == NULL)) {
202     return;
203     }
204    
205     ZeroMemory(&filter, sizeof(filter));
206     filter.dbcc_size = sizeof(filter);
207     filter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
208     filter.dbcc_classguid = GUID_DEVINTERFACE_USB_DEVICE;
209     hDevNotify = pRegisterDeviceNotification(hWnd, &filter, DEVICE_NOTIFY_WINDOW_HANDLE);
210     }
211    
212     void UnRegDeviceNotify(HWND hWnd)
213     {
214     typedef BOOL (WINAPI *PUnregisterDeviceNotification)(HDEVNOTIFY Handle);
215     HMODULE h;
216     PUnregisterDeviceNotification pUnregisterDeviceNotification;
217    
218     if (((h = GetModuleHandle("user32.dll")) == NULL) ||
219     ((pUnregisterDeviceNotification = (PUnregisterDeviceNotification)GetProcAddress(h, "UnregisterDeviceNotification")) == NULL)) {
220     return;
221     }
222    
223     pUnregisterDeviceNotification(hDevNotify);
224     }
225    
226 salarm 6347 void SetAutoConnectPort(int port)
227     {
228     AutoDisconnectedPort = port;
229     }
230    
231 yutakapon 6130 // Virtual Store���L���������������������������B
232     //
233     // [Windows 95-XP]
234     // return FALSE (always)
235     //
236     // [Windows Vista-10]
237     // return TRUE: Virtual Store Enabled
238     // FALSE: Virtual Store Disabled or Unknown
239     //
240     BOOL GetVirtualStoreEnvironment(void)
241     {
242 yutakapon 6131 #if _MSC_VER == 1400 // VSC2005(VC8.0)
243     typedef struct _TOKEN_ELEVATION {
244     DWORD TokenIsElevated;
245     } TOKEN_ELEVATION, *PTOKEN_ELEVATION;
246     int TokenElevation = 20;
247     #endif
248 yutakapon 6130 BOOL ret = FALSE;
249     int flag = 0;
250     HANDLE hToken;
251     DWORD dwLength;
252     TOKEN_ELEVATION tokenElevation;
253     LONG lRet;
254     HKEY hKey;
255 zmatsuo 8489 char lpData[256];
256 yutakapon 6130 DWORD dwDataSize;
257     DWORD dwType;
258     BYTE bValue;
259    
260     // Windows Vista���O�����������B
261 yutakapon 6286 if (!IsWindowsVistaOrLater())
262 yutakapon 6130 goto error;
263    
264     // UAC���L�����������B
265     // HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System��EnableLUA(DWORD�l)��0�������������f��������(0��UAC�����A1��UAC�L��)�B
266     flag = 0;
267     lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
268     TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System"),
269     NULL, KEY_QUERY_VALUE, &hKey
270     );
271     if (lRet == ERROR_SUCCESS) {
272     dwDataSize = sizeof(lpData) / sizeof(lpData[0]);
273     lRet = RegQueryValueEx(
274     hKey,
275     TEXT("EnableLUA"),
276     0,
277     &dwType,
278     (LPBYTE)lpData,
279     &dwDataSize);
280     if (lRet == ERROR_SUCCESS) {
281     bValue = ((LPBYTE)lpData)[0];
282     if (bValue == 1)
283     // UAC���L���������AVirtual Store�������B
284     flag = 1;
285     }
286     RegCloseKey(hKey);
287     }
288     if (flag == 0)
289     goto error;
290    
291     // UAC���L�����A�v���Z�X�����������������i�����������B
292     flag = 0;
293     if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_DEFAULT, &hToken)) {
294     if (GetTokenInformation(hToken, (TOKEN_INFORMATION_CLASS)TokenElevation, &tokenElevation, sizeof(TOKEN_ELEVATION), &dwLength)) {
295     // (0�����i�����������A��0�����i��������)�B
296     if (tokenElevation.TokenIsElevated == 0) {
297     // �����������������������������AVirtual Store�������B
298     flag = 1;
299     }
300     }
301     CloseHandle(hToken);
302     }
303     if (flag == 0)
304     goto error;
305    
306     ret = TRUE;
307     return (ret);
308    
309     error:
310     return (ret);
311     }
312    
313 doda 6782 /////////////////////////////////////////////////////////////////////////////
314     // CVTWindow constructor
315    
316 zmatsuo 7916 CVTWindow::CVTWindow(HINSTANCE hInstance)
317 maya 3227 {
318 zmatsuo 8519 WNDCLASSW wc;
319 maya 3227 RECT rect;
320     DWORD Style;
321     char *Param;
322     int CmdShow;
323 maya 5784 #ifdef SHARED_KEYMAP
324     char Temp[MAX_PATH];
325 maya 3227 PKeyMap tempkm;
326 maya 5784 #endif
327 maya 3227 int fuLoad = LR_DEFAULTCOLOR;
328 doda 6790 BOOL isFirstInstance;
329 zmatsuo 7916 m_hInst = hInstance;
330 maya 3227
331 doda 6790 CommInit(&cv);
332     isFirstInstance = StartTeraTerm(&ts);
333    
334 maya 3227 TTXInit(&ts, &cv); /* TTPLUG */
335    
336     MsgDlgHelp = RegisterWindowMessage(HELPMSGSTRING);
337    
338 doda 6790 if (isFirstInstance) {
339 maya 3227 /* first instance */
340     if (LoadTTSET()) {
341     /* read setup info from "teraterm.ini" */
342     (*ReadIniFile)(ts.SetupFName, &ts);
343 maya 5784 #ifdef SHARED_KEYMAP
344 maya 3227 /* read keycode map from "keyboard.cnf" */
345     tempkm = (PKeyMap)malloc(sizeof(TKeyMap));
346     if (tempkm!=NULL) {
347     strncpy_s(Temp, sizeof(Temp), ts.HomeDir, _TRUNCATE);
348     AppendSlash(Temp,sizeof(Temp));
349     strncat_s(Temp,sizeof(Temp),"KEYBOARD.CNF",_TRUNCATE);
350     (*ReadKeyboardCnf)(Temp,tempkm,TRUE);
351     }
352 maya 5784 #endif
353 maya 3227 FreeTTSET();
354 maya 5784 #ifdef SHARED_KEYMAP
355 maya 3227 /* store default sets in TTCMN */
356     #if 0
357     ChangeDefaultSet(&ts,tempkm);
358     #else
359     ChangeDefaultSet(NULL,tempkm);
360     #endif
361     if (tempkm!=NULL) free(tempkm);
362 maya 5784 #endif
363 maya 3227 }
364 doda 6783 else {
365     abort();
366     }
367 maya 3227
368     } else {
369     // 2�������~���v���Z�X�����������A�f�B�X�N���� TERATERM.INI �������B(2004.11.4 yutaka)
370     if (LoadTTSET()) {
371     /* read setup info from "teraterm.ini" */
372     (*ReadIniFile)(ts.SetupFName, &ts);
373 maya 5784 #ifdef SHARED_KEYMAP
374 maya 3227 /* read keycode map from "keyboard.cnf" */
375     tempkm = (PKeyMap)malloc(sizeof(TKeyMap));
376     if (tempkm!=NULL) {
377 doda 5345 strncpy_s(Temp, sizeof(Temp), ts.HomeDir, _TRUNCATE);
378 maya 3227 AppendSlash(Temp,sizeof(Temp));
379     strncat_s(Temp,sizeof(Temp),"KEYBOARD.CNF",_TRUNCATE);
380     (*ReadKeyboardCnf)(Temp,tempkm,TRUE);
381     }
382 maya 5784 #endif
383 maya 3227 FreeTTSET();
384 maya 5784 #ifdef SHARED_KEYMAP
385 maya 3227 /* store default sets in TTCMN */
386 maya 3392 if (tempkm!=NULL) {
387     free(tempkm);
388     }
389 maya 5784 #endif
390 maya 3227 }
391 doda 6783 else {
392     abort();
393     }
394 maya 3227 }
395    
396     /* Parse command line parameters*/
397     // 256�o�C�g�������R�}���h���C���p�����[�^�w�����������ABOF(Buffer Over Flow)��
398     // �������o�O���C���B(2007.6.12 maya)
399     Param = GetCommandLine();
400 maya 3392 if (LoadTTSET()) {
401 maya 3227 (*ParseParam)(Param, &ts, &(TopicName[0]));
402 maya 3392 }
403 maya 3227 FreeTTSET();
404    
405 zmatsuo 7594 // DPI Aware (��DPI����)
406 zmatsuo 7715 if (pIsValidDpiAwarenessContext != NULL && pSetThreadDpiAwarenessContext != NULL) {
407     char Temp[4];
408     GetPrivateProfileString("Tera Term", "DPIAware", NULL, Temp, sizeof(Temp), ts.SetupFName);
409     if (_stricmp(Temp, "on") == 0) {
410     if (pIsValidDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2) == TRUE) {
411 zmatsuo 7594 pSetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
412     }
413     }
414     }
415    
416 maya 3227 // duplicate session���w�������������A���L�����������R�s�[���� (2004.12.7 yutaka)
417     if (ts.DuplicateSession == 1) {
418     CopyShmemToTTSet(&ts);
419     }
420    
421     InitKeyboard();
422     SetKeyMap();
423    
424     /* window status */
425     AdjustSize = TRUE;
426     Minimized = FALSE;
427     LButton = FALSE;
428     MButton = FALSE;
429     RButton = FALSE;
430     DblClk = FALSE;
431     AfterDblClk = FALSE;
432     TplClk = FALSE;
433     Hold = FALSE;
434     FirstPaint = TRUE;
435     ScrollLock = FALSE; // �����l������ (2006.11.14 yutaka)
436 zmatsuo 7390 Alpha = 255;
437 zmatsuo 7717 IgnoreSizeMessage = FALSE;
438 doda 8445 #if UNICODE_DEBUG
439     TipWinCodeDebug = NULL;
440     #endif
441 maya 3227
442 zmatsuo 8771 // UnicodeDebugParam
443     {
444     #if _DEBUG
445     UnicodeDebugParam.CodePopupEnable = TRUE;
446     #else
447     UnicodeDebugParam.CodePopupEnable = FALSE;
448     #endif
449     UnicodeDebugParam.CodePopupKey1 = VK_CONTROL;
450     UnicodeDebugParam.CodePopupKey2 = VK_CONTROL;
451     UnicodeDebugParam.UseUnicodeApi = FALSE;
452     UnicodeDebugParam.CodePageForANSIDraw = 932;
453     }
454    
455 maya 3227 /* Initialize scroll buffer */
456 zmatsuo 8750 UnicodeDebugParam.UseUnicodeApi = IsWindowsNTKernel() ? TRUE : FALSE;
457     InitBuffer(UnicodeDebugParam.UseUnicodeApi);
458 zmatsuo 8771 BuffSetDispCodePage(UnicodeDebugParam.CodePageForANSIDraw);
459 maya 3227
460     InitDisp();
461    
462     if (ts.HideTitle>0) {
463     Style = WS_VSCROLL | WS_HSCROLL |
464     WS_BORDER | WS_THICKFRAME | WS_POPUP;
465    
466     #ifdef ALPHABLEND_TYPE2
467     if(BGNoFrame)
468     Style &= ~(WS_BORDER | WS_THICKFRAME);
469     #endif
470     }
471     else
472     #ifdef WINDOW_MAXMIMUM_ENABLED
473     Style = WS_VSCROLL | WS_HSCROLL |
474     WS_BORDER | WS_THICKFRAME |
475     WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX;
476     #else
477     Style = WS_VSCROLL | WS_HSCROLL |
478     WS_BORDER | WS_THICKFRAME |
479     WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX;
480     #endif
481    
482     wc.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
483 zmatsuo 7528 wc.lpfnWndProc = (WNDPROC)ProcStub;
484 maya 3227 wc.cbClsExtra = 0;
485     wc.cbWndExtra = 0;
486 zmatsuo 7916 wc.hInstance = hInstance;
487 maya 3227 wc.hIcon = NULL;
488     //wc.hCursor = LoadCursor(NULL,IDC_IBEAM);
489     wc.hCursor = NULL; // �}�E�X�J�[�\�������I�����X���� (2005.4.2 yutaka)
490     wc.hbrBackground = NULL;
491     wc.lpszMenuName = NULL;
492     wc.lpszClassName = VTClassName;
493    
494 zmatsuo 8519 _RegisterClassW(&wc);
495 zmatsuo 7916 m_hAccel = ::LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACC));
496 maya 3227
497 maya 3392 if (ts.VTPos.x==CW_USEDEFAULT) {
498 maya 3227 rect = rectDefault;
499 maya 3392 }
500 maya 3227 else {
501     rect.left = ts.VTPos.x;
502     rect.top = ts.VTPos.y;
503     rect.right = rect.left + 100;
504     rect.bottom = rect.top + 100;
505     }
506 zmatsuo 8519 CreateW(hInstance, VTClassName, L"Tera Term", Style, rect, NULL, NULL);
507 maya 3227
508     /*--------- Init2 -----------------*/
509     HVTWin = GetSafeHwnd();
510     if (HVTWin == NULL) return;
511     // register this window to the window list
512     SerialNo = RegWin(HVTWin,NULL);
513    
514     logfile_lock_initialize();
515 zmatsuo 7390 SetMouseCursor(ts.MouseCursorName);
516 maya 3227 // ���P�[��������
517     // wctomb ������
518     setlocale(LC_ALL, ts.Locale);
519    
520     #ifdef ALPHABLEND_TYPE2
521     //<!--by AKASI
522     if(BGNoFrame && ts.HideTitle > 0) {
523 doda 8445 DWORD ExStyle = (DWORD)::GetWindowLongPtr(HVTWin,GWL_EXSTYLE);
524 maya 3227 ExStyle &= ~WS_EX_CLIENTEDGE;
525 zmatsuo 7528 ::SetWindowLongPtr(HVTWin,GWL_EXSTYLE,ExStyle);
526 maya 3227 }
527     //-->
528     #endif
529    
530 salarm 6100 // USB�f�o�C�X�������m�o�^
531     RegDeviceNotify(HVTWin);
532    
533 yutakapon 6286 if (IsWindowsNT4()) {
534 maya 3227 fuLoad = LR_VGACOLOR;
535     }
536     ::PostMessage(HVTWin,WM_SETICON,ICON_SMALL,
537 zmatsuo 7916 (LPARAM)LoadImage(hInstance,
538 maya 3227 MAKEINTRESOURCE((ts.VTIcon!=IdIconDefault)?ts.VTIcon:IDI_VT),
539     IMAGE_ICON,16,16,fuLoad));
540     // Vista �� Aero �������� Alt+Tab �����������\���������A�C�R����
541     // 16x16 �A�C�R�����g���������������������A�������A�C�R����
542     // �Z�b�g���� (2008.9.3 maya)
543     ::PostMessage(HVTWin,WM_SETICON,ICON_BIG,
544 zmatsuo 7916 (LPARAM)LoadImage(hInstance,
545 maya 3227 MAKEINTRESOURCE((ts.VTIcon!=IdIconDefault)?ts.VTIcon:IDI_VT),
546     IMAGE_ICON, 0, 0, fuLoad));
547    
548 doda 6690 SetCustomNotifyIcon(
549     (HICON)LoadImage(
550 zmatsuo 7916 hInstance,
551 doda 6690 MAKEINTRESOURCE((ts.VTIcon!=IdIconDefault)?ts.VTIcon:IDI_VT),
552     IMAGE_ICON, 16, 16, LR_VGACOLOR|LR_SHARED));
553    
554 maya 3227 MainMenu = NULL;
555     WinMenu = NULL;
556     if ((ts.HideTitle==0) && (ts.PopupMenu==0)) {
557     InitMenu(&MainMenu);
558     ::SetMenu(HVTWin,MainMenu);
559     }
560    
561     /* Reset Terminal */
562     ResetTerminal();
563    
564 maya 3392 if ((ts.PopupMenu>0) || (ts.HideTitle>0)) {
565 maya 3227 ::PostMessage(HVTWin,WM_USER_CHANGEMENU,0,0);
566 maya 3392 }
567 maya 3227
568     ChangeFont();
569    
570     ResetIME();
571    
572     BuffChangeWinSize(NumOfColumns,NumOfLines);
573    
574     ChangeTitle();
575     /* Enable drag-drop */
576     ::DragAcceptFiles(HVTWin,TRUE);
577    
578     if (ts.HideWindow>0) {
579     if (strlen(TopicName)>0) {
580     InitDDE();
581     SendDDEReady();
582     }
583     FirstPaint = FALSE;
584     Startup();
585     return;
586     }
587 maya 3392 CmdShow = SW_SHOWDEFAULT;
588     if (ts.Minimize>0) {
589 maya 3227 CmdShow = SW_SHOWMINIMIZED;
590 maya 3392 }
591 zmatsuo 7390 SetWindowAlpha(ts.AlphaBlendActive);
592 maya 3227 ShowWindow(CmdShow);
593     ChangeCaret();
594 yutakapon 6130
595     // Tera Term���N�����AVirtual Store�����������������o���������B
596     // (2015.11.14 yutaka)
597     cv.VirtualStoreEnabled = GetVirtualStoreEnvironment();
598 zmatsuo 7148
599     DropLists = NULL;
600     DropListCount = 0;
601 yasuhide 8143
602 doda 8445 #if UNICODE_DEBUG
603     CtrlKeyState = 0;
604     #endif
605    
606 yasuhide 8143 // TipWin
607 yasuhide 8268 TipWin = new CTipWin(hInstance);
608     TipWin->Create(HVTWin);
609 maya 3227 }
610    
611     /////////////////////////////////////////////////////////////////////////////
612 yasuhide 8268 // CVTWindow destructor
613 maya 3227
614 yasuhide 8268 CVTWindow::~CVTWindow()
615     {
616     TipWin->Destroy();
617     delete TipWin;
618     TipWin = NULL;
619     }
620    
621     /////////////////////////////////////////////////////////////////////////////
622    
623 maya 3227 int CVTWindow::Parse()
624     {
625     // added ScrollLock (2006.11.14 yutaka)
626     if (LButton || MButton || RButton || ScrollLock)
627     return 0;
628     return (VTParse()); // Parse received characters
629     }
630    
631     void CVTWindow::ButtonUp(BOOL Paste)
632     {
633     BOOL disableBuffEndSelect = false;
634    
635     /* disable autoscrolling */
636     ::KillTimer(HVTWin,IdScrollTimer);
637     ReleaseCapture();
638    
639     if (ts.SelectOnlyByLButton &&
640     (MButton || RButton)) {
641     disableBuffEndSelect = true;
642     }
643    
644     LButton = FALSE;
645     MButton = FALSE;
646     RButton = FALSE;
647     DblClk = FALSE;
648     TplClk = FALSE;
649     CaretOn();
650    
651     // SelectOnlyByLButton �� on �� ���E�E�N���b�N����������
652     // �o�b�t�@���I���������������A�I�����e���N���b�v�{�[�h��
653     // �R�s�[�������������������C�� (2007.12.6 maya)
654     if (!disableBuffEndSelect) {
655 zmatsuo 8676 wchar_t *strW = BuffEndSelect();
656     if (strW != NULL) {
657     CBSetTextW(HVTWin, strW, 0);
658     }
659 maya 3227 }
660    
661 doda 6415 if (Paste) {
662 doda 6456 CBStartPaste(HVTWin, FALSE, BracketedPasteMode());
663 doda 8445
664 doda 6456 // �X�N���[�����u�����Z�b�g
665     if (WinOrgY != 0) {
666     DispVScroll(SCROLL_BOTTOM, 0);
667 maya 3227 }
668     }
669     }
670    
671     void CVTWindow::ButtonDown(POINT p, int LMR)
672     {
673     HMENU PopupMenu, PopupBase;
674     BOOL mousereport;
675    
676     if ((LMR==IdLeftButton) && ControlKey() && (MainMenu==NULL) &&
677     ((ts.MenuFlag & MF_NOPOPUP)==0)) {
678     int i, numItems;
679     char itemText[256];
680    
681     InitMenu(&PopupMenu);
682    
683     PopupBase = CreatePopupMenu();
684     numItems = GetMenuItemCount(PopupMenu);
685    
686     for (i = 0; i < numItems; i++) {
687     HMENU submenu = GetSubMenu(PopupMenu, i);
688    
689     if (submenu != NULL) {
690     InitMenuPopup(submenu);
691     }
692    
693     if (GetMenuString(PopupMenu, i, itemText, sizeof(itemText), MF_BYPOSITION) != 0) {
694     int state = GetMenuState(PopupMenu, i, MF_BYPOSITION) &
695     (MF_CHECKED | MF_DISABLED | MF_GRAYED | MF_HILITE |
696     MF_MENUBARBREAK | MF_MENUBREAK | MF_SEPARATOR);
697    
698     AppendMenu(PopupBase,
699     submenu != NULL ? LOBYTE(state) | MF_POPUP : state,
700 zmatsuo 7896 submenu != NULL ? (UINT_PTR)submenu : GetMenuItemID(PopupMenu, i),
701 maya 3227 itemText);
702     }
703     }
704    
705     ::ClientToScreen(HVTWin, &p);
706     TrackPopupMenu(PopupBase,TPM_LEFTALIGN | TPM_LEFTBUTTON,
707     p.x,p.y,0,HVTWin,NULL);
708     if (WinMenu!=NULL) {
709     DestroyMenu(WinMenu);
710     WinMenu = NULL;
711     }
712     DestroyMenu(PopupBase);
713     DestroyMenu(PopupMenu);
714     PopupMenu = 0;
715     return;
716     }
717    
718 zmatsuo 7528 mousereport = MouseReport(IdMouseEventBtnDown, LMR, p.x, p.y);
719     if (mousereport) {
720     ::SetCapture(m_hWnd);
721 doda 3987 return;
722     }
723 maya 3227
724     // added ConfirmPasteMouseRButton (2007.3.17 maya)
725     if ((LMR == IdRightButton) &&
726 doda 6594 (ts.PasteFlag & CPF_DISABLE_RBUTTON) == 0 &&
727     (ts.PasteFlag & CPF_CONFIRM_RBUTTON) != 0 &&
728 maya 3227 cv.Ready &&
729     !mousereport &&
730 zmatsuo 8948 IsSendVarNULL() && IsFileVarNULL() &&
731 maya 3227 (cv.PortType!=IdFile) &&
732     (IsClipboardFormatAvailable(CF_TEXT) ||
733     IsClipboardFormatAvailable(CF_OEMTEXT))) {
734    
735     int i, numItems;
736     char itemText[256];
737    
738     InitPasteMenu(&PopupMenu);
739     PopupBase = CreatePopupMenu();
740     numItems = GetMenuItemCount(PopupMenu);
741    
742     for (i = 0; i < numItems; i++) {
743     if (GetMenuString(PopupMenu, i, itemText, sizeof(itemText), MF_BYPOSITION) != 0) {
744     int state = GetMenuState(PopupMenu, i, MF_BYPOSITION) &
745     (MF_CHECKED | MF_DISABLED | MF_GRAYED | MF_HILITE |
746     MF_MENUBARBREAK | MF_MENUBREAK | MF_SEPARATOR);
747    
748     AppendMenu(PopupBase, state,
749     GetMenuItemID(PopupMenu, i), itemText);
750     }
751     }
752    
753     ::ClientToScreen(HVTWin, &p);
754     TrackPopupMenu(PopupBase,TPM_LEFTALIGN | TPM_LEFTBUTTON,
755     p.x,p.y,0,HVTWin,NULL);
756     if (WinMenu!=NULL) {
757     DestroyMenu(WinMenu);
758     WinMenu = NULL;
759     }
760     DestroyMenu(PopupBase);
761     DestroyMenu(PopupMenu);
762     PopupMenu = 0;
763     return;
764     }
765    
766     if (AfterDblClk && (LMR==IdLeftButton) &&
767     (abs(p.x-DblClkX)<=GetSystemMetrics(SM_CXDOUBLECLK)) &&
768     (abs(p.y-DblClkY)<=GetSystemMetrics(SM_CYDOUBLECLK))) {
769     /* triple click */
770     ::KillTimer(HVTWin, IdDblClkTimer);
771     AfterDblClk = FALSE;
772     BuffTplClk(p.y);
773     LButton = TRUE;
774     TplClk = TRUE;
775     /* for AutoScrolling */
776     ::SetCapture(HVTWin);
777     ::SetTimer(HVTWin, IdScrollTimer, 100, NULL);
778     }
779     else {
780     if (! (LButton || MButton || RButton)) {
781     BOOL box = FALSE;
782    
783     // select several pages of output from Tera Term window (2005.5.15 yutaka)
784     if (LMR == IdLeftButton && ShiftKey()) {
785     BuffSeveralPagesSelect(p.x, p.y);
786    
787     } else {
788     // Select rectangular block with Alt Key. Delete Shift key.(2005.5.15 yutaka)
789     if (LMR == IdLeftButton && AltKey()) {
790     box = TRUE;
791     }
792    
793     // Starting the selection only by a left button.(2007.11.20 maya)
794     if (!ts.SelectOnlyByLButton ||
795     (ts.SelectOnlyByLButton && LMR == IdLeftButton) ) {
796     BuffStartSelect(p.x,p.y, box);
797     TplClk = FALSE;
798    
799     /* for AutoScrolling */
800     ::SetCapture(HVTWin);
801     ::SetTimer(HVTWin, IdScrollTimer, 100, NULL);
802     }
803     }
804     }
805    
806     switch (LMR) {
807     case IdRightButton:
808     RButton = TRUE;
809     break;
810     case IdMiddleButton:
811     MButton = TRUE;
812     break;
813     case IdLeftButton:
814     LButton = TRUE;
815     break;
816     }
817     }
818     }
819    
820     // LogMeIn.exe -> LogMeTT.exe �����l�[�� (2005.2.21 yutaka)
821     static char LogMeTTMenuString[] = "Log&MeTT";
822 yutakapon 3648 static char LogMeTT[MAX_PATH];
823    
824 doda 8395 #define IS_LOGMETT_NOTFOUND 0
825     #define IS_LOGMETT_FOUND 1
826     #define IS_LOGMETT_UNKNOWN 2
827    
828 maya 3227 static BOOL isLogMeTTExist()
829     {
830 yutakapon 3648 const char *LogMeTTexename = "LogMeTT.exe";
831     LONG result;
832     HKEY key;
833     int inregist = 0;
834     DWORD dwSize;
835     DWORD dwType;
836     DWORD dwDisposition;
837     char *path;
838 maya 3227
839 doda 8395 static int status = IS_LOGMETT_UNKNOWN;
840    
841     if (status != IS_LOGMETT_UNKNOWN) {
842     return status == IS_LOGMETT_FOUND;
843     }
844    
845 yutakapon 3648 /* LogMeTT 2.9.6���������W�X�g�����C���X�g�[���p�X�����������B*/
846     result = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\LogMeTT", 0, NULL,
847     REG_OPTION_NON_VOLATILE, KEY_READ, NULL, &key, &dwDisposition);
848     if (result == ERROR_SUCCESS) {
849     result = RegQueryValueEx(key, "InstallPath", NULL, &dwType, NULL, &dwSize);
850     if (result == ERROR_SUCCESS) {
851     path = (char *)malloc(dwSize);
852     if (path != NULL) {
853     result = RegQueryValueEx(key, "InstallPath", NULL, &dwType, (LPBYTE)path, &dwSize);
854     if (result == ERROR_SUCCESS) {
855     inregist = 1;
856     strncpy_s(LogMeTT, sizeof(LogMeTT), path, _TRUNCATE);
857     }
858     free(path);
859     }
860     }
861 yutakapon 3649 RegCloseKey(key);
862 yutakapon 3648 }
863    
864     if (inregist == 0) {
865     strncpy_s(LogMeTT, sizeof(LogMeTT), ts.HomeDir, _TRUNCATE);
866     AppendSlash(LogMeTT, sizeof(LogMeTT));
867     strncat_s(LogMeTT, sizeof(LogMeTT), LogMeTTexename, _TRUNCATE);
868     }
869    
870 maya 3227 if (_access(LogMeTT, 0) == -1) {
871 doda 8395 status = IS_LOGMETT_NOTFOUND;
872 maya 3227 return FALSE;
873     }
874 doda 8395 status = IS_LOGMETT_FOUND;
875 maya 3227 return TRUE;
876     }
877    
878     void CVTWindow::InitMenu(HMENU *Menu)
879     {
880 doda 8445 static const DlgTextInfo MenuTextInfo[] = {
881     { ID_FILE, "MENU_FILE" },
882     { ID_EDIT, "MENU_EDIT" },
883     { ID_SETUP, "MENU_SETUP" },
884     { ID_CONTROL, "MENU_CONTROL" },
885     { ID_HELPMENU, "MENU_HELP" },
886     };
887     static const DlgTextInfo FileMenuTextInfo[] = {
888     { ID_FILE_NEWCONNECTION, "MENU_FILE_NEW" },
889     { ID_FILE_DUPLICATESESSION, "MENU_FILE_DUPLICATE" },
890     { ID_FILE_CYGWINCONNECTION, "MENU_FILE_GYGWIN" },
891     { ID_FILE_LOG, "MENU_FILE_LOG" },
892     { ID_FILE_COMMENTTOLOG, "MENU_FILE_COMMENTLOG" },
893     { ID_FILE_VIEWLOG, "MENU_FILE_VIEWLOG" },
894     { ID_FILE_SHOWLOGDIALOG, "MENU_FILE_SHOWLOGDIALOG" },
895     { ID_FILE_PAUSELOG, "MENU_FILE_PAUSELOG" },
896     { ID_FILE_STOPLOG, "MENU_FILE_STOPLOG" },
897     { ID_FILE_SENDFILE, "MENU_FILE_SENDFILE" },
898     { ID_FILE_REPLAYLOG, "MENU_FILE_REPLAYLOG" },
899     { ID_FILE_CHANGEDIR, "MENU_FILE_CHANGEDIR" },
900     { ID_FILE_LOGMEIN, "MENU_FILE_LOGMETT" },
901     { ID_FILE_PRINT2, "MENU_FILE_PRINT" },
902     { ID_FILE_DISCONNECT, "MENU_FILE_DISCONNECT" },
903     { ID_FILE_EXIT, "MENU_FILE_EXIT" },
904     { ID_FILE_EXITALL, "MENU_FILE_EXITALL" },
905     { 11, "MENU_TRANS" },
906     { ID_FILE_KERMITRCV, "MENU_TRANS_KERMIT_RCV" },
907     { ID_FILE_KERMITGET, "MENU_TRANS_KERMIT_GET" },
908     { ID_FILE_KERMITSEND, "MENU_TRANS_KERMIT_SEND" },
909     { ID_FILE_KERMITFINISH, "MENU_TRANS_KERMIT_FINISH" },
910     { ID_FILE_XRCV, "MENU_TRANS_X_RCV" },
911     { ID_FILE_XSEND, "MENU_TRANS_X_SEND" },
912     { ID_FILE_YRCV, "MENU_TRANS_Y_RCV" },
913     { ID_FILE_YSEND, "MENU_TRANS_Y_SEND" },
914     { ID_FILE_ZRCV, "MENU_TRANS_Z_RCV" },
915     { ID_FILE_ZSEND, "MENU_TRANS_Z_SEND" },
916     { ID_FILE_BPRCV, "MENU_TRANS_BP_RCV" },
917     { ID_FILE_BPSEND, "MENU_TRANS_BP_SEND" },
918     { ID_FILE_QVRCV, "MENU_TRANS_QV_RCV" },
919     { ID_FILE_QVSEND, "MENU_TRANS_QV_SEND" },
920     };
921     static const DlgTextInfo EditMenuTextInfo[] = {
922     { ID_EDIT_COPY2, "MENU_EDIT_COPY" },
923     { ID_EDIT_COPYTABLE, "MENU_EDIT_COPYTABLE" },
924     { ID_EDIT_PASTE2, "MENU_EDIT_PASTE" },
925     { ID_EDIT_PASTECR, "MENU_EDIT_PASTECR" },
926     { ID_EDIT_CLEARSCREEN, "MENU_EDIT_CLSCREEN" },
927     { ID_EDIT_CLEARBUFFER, "MENU_EDIT_CLBUFFER" },
928     { ID_EDIT_CANCELSELECT, "MENU_EDIT_CANCELSELECT" },
929     { ID_EDIT_SELECTSCREEN, "MENU_EDIT_SELECTSCREEN" },
930     { ID_EDIT_SELECTALL, "MENU_EDIT_SELECTALL" },
931     };
932     static const DlgTextInfo SetupMenuTextInfo[] = {
933     { ID_SETUP_TERMINAL, "MENU_SETUP_TERMINAL" },
934     { ID_SETUP_WINDOW, "MENU_SETUP_WINDOW" },
935     { ID_SETUP_FONT, "MENU_SETUP_FONT" },
936     { ID_SETUP_DLG_FONT, "MENU_SETUP_DIALOG_FONT" },
937     { 2, "MENU_SETUP_FONT_SUBMENU" },
938     { ID_SETUP_KEYBOARD, "MENU_SETUP_KEYBOARD" },
939     { ID_SETUP_SERIALPORT, "MENU_SETUP_SERIALPORT" },
940     { ID_SETUP_TCPIP, "MENU_SETUP_TCPIP" },
941     { ID_SETUP_GENERAL, "MENU_SETUP_GENERAL" },
942     { ID_SETUP_ADDITIONALSETTINGS, "MENU_SETUP_ADDITION" },
943     { ID_SETUP_SAVE, "MENU_SETUP_SAVE" },
944     { ID_SETUP_RESTORE, "MENU_SETUP_RESTORE" },
945     { ID_OPEN_SETUP, "MENU_SETUP_OPENSETUP" },
946     { ID_SETUP_LOADKEYMAP, "MENU_SETUP_LOADKEYMAP" },
947     };
948     static const DlgTextInfo ControlMenuTextInfo[] = {
949     { ID_CONTROL_RESETTERMINAL, "MENU_CONTROL_RESET" },
950     { ID_CONTROL_RESETREMOTETITLE, "MENU_CONTROL_RESETTITLE" },
951     { ID_CONTROL_AREYOUTHERE, "MENU_CONTROL_AREYOUTHERE" },
952     { ID_CONTROL_SENDBREAK, "MENU_CONTROL_SENDBREAK" },
953     { ID_CONTROL_RESETPORT, "MENU_CONTROL_RESETPORT" },
954     { ID_CONTROL_BROADCASTCOMMAND, "MENU_CONTROL_BROADCAST" },
955     { ID_CONTROL_OPENTEK, "MENU_CONTROL_OPENTEK" },
956     { ID_CONTROL_CLOSETEK, "MENU_CONTROL_CLOSETEK" },
957     { ID_CONTROL_MACRO, "MENU_CONTROL_MACRO" },
958     { ID_CONTROL_SHOW_MACRO, "MENU_CONTROL_SHOW_MACRO" },
959     };
960     static const DlgTextInfo HelpMenuTextInfo[] = {
961     { ID_HELP_INDEX2, "MENU_HELP_INDEX" },
962     { ID_HELP_ABOUT, "MENU_HELP_ABOUT" },
963     };
964 maya 3227
965 doda 8445 HMENU hMenu = LoadMenu(m_hInst, MAKEINTRESOURCE(IDR_MENU));
966     *Menu = hMenu;
967    
968     FileMenu = GetSubMenu(hMenu,ID_FILE);
969 maya 3227 TransMenu = GetSubMenu(FileMenu,ID_TRANSFER);
970 doda 8445 EditMenu = GetSubMenu(hMenu,ID_EDIT);
971     SetupMenu = GetSubMenu(hMenu,ID_SETUP);
972     ControlMenu = GetSubMenu(hMenu,ID_CONTROL);
973     HelpMenu = GetSubMenu(hMenu,ID_HELPMENU);
974 maya 3227
975 doda 8445 SetDlgMenuTexts(hMenu, MenuTextInfo, _countof(MenuTextInfo), ts.UILanguageFile);
976    
977 maya 3227 /* LogMeTT ���������m�F�������j���[���������� */
978     if (isLogMeTTExist()) {
979     ::InsertMenu(FileMenu, ID_FILE_PRINT2, MF_STRING | MF_ENABLED | MF_BYCOMMAND,
980     ID_FILE_LOGMEIN, LogMeTTMenuString);
981     ::InsertMenu(FileMenu, ID_FILE_PRINT2, MF_SEPARATOR, NULL, NULL);
982     }
983    
984 doda 8445 SetDlgMenuTexts(FileMenu, FileMenuTextInfo, _countof(FileMenuTextInfo), ts.UILanguageFile);
985     SetDlgMenuTexts(EditMenu, EditMenuTextInfo, _countof(EditMenuTextInfo), ts.UILanguageFile);
986     SetDlgMenuTexts(SetupMenu, SetupMenuTextInfo, _countof(SetupMenuTextInfo), ts.UILanguageFile);
987     SetDlgMenuTexts(ControlMenu, ControlMenuTextInfo, _countof(ControlMenuTextInfo), ts.UILanguageFile);
988     SetDlgMenuTexts(HelpMenu, HelpMenuTextInfo, _countof(HelpMenuTextInfo), ts.UILanguageFile);
989 maya 3227
990     if ((ts.MenuFlag & MF_SHOWWINMENU) !=0) {
991 zmatsuo 8490 wchar_t uimsg[MAX_UIMSG];
992 maya 3227 WinMenu = CreatePopupMenu();
993 zmatsuo 8490 get_lang_msgW("MENU_WINDOW", uimsg, _countof(uimsg),
994     L"&Window", ts.UILanguageFile);
995     _InsertMenuW(hMenu, ID_HELPMENU,
996     MF_STRING | MF_ENABLED | MF_POPUP | MF_BYPOSITION,
997     (UINT_PTR)WinMenu, uimsg);
998 maya 3227 }
999    
1000 doda 8445 TTXModifyMenu(hMenu); /* TTPLUG */
1001 maya 3227 }
1002    
1003     void CVTWindow::InitMenuPopup(HMENU SubMenu)
1004     {
1005     if ( SubMenu == FileMenu )
1006     {
1007 maya 3966 if (ts.DisableMenuNewConnection) {
1008     if ( Connecting || cv.Open ) {
1009 maya 3965 EnableMenuItem(FileMenu,ID_FILE_NEWCONNECTION,MF_BYCOMMAND | MF_GRAYED);
1010     }
1011     else {
1012     EnableMenuItem(FileMenu,ID_FILE_NEWCONNECTION,MF_BYCOMMAND | MF_ENABLED);
1013     }
1014 maya 3227 }
1015 maya 3966 else {
1016     if ( Connecting ) {
1017     EnableMenuItem(FileMenu,ID_FILE_NEWCONNECTION,MF_BYCOMMAND | MF_GRAYED);
1018     }
1019     else {
1020     EnableMenuItem(FileMenu,ID_FILE_NEWCONNECTION,MF_BYCOMMAND | MF_ENABLED);
1021     }
1022     }
1023 maya 3227
1024 zmatsuo 8948 if ( (! cv.Ready) || (!IsSendVarNULL()) ||
1025     (!IsFileVarNULL()) || (cv.PortType==IdFile) ) {
1026 maya 3227 EnableMenuItem(FileMenu,ID_FILE_SENDFILE,MF_BYCOMMAND | MF_GRAYED);
1027     EnableMenuItem(FileMenu,ID_TRANSFER,MF_BYPOSITION | MF_GRAYED); /* Transfer */
1028     EnableMenuItem(FileMenu,ID_FILE_CHANGEDIR,MF_BYCOMMAND | MF_GRAYED);
1029     EnableMenuItem(FileMenu,ID_FILE_DISCONNECT,MF_BYCOMMAND | MF_GRAYED);
1030     EnableMenuItem(FileMenu,ID_FILE_DUPLICATESESSION,MF_BYCOMMAND | MF_GRAYED);
1031     }
1032     else {
1033     EnableMenuItem(FileMenu,ID_FILE_SENDFILE,MF_BYCOMMAND | MF_ENABLED);
1034     EnableMenuItem(FileMenu,ID_TRANSFER,MF_BYPOSITION | MF_ENABLED); /* Transfer */
1035     EnableMenuItem(FileMenu,ID_FILE_CHANGEDIR,MF_BYCOMMAND | MF_ENABLED);
1036     EnableMenuItem(FileMenu,ID_FILE_DISCONNECT,MF_BYCOMMAND | MF_ENABLED);
1037 maya 3964 if (ts.DisableMenuDuplicateSession) {
1038     EnableMenuItem(FileMenu,ID_FILE_DUPLICATESESSION,MF_BYCOMMAND | MF_GRAYED);
1039     }
1040     else {
1041     EnableMenuItem(FileMenu,ID_FILE_DUPLICATESESSION,MF_BYCOMMAND | MF_ENABLED);
1042     }
1043 maya 3227 }
1044    
1045     // �V�K���j���[������ (2004.12.5 yutaka)
1046     EnableMenuItem(FileMenu,ID_FILE_CYGWINCONNECTION,MF_BYCOMMAND | MF_ENABLED);
1047     EnableMenuItem(FileMenu,ID_FILE_TERATERMMENU,MF_BYCOMMAND | MF_ENABLED);
1048     EnableMenuItem(FileMenu,ID_FILE_LOGMEIN,MF_BYCOMMAND | MF_ENABLED);
1049    
1050     // XXX: �������u�����������Alog���O���C�����������B (2005.2.1 yutaka)
1051 zmatsuo 8858 if (FLogIsOpend()) { // ���O�������[�h������
1052 maya 3227 EnableMenuItem(FileMenu,ID_FILE_LOG,MF_BYCOMMAND | MF_GRAYED);
1053     EnableMenuItem(FileMenu,ID_FILE_COMMENTTOLOG, MF_BYCOMMAND | MF_ENABLED);
1054     EnableMenuItem(FileMenu,ID_FILE_VIEWLOG, MF_BYCOMMAND | MF_ENABLED);
1055 maya 3709 EnableMenuItem(FileMenu,ID_FILE_SHOWLOGDIALOG, MF_BYCOMMAND | MF_ENABLED);
1056 doda 8396 EnableMenuItem(FileMenu,ID_FILE_PAUSELOG, MF_BYCOMMAND | MF_ENABLED);
1057     EnableMenuItem(FileMenu,ID_FILE_STOPLOG, MF_BYCOMMAND | MF_ENABLED);
1058 zmatsuo 8857 if (FLogIsPause()) {
1059 doda 8396 CheckMenuItem(FileMenu,ID_FILE_PAUSELOG, MF_BYCOMMAND | MF_CHECKED);
1060     }
1061     else {
1062     CheckMenuItem(FileMenu,ID_FILE_PAUSELOG, MF_BYCOMMAND | MF_UNCHECKED);
1063     }
1064 maya 3227 } else {
1065     EnableMenuItem(FileMenu,ID_FILE_LOG,MF_BYCOMMAND | MF_ENABLED);
1066     EnableMenuItem(FileMenu,ID_FILE_COMMENTTOLOG, MF_BYCOMMAND | MF_GRAYED);
1067     EnableMenuItem(FileMenu,ID_FILE_VIEWLOG, MF_BYCOMMAND | MF_GRAYED);
1068     EnableMenuItem(FileMenu,ID_FILE_SHOWLOGDIALOG, MF_BYCOMMAND | MF_GRAYED);
1069 doda 8396 EnableMenuItem(FileMenu,ID_FILE_PAUSELOG, MF_BYCOMMAND | MF_GRAYED);
1070     EnableMenuItem(FileMenu,ID_FILE_STOPLOG, MF_BYCOMMAND | MF_GRAYED);
1071    
1072     CheckMenuItem(FileMenu,ID_FILE_PAUSELOG, MF_BYCOMMAND | MF_UNCHECKED);
1073 maya 3227 }
1074    
1075     }
1076     else if ( SubMenu == TransMenu )
1077     {
1078     if ((cv.PortType==IdSerial) &&
1079     ((ts.DataBit==IdDataBit7) || (ts.Flow==IdFlowX))) {
1080     EnableMenuItem(TransMenu,1,MF_BYPOSITION | MF_GRAYED); /* XMODEM */
1081     EnableMenuItem(TransMenu,4,MF_BYPOSITION | MF_GRAYED); /* Quick-VAN */
1082     }
1083     else {
1084     EnableMenuItem(TransMenu,1,MF_BYPOSITION | MF_ENABLED); /* XMODEM */
1085     EnableMenuItem(TransMenu,4,MF_BYPOSITION | MF_ENABLED); /* Quick-VAN */
1086     }
1087     if ((cv.PortType==IdSerial) &&
1088     (ts.DataBit==IdDataBit7)) {
1089     EnableMenuItem(TransMenu,2,MF_BYPOSITION | MF_GRAYED); /* ZMODEM */
1090     EnableMenuItem(TransMenu,3,MF_BYPOSITION | MF_GRAYED); /* B-Plus */
1091     }
1092     else {
1093     EnableMenuItem(TransMenu,2,MF_BYPOSITION | MF_ENABLED); /* ZMODEM */
1094     EnableMenuItem(TransMenu,3,MF_BYPOSITION | MF_ENABLED); /* B-Plus */
1095     }
1096     }
1097     else if (SubMenu == EditMenu)
1098     {
1099     if (Selected) {
1100     EnableMenuItem(EditMenu,ID_EDIT_COPY2,MF_BYCOMMAND | MF_ENABLED);
1101     EnableMenuItem(EditMenu,ID_EDIT_COPYTABLE,MF_BYCOMMAND | MF_ENABLED);
1102     }
1103     else {
1104     EnableMenuItem(EditMenu,ID_EDIT_COPY2,MF_BYCOMMAND | MF_GRAYED);
1105     EnableMenuItem(EditMenu,ID_EDIT_COPYTABLE,MF_BYCOMMAND | MF_GRAYED);
1106     }
1107     if (cv.Ready &&
1108 zmatsuo 8948 IsSendVarNULL() && IsFileVarNULL() &&
1109 maya 3227 (cv.PortType!=IdFile) &&
1110     (IsClipboardFormatAvailable(CF_TEXT) ||
1111     IsClipboardFormatAvailable(CF_OEMTEXT))) {
1112     EnableMenuItem(EditMenu,ID_EDIT_PASTE2,MF_BYCOMMAND | MF_ENABLED);
1113     EnableMenuItem(EditMenu,ID_EDIT_PASTECR,MF_BYCOMMAND | MF_ENABLED);
1114     }
1115     else {
1116     EnableMenuItem(EditMenu,ID_EDIT_PASTE2,MF_BYCOMMAND | MF_GRAYED);
1117     EnableMenuItem(EditMenu,ID_EDIT_PASTECR,MF_BYCOMMAND | MF_GRAYED);
1118     }
1119     }
1120     else if (SubMenu == SetupMenu)
1121 yutakapon 8179 /*
1122     * �l�b�g���[�N������(TCP/IP���I������������������)���V���A���|�[�g
1123     * (ID_SETUP_SERIALPORT)�����j���[���I�����������������������������A
1124     * �����K�[�h���O���A�V���A���|�[�g�����_�C�A���O�����V���������������������������B
1125     */
1126 zmatsuo 8948 if (!IsSendVarNULL() || !IsFileVarNULL() || Connecting) {
1127 yutakapon 8179 EnableMenuItem(SetupMenu,ID_SETUP_SERIALPORT,MF_BYCOMMAND | MF_GRAYED);
1128 maya 3392 }
1129     else {
1130 yutakapon 8179 EnableMenuItem(SetupMenu,ID_SETUP_SERIALPORT,MF_BYCOMMAND | MF_ENABLED);
1131 maya 3392 }
1132 maya 3227
1133     else if (SubMenu == ControlMenu)
1134     {
1135     if (cv.Ready &&
1136 zmatsuo 8948 IsSendVarNULL() && IsFileVarNULL()) {
1137 maya 3283 if (ts.DisableMenuSendBreak) {
1138 maya 3279 EnableMenuItem(ControlMenu,ID_CONTROL_SENDBREAK,MF_BYCOMMAND | MF_GRAYED);
1139     }
1140     else {
1141     EnableMenuItem(ControlMenu,ID_CONTROL_SENDBREAK,MF_BYCOMMAND | MF_ENABLED);
1142     }
1143 maya 3392 if (cv.PortType==IdSerial) {
1144 maya 3227 EnableMenuItem(ControlMenu,ID_CONTROL_RESETPORT,MF_BYCOMMAND | MF_ENABLED);
1145 maya 3392 }
1146     else {
1147 maya 3227 EnableMenuItem(ControlMenu,ID_CONTROL_RESETPORT,MF_BYCOMMAND | MF_GRAYED);
1148 maya 3392 }
1149 maya 3227 }
1150     else {
1151     EnableMenuItem(ControlMenu,ID_CONTROL_SENDBREAK,MF_BYCOMMAND | MF_GRAYED);
1152     EnableMenuItem(ControlMenu,ID_CONTROL_RESETPORT,MF_BYCOMMAND | MF_GRAYED);
1153     }
1154    
1155 zmatsuo 8948 if (cv.Ready && cv.TelFlag && IsFileVarNULL()) {
1156 maya 3227 EnableMenuItem(ControlMenu,ID_CONTROL_AREYOUTHERE,MF_BYCOMMAND | MF_ENABLED);
1157 maya 3392 }
1158     else {
1159 maya 3227 EnableMenuItem(ControlMenu,ID_CONTROL_AREYOUTHERE,MF_BYCOMMAND | MF_GRAYED);
1160 maya 3392 }
1161 maya 3227
1162 maya 3392 if (HTEKWin==0) {
1163 maya 3227 EnableMenuItem(ControlMenu,ID_CONTROL_CLOSETEK,MF_BYCOMMAND | MF_GRAYED);
1164 maya 3392 }
1165     else {
1166 maya 3227 EnableMenuItem(ControlMenu,ID_CONTROL_CLOSETEK,MF_BYCOMMAND | MF_ENABLED);
1167 maya 3392 }
1168 maya 3227
1169 zmatsuo 8948 if (DDELog || !IsFileVarNULL()) {
1170 maya 3227 EnableMenuItem(ControlMenu,ID_CONTROL_MACRO,MF_BYCOMMAND | MF_GRAYED);
1171 maya 3842 EnableMenuItem(ControlMenu,ID_CONTROL_SHOW_MACRO,MF_BYCOMMAND | MF_ENABLED);
1172 maya 3392 }
1173     else {
1174 yutakapon 3837 EnableMenuItem(ControlMenu,ID_CONTROL_MACRO,MF_BYCOMMAND | MF_ENABLED);
1175 maya 3842 EnableMenuItem(ControlMenu,ID_CONTROL_SHOW_MACRO,MF_BYCOMMAND | MF_GRAYED);
1176 maya 3392 }
1177 maya 3227
1178     }
1179     else if (SubMenu == WinMenu)
1180     {
1181 yutakapon 5249 SetWinMenu(WinMenu, ts.UIMsg, sizeof(ts.UIMsg), ts.UILanguageFile, 1);
1182 maya 3227 }
1183    
1184     TTXModifyPopupMenu(SubMenu); /* TTPLUG */
1185     }
1186    
1187     // added ConfirmPasteMouseRButton (2007.3.17 maya)
1188     void CVTWindow::InitPasteMenu(HMENU *Menu)
1189     {
1190 doda 8445 static const DlgTextInfo MenuTextInfo[] = {
1191     { ID_EDIT_PASTE2, "MENU_EDIT_PASTE" },
1192     { ID_EDIT_PASTECR, "MENU_EDIT_PASTECR" },
1193     };
1194 zmatsuo 7916 *Menu = LoadMenu(m_hInst,
1195 maya 3227 MAKEINTRESOURCE(IDR_PASTEMENU));
1196 doda 8445 SetDlgMenuTexts(*Menu, MenuTextInfo, _countof(MenuTextInfo), ts.UILanguageFile);
1197 maya 3227 }
1198    
1199     void CVTWindow::ResetSetup()
1200     {
1201     ChangeFont();
1202     BuffChangeWinSize(WinWidth,WinHeight);
1203     ChangeCaret();
1204    
1205     if (cv.Ready) {
1206     ts.PortType = cv.PortType;
1207     if (cv.PortType==IdSerial) {
1208     /* if serial port, change port parameters */
1209     ts.ComPort = cv.ComPort;
1210     CommResetSerial(&ts, &cv, TRUE);
1211     }
1212     }
1213    
1214     /* setup terminal */
1215     SetupTerm();
1216    
1217     /* background and ANSI color */
1218     #ifdef ALPHABLEND_TYPE2
1219 yutakapon 8106 BGInitialize(FALSE);
1220 maya 3227 BGSetupPrimary(TRUE);
1221     // 2006/03/17 by 337 : Alpha�l���������X
1222     // Layered��������������������������������
1223 yutakapon 6553 //
1224     // AlphaBlend ���������f�����������������B
1225     // (2016.12.24 yutaka)
1226 zmatsuo 7390 SetWindowAlpha(ts.AlphaBlendActive);
1227 maya 3227 #else
1228     DispApplyANSIColor();
1229     #endif
1230     DispSetNearestColors(IdBack, IdFore+8, NULL);
1231    
1232     /* setup window */
1233     ChangeWin();
1234    
1235     /* Language & IME */
1236     ResetIME();
1237    
1238     /* change TEK window */
1239     if (pTEKWin != NULL)
1240     ((CTEKWindow *)pTEKWin)->RestoreSetup();
1241     }
1242    
1243     void CVTWindow::RestoreSetup()
1244     {
1245     char TempDir[MAXPATHLEN];
1246 maya 4031 char TempName[MAX_PATH];
1247 maya 3227
1248 maya 3392 if ( strlen(ts.SetupFName)==0 ) {
1249 maya 3227 return;
1250 maya 3392 }
1251 maya 3227
1252     ExtractFileName(ts.SetupFName,TempName,sizeof(TempName));
1253     ExtractDirName(ts.SetupFName,TempDir);
1254     if (TempDir[0]==0)
1255     strncpy_s(TempDir, sizeof(TempDir),ts.HomeDir, _TRUNCATE);
1256     FitFileName(TempName,sizeof(TempName),".INI");
1257    
1258     strncpy_s(ts.SetupFName, sizeof(ts.SetupFName),TempDir, _TRUNCATE);
1259     AppendSlash(ts.SetupFName,sizeof(ts.SetupFName));
1260 maya 3392 strncat_s(ts.SetupFName,sizeof(ts.SetupFName),TempName,_TRUNCATE);
1261 maya 3227
1262 maya 3392 if (LoadTTSET()) {
1263 maya 3227 (*ReadIniFile)(ts.SetupFName,&ts);
1264 maya 3392 }
1265 maya 3227 FreeTTSET();
1266    
1267     #if 0
1268     ChangeDefaultSet(&ts,NULL);
1269     #endif
1270    
1271     ResetSetup();
1272     }
1273    
1274     /* called by the [Setup] Terminal command */
1275     void CVTWindow::SetupTerm()
1276     {
1277 doda 3407 if (ts.Language==IdJapanese || ts.Language==IdKorean || ts.Language==IdUtf8) {
1278 maya 3227 ResetCharSet();
1279 maya 3393 }
1280 maya 3227 cv.CRSend = ts.CRSend;
1281    
1282     // for russian mode
1283     cv.RussHost = ts.RussHost;
1284     cv.RussClient = ts.RussClient;
1285    
1286 doda 3932 if (cv.Ready) {
1287     if (cv.TelFlag && (ts.TelEcho>0)) {
1288     TelChangeEcho();
1289     }
1290 maya 3392 }
1291 maya 3227
1292     if ((ts.TerminalWidth!=NumOfColumns) ||
1293     (ts.TerminalHeight!=NumOfLines-StatusLine)) {
1294     LockBuffer();
1295     HideStatusLine();
1296     ChangeTerminalSize(ts.TerminalWidth,
1297     ts.TerminalHeight);
1298     UnlockBuffer();
1299     }
1300     else if ((ts.TermIsWin>0) &&
1301     ((ts.TerminalWidth!=WinWidth) ||
1302 maya 3392 (ts.TerminalHeight!=WinHeight-StatusLine))) {
1303 maya 3227 BuffChangeWinSize(ts.TerminalWidth,ts.TerminalHeight+StatusLine);
1304 maya 3392 }
1305 doda 4246
1306     ChangeTerminalID();
1307 maya 3227 }
1308    
1309     void CVTWindow::Startup()
1310     {
1311     /* auto log */
1312     /* OnCommOpen ���J�n�������������������J�n������ (2007.5.14 maya) */
1313    
1314     if ((TopicName[0]==0) && (ts.MacroFN[0]!=0)) {
1315     // start the macro specified in the command line or setup file
1316     RunMacro(ts.MacroFN,TRUE);
1317     ts.MacroFN[0] = 0;
1318     }
1319     else {// start connection
1320 maya 3392 if (TopicName[0]!=0) {
1321 maya 3227 cv.NoMsg=1; /* suppress error messages */
1322 maya 3392 }
1323 maya 3227 ::PostMessage(HVTWin,WM_USER_COMMSTART,0,0);
1324     }
1325     }
1326    
1327     void CVTWindow::OpenTEK()
1328     {
1329     ActiveWin = IdTEK;
1330     if (HTEKWin==NULL) {
1331 zmatsuo 7916 pTEKWin = new CTEKWindow(m_hInst);
1332 maya 3227 }
1333     else {
1334     ::ShowWindow(HTEKWin,SW_SHOWNORMAL);
1335     ::SetFocus(HTEKWin);
1336     }
1337     }
1338    
1339     /////////////////////////////////////////////////////////////////////////////
1340     // CVTWindow message handler
1341    
1342     BOOL CVTWindow::OnCommand(WPARAM wParam, LPARAM lParam)
1343     {
1344     WORD wID = LOWORD(wParam);
1345     WORD wNotifyCode = HIWORD(wParam);
1346    
1347     if (wNotifyCode==1) {
1348     switch (wID) {
1349     case ID_ACC_SENDBREAK:
1350     // added DisableAcceleratorSendBreak (2007.3.17 maya)
1351     if (!ts.DisableAcceleratorSendBreak)
1352     OnControlSendBreak();
1353     return TRUE;
1354     case ID_ACC_AREYOUTHERE:
1355     OnControlAreYouThere();
1356     return TRUE;
1357     }
1358     if (ActiveWin==IdVT) {
1359     switch (wID) {
1360     case ID_ACC_NEWCONNECTION:
1361 maya 5684 if (ts.AcceleratorNewConnection)
1362     OnFileNewConnection();
1363 maya 3227 return TRUE;
1364 maya 5691 case ID_ACC_DUPLICATESESSION:
1365     // added DisableAcceleratorDuplicateSession (2009.4.6 maya)
1366     if (!ts.DisableAcceleratorDuplicateSession)
1367     OnDuplicateSession();
1368     return TRUE;
1369 maya 5684 case ID_ACC_CYGWINCONNECTION:
1370     if (ts.AcceleratorCygwinConnection)
1371     OnCygwinConnection();
1372     return TRUE;
1373 maya 5691 case ID_ACC_DISCONNECT:
1374     Disconnect(TRUE);
1375     return TRUE;
1376 maya 3227 case ID_ACC_COPY:
1377     OnEditCopy();
1378     return TRUE;
1379 doda 6459 case ID_ACC_PASTECR:
1380     OnEditPasteCR();
1381     return TRUE;
1382     case ID_ACC_PASTE:
1383     OnEditPaste();
1384     return TRUE;
1385 maya 3227 case ID_ACC_PRINT:
1386     OnFilePrint();
1387     return TRUE;
1388     case ID_ACC_EXIT:
1389     OnFileExit();
1390     return TRUE;
1391     }
1392     }
1393     else { // transfer accelerator message to TEK win
1394     switch (wID) {
1395     case ID_ACC_COPY:
1396     ::PostMessage(HTEKWin,WM_COMMAND,ID_TEKEDIT_COPY,0);
1397     return TRUE;
1398 doda 6459 case ID_ACC_PASTECR:
1399     ::PostMessage(HTEKWin,WM_COMMAND,ID_TEKEDIT_PASTECR,0);
1400     return TRUE;
1401     case ID_ACC_PASTE:
1402     ::PostMessage(HTEKWin,WM_COMMAND,ID_TEKEDIT_PASTE,0);
1403     return TRUE;
1404 maya 3227 case ID_ACC_PRINT:
1405     ::PostMessage(HTEKWin,WM_COMMAND,ID_TEKFILE_PRINT,0);
1406     return TRUE;
1407     case ID_ACC_EXIT:
1408     ::PostMessage(HTEKWin,WM_COMMAND,ID_TEKFILE_EXIT,0);
1409     return TRUE;
1410     }
1411     }
1412     }
1413    
1414     if ((wID>=ID_WINDOW_1) && (wID<ID_WINDOW_1+9)) {
1415     SelectWin(wID-ID_WINDOW_1);
1416     return TRUE;
1417     }
1418     else {
1419 maya 3392 if (TTXProcessCommand(HVTWin, wID)) {
1420 maya 3227 return TRUE;
1421 maya 3392 }
1422     else { /* TTPLUG */
1423 zmatsuo 7784 return TTCFrameWnd::OnCommand(wParam, lParam);
1424 maya 3392 }
1425 maya 3227 }
1426     }
1427    
1428 zmatsuo 7528 void CVTWindow::OnActivate(UINT nState, HWND pWndOther, BOOL bMinimized)
1429 maya 3227 {
1430     DispSetActive(nState!=WA_INACTIVE);
1431 zmatsuo 7390 if (nState == WA_INACTIVE) {
1432     SetWindowAlpha(ts.AlphaBlendInactive);
1433     } else {
1434     SetWindowAlpha(ts.AlphaBlendActive);
1435     }
1436 maya 3227 }
1437    
1438 zmatsuo 9143 /**
1439     * �L�[�{�[�h����1��������
1440     * @param nChar UTF-16 char(wchar_t) IsWindowUnicode() == TRUE ��
1441     * ANSI char(char) IsWindowUnicode() == FALSE ��
1442     */
1443 zmatsuo 8337 void CVTWindow::OnChar(WPARAM nChar, UINT nRepCnt, UINT nFlags)
1444 maya 3227 {
1445     unsigned int i;
1446    
1447 maya 3392 if (!KeybEnabled || (TalkStatus!=IdTalkKeyb)) {
1448 maya 3227 return;
1449 maya 3392 }
1450 maya 3227
1451 doda 4414 if (MetaKey(ts.MetaKey)) {
1452 maya 3227 ::PostMessage(HVTWin,WM_SYSCHAR,nChar,MAKELONG(nRepCnt,nFlags));
1453     return;
1454     }
1455    
1456 zmatsuo 9143 wchar_t u16;
1457     if (IsWindowUnicode(HVTWin) == TRUE) {
1458     // ������ UTF-16
1459     u16 = (wchar_t)nChar;
1460     } else {
1461 zmatsuo 9150 // ������ ANSI
1462     // ANSI(ACP) -> UTF-32 -> UTF-16
1463     const char mb_str[2] = {(char)nChar, 0};
1464 zmatsuo 9143 unsigned int u32;
1465 zmatsuo 9150 size_t mb_len = MBCPToUTF32(mb_str, 1, CP_ACP, &u32);
1466     if (mb_len == 0) {
1467 zmatsuo 9143 return;
1468     }
1469 zmatsuo 9150 u16 = (wchar_t)u32;
1470 zmatsuo 9143 }
1471    
1472     // �o�b�t�@���o���A�������o��
1473 maya 3227 for (i=1 ; i<=nRepCnt ; i++) {
1474 doda 8445 CommTextOutW(&cv,&u16,1);
1475 maya 3392 if (ts.LocalEcho>0) {
1476 doda 8445 CommTextEchoW(&cv,&u16,1);
1477 maya 3392 }
1478 maya 3227 }
1479    
1480 doda 6421 // �X�N���[�����u�����Z�b�g
1481     if (WinOrgY != 0) {
1482 maya 3227 DispVScroll(SCROLL_BOTTOM, 0);
1483     }
1484     }
1485    
1486 zmatsuo 8827 LRESULT CVTWindow::OnUniChar(WPARAM wParam, LPARAM lParam)
1487     {
1488     if (wParam == UNICODE_NOCHAR) {
1489     // �������b�Z�[�W���T�|�[�g�����������e�X�g��������������������
1490     return TRUE;
1491     }
1492    
1493     char32_t u32 = (char32_t)wParam;
1494     wchar_t strW[2];
1495     size_t u16_len = UTF32ToUTF16(u32, strW, _countof(strW));
1496     CommTextOutW(&cv, strW, u16_len);
1497     if (ts.LocalEcho > 0) {
1498     CommTextEchoW(&cv, strW, u16_len);
1499     }
1500    
1501     return FALSE;
1502     }
1503    
1504 maya 3227 /* copy from ttset.c*/
1505 zmatsuo 8463 static void WriteInt2(const char *Sect, const char *Key, const char *FName, int i1, int i2)
1506 maya 3227 {
1507     char Temp[32];
1508     _snprintf_s(Temp, sizeof(Temp), _TRUNCATE, "%d,%d", i1, i2);
1509     WritePrivateProfileString(Sect, Key, Temp, FName);
1510     }
1511    
1512     static void SaveVTPos()
1513     {
1514     #define Section "Tera Term"
1515     if (ts.SaveVTWinPos) {
1516     /* VT win position */
1517     WriteInt2(Section, "VTPos", ts.SetupFName, ts.VTPos.x, ts.VTPos.y);
1518    
1519     /* VT terminal size */
1520     WriteInt2(Section, "TerminalSize", ts.SetupFName,
1521     ts.TerminalWidth, ts.TerminalHeight);
1522     }
1523     }
1524    
1525     void CVTWindow::OnClose()
1526     {
1527     if ((HTEKWin!=NULL) && ! ::IsWindowEnabled(HTEKWin)) {
1528     MessageBeep(0);
1529     return;
1530     }
1531 zmatsuo 8479
1532 maya 3227 if (cv.Ready && (cv.PortType==IdTCPIP) &&
1533     ((ts.PortFlag & PF_CONFIRMDISCONN) != 0) &&
1534 zmatsuo 8479 ! CloseTT) {
1535     wchar_t uimsg[MAX_UIMSG];
1536     get_lang_msgW("MSG_DISCONNECT_CONF", uimsg, _countof(uimsg),
1537     L"Disconnect?", ts.UILanguageFile);
1538     int result = _MessageBoxW(HVTWin, uimsg, L"Tera Term",
1539     MB_OKCANCEL | MB_ICONEXCLAMATION | MB_DEFBUTTON2);
1540     if (result == IDCANCEL) {
1541     return;
1542     }
1543 maya 3392 }
1544 maya 3227
1545 zmatsuo 8900 FLogClose();
1546 zmatsuo 9067 FileSendEnd();
1547 maya 3227 ProtoEnd();
1548    
1549     SaveVTPos();
1550     DestroyWindow();
1551     }
1552    
1553 yutakapon 5232 // �STera Term���I�����w������
1554     void CVTWindow::OnAllClose()
1555     {
1556 yutakapon 5351 // ���R�I���������������������A�����������[�U���������������o�������������B
1557     // (2013.8.17 yutaka)
1558 zmatsuo 8487 wchar_t uimsg[MAX_UIMSG];
1559    
1560     get_lang_msgW("MSG_ALL_TERMINATE_CONF", uimsg, _countof(uimsg), L"Terminate ALL Tera Term(s)?", ts.UILanguageFile);
1561     if (_MessageBoxW(HVTWin, uimsg, L"Tera Term", MB_OKCANCEL | MB_ICONERROR | MB_DEFBUTTON2) == IDCANCEL)
1562 yutakapon 5351 return;
1563    
1564 yutakapon 5232 BroadcastClosingMessage(HVTWin);
1565     }
1566    
1567     // �I������������������Tera Term���I�������BOnAllClose()���M�p�B
1568 zmatsuo 7896 LRESULT CVTWindow::OnNonConfirmClose(WPARAM wParam, LPARAM lParam)
1569 yutakapon 5232 {
1570     // ������ ts �����e�����}�I���������������A�I�����������Z�[�u�����������������������A�������������B
1571     ts.PortFlag &= ~PF_CONFIRMDISCONN;
1572     OnClose();
1573     return 1;
1574     }
1575    
1576 maya 3227 void CVTWindow::OnDestroy()
1577     {
1578     // remove this window from the window list
1579     UnregWin(HVTWin);
1580    
1581 salarm 6100 // USB�f�o�C�X�������m����
1582     UnRegDeviceNotify(HVTWin);
1583    
1584 maya 3227 EndKeyboard();
1585    
1586     /* Disable drag-drop */
1587     ::DragAcceptFiles(HVTWin,FALSE);
1588 zmatsuo 7148 DropListFree();
1589 maya 3227
1590     EndDDE();
1591    
1592 maya 3392 if (cv.TelFlag) {
1593 maya 3227 EndTelnet();
1594 maya 3392 }
1595 maya 3227 CommClose(&cv);
1596    
1597 zmatsuo 7485 FreeIME(HVTWin);
1598 maya 3227 FreeTTSET();
1599 zmatsuo 7515 #if 0 // free�����s��������free��������
1600 maya 3227 do { }
1601 maya 3392 while (FreeTTDLG());
1602 zmatsuo 7515 #endif
1603 maya 3227
1604 zmatsuo 9055 #if 0
1605 maya 3227 do { }
1606 maya 3392 while (FreeTTFILE());
1607 zmatsuo 9055 #endif
1608 maya 3227
1609 maya 3392 if (HTEKWin != NULL) {
1610 maya 3227 ::DestroyWindow(HTEKWin);
1611 maya 3392 }
1612 maya 3227
1613 doda 3450 EndTerm();
1614 maya 3227 EndDisp();
1615    
1616     FreeBuffer();
1617    
1618     TTXEnd(); /* TTPLUG */
1619 doda 6662
1620     DeleteNotifyIcon(&cv);
1621 maya 3227 }
1622    
1623 doda 8445 static void EscapeFilename(const wchar_t *src, wchar_t *dest)
1624 maya 3227 {
1625 doda 8445 #define ESCAPE_CHARS L" ;&()$!`'[]{}#^~"
1626     const wchar_t *s = src;
1627     wchar_t *d = dest;
1628 zmatsuo 7148 while (*s) {
1629 doda 8445 wchar_t c = *s++;
1630     if (c == L'\\') {
1631 zmatsuo 7148 // �p�X���������� \ -> / ��
1632     *d = '/';
1633 doda 8445 } else if (wcschr(ESCAPE_CHARS, c) != NULL) {
1634 zmatsuo 7148 // �G�X�P�[�v���K�v������
1635 doda 8445 *d++ = L'\\';
1636 zmatsuo 7148 *d = c;
1637     } else {
1638     *d = c;
1639     }
1640     d++;
1641     }
1642     *d = '\0'; // null-terminate
1643     }
1644 maya 3227
1645 zmatsuo 9175 static wchar_t *GetPasteString(const wchar_t *str, bool escape)
1646 zmatsuo 7148 {
1647 doda 8445 wchar_t *tmpbuf;
1648     if (!escape) {
1649     tmpbuf = _wcsdup(str);
1650     }
1651     else {
1652     const size_t len = wcslen(str) * sizeof(wchar_t) * 2;
1653     tmpbuf = (wchar_t *)malloc(len);
1654 zmatsuo 7148 EscapeFilename(str, tmpbuf);
1655     }
1656 zmatsuo 9175 return tmpbuf;
1657 zmatsuo 7148 }
1658 yutakapon 4891
1659 zmatsuo 7148 /* �������t�@�C������(�t�H���_������������) */
1660 doda 8445 static bool SendScp(wchar_t *Filenames[], int FileCount, const char *SendDir)
1661 zmatsuo 7148 {
1662     typedef int (CALLBACK *PSSH_start_scp)(char *, char *);
1663     static PSSH_start_scp func = NULL;
1664     static HMODULE h = NULL;
1665     char msg[128];
1666 yutakapon 4891
1667 zmatsuo 7148 if (h == NULL) {
1668     if ( ((h = GetModuleHandle("ttxssh.dll")) == NULL) ) {
1669     _snprintf_s(msg, sizeof(msg), _TRUNCATE, "GetModuleHandle(\"ttxssh.dll\")) %d", GetLastError());
1670     scp_send_error:
1671     ::MessageBox(NULL, msg, "Tera Term: scpsend command error", MB_OK | MB_ICONERROR);
1672     return false;
1673     }
1674     }
1675     if (func == NULL) {
1676     func = (PSSH_start_scp)GetProcAddress(h, "TTXScpSendfile");
1677     if (func == NULL) {
1678     _snprintf_s(msg, sizeof(msg), _TRUNCATE, "GetProcAddress(\"TTXScpSendfile\")) %d", GetLastError());
1679     goto scp_send_error;
1680     }
1681     }
1682 yutakapon 4891
1683 zmatsuo 7148 for (int i = 0; i < FileCount; i++) {
1684 doda 8445 char *FileName = ToU8W(Filenames[i]);
1685 zmatsuo 8449 func(FileName, ts.ScpSendDir);
1686 doda 8445 free(FileName);
1687 zmatsuo 7148 }
1688     return true;
1689     }
1690 doda 6620
1691 zmatsuo 7148 void CVTWindow::DropListFree()
1692     {
1693     if (DropListCount > 0) {
1694     for (int i = 0; i < DropListCount; i++) {
1695     free(DropLists[i]);
1696     DropLists[i] = NULL;
1697     }
1698     free(DropLists);
1699     DropLists = NULL;
1700     DropListCount = 0;
1701     }
1702     }
1703 yutakapon 4891
1704 zmatsuo 7896 LRESULT CVTWindow::OnDropNotify(WPARAM ShowDialog, LPARAM lParam)
1705 zmatsuo 7148 {
1706     // ini���������������A�����s��������Tera Term�������L��������
1707     static enum drop_type DefaultDropType = DROP_TYPE_CANCEL;
1708     static unsigned char DefaultDropTypePaste = DROP_TYPE_PASTE_ESCAPE;
1709     static bool DefaultShowDialog = ts.ConfirmFileDragAndDrop ? true : false;
1710 doda 6620
1711 zmatsuo 7148 (void)lParam;
1712     int FileCount = 0;
1713     int DirectoryCount = 0;
1714     for (int i = 0; i < DropListCount; i++) {
1715 doda 8445 const wchar_t *FileName = DropLists[i];
1716     const DWORD attr = _GetFileAttributesW(FileName);
1717 zmatsuo 7650 if (attr == INVALID_FILE_ATTRIBUTES) {
1718 zmatsuo 7536 FileCount++;
1719     } else if (attr & FILE_ATTRIBUTE_DIRECTORY) {
1720 zmatsuo 7148 DirectoryCount++;
1721     } else {
1722     FileCount++;
1723     }
1724     }
1725 yutakapon 4891
1726 zmatsuo 7148 bool DoSameProcess = false;
1727     const bool isSSH = (cv.isSSH == 2);
1728     enum drop_type DropType;
1729     unsigned char DropTypePaste = DROP_TYPE_PASTE_ESCAPE;
1730     if (DefaultDropType == DROP_TYPE_CANCEL) {
1731     // default is not set
1732     if (!ShowDialog) {
1733     if (FileCount == 1 && DirectoryCount == 0) {
1734     if (ts.ConfirmFileDragAndDrop) {
1735     if (isSSH) {
1736     DropType = DROP_TYPE_SCP;
1737     } else {
1738     DropType = DROP_TYPE_SEND_FILE;
1739 yutakapon 4891 }
1740 zmatsuo 7148 DoSameProcess = false;
1741     } else {
1742     DropType = DROP_TYPE_SEND_FILE;
1743     DoSameProcess = DefaultShowDialog ? false : true;
1744     }
1745     } else if (FileCount == 0 && DirectoryCount == 1) {
1746     DropType = DROP_TYPE_PASTE_FILENAME;
1747     DoSameProcess = DefaultShowDialog ? false : true;
1748     } else if (FileCount > 0 && DirectoryCount > 0) {
1749     DropType = DROP_TYPE_PASTE_FILENAME;
1750     DoSameProcess = false;
1751     } else if (FileCount > 0 && DirectoryCount == 0) {
1752     // filename only
1753     if (isSSH) {
1754     DropType = DROP_TYPE_SCP;
1755     } else {
1756     DropType = DROP_TYPE_SEND_FILE;
1757     }
1758     DoSameProcess = false;
1759     } else {
1760     // directory only
1761     DropType = DROP_TYPE_PASTE_FILENAME;
1762     DoSameProcess = ts.ConfirmFileDragAndDrop ? false : true;
1763     }
1764     } else {
1765     // show dialog
1766     if (DirectoryCount > 0) {
1767     DropType = DROP_TYPE_PASTE_FILENAME;
1768     } else {
1769     if (isSSH) {
1770     DropType = DROP_TYPE_SCP;
1771     } else {
1772     DropType = DROP_TYPE_SEND_FILE;
1773     }
1774     }
1775     DoSameProcess = false;
1776     }
1777     } else {
1778     if (DirectoryCount > 0 &&
1779     (DefaultDropType == DROP_TYPE_SEND_FILE ||
1780     DefaultDropType == DROP_TYPE_SEND_FILE_BINARY ||
1781     DefaultDropType == DROP_TYPE_SCP))
1782     { // �f�t�H���g�����������������������g��������
1783     DropType = DROP_TYPE_PASTE_FILENAME;
1784     DropTypePaste = DefaultDropTypePaste;
1785     DoSameProcess = false;
1786     } else {
1787     DropType = DefaultDropType;
1788     DropTypePaste = DefaultDropTypePaste;
1789     DoSameProcess = (ShowDialog || DefaultShowDialog) ? false : true;
1790     }
1791     }
1792 yutakapon 4891
1793 zmatsuo 7148 for (int i = 0; i < DropListCount; i++) {
1794 doda 8445 const wchar_t *FileName = DropLists[i];
1795 yutakapon 4891
1796 zmatsuo 7148 if (!DoSameProcess) {
1797     bool DoSameProcessNextDrop;
1798     bool DoNotShowDialog = !DefaultShowDialog;
1799 zmatsuo 7706 SetDialogFont(ts.DialogFontName, ts.DialogFontPoint, ts.DialogFontCharSet,
1800 zmatsuo 7589 ts.UILanguageFile, "Tera Term", "DLG_SYSTEM_FONT");
1801 zmatsuo 7148 DropType =
1802 zmatsuo 7916 ShowDropDialogBox(m_hInst, HVTWin,
1803 zmatsuo 7148 FileName, DropType,
1804     DropListCount - i,
1805     (DirectoryCount == 0 && isSSH) ? true : false,
1806     DirectoryCount == 0 ? true : false,
1807 zmatsuo 7172 &ts,
1808 zmatsuo 7148 &DropTypePaste,
1809     &DoSameProcess,
1810     &DoSameProcessNextDrop,
1811     &DoNotShowDialog);
1812     if (DropType == DROP_TYPE_CANCEL) {
1813     goto finish;
1814     }
1815     if (DoSameProcessNextDrop) {
1816     DefaultDropType = DropType;
1817     DefaultDropTypePaste = DropTypePaste;
1818     }
1819     if (!ts.ConfirmFileDragAndDrop) {
1820     DefaultShowDialog = !DoNotShowDialog;
1821     }
1822     }
1823 zmatsuo 7322
1824 zmatsuo 7148 switch (DropType) {
1825     case DROP_TYPE_CANCEL:
1826     default:
1827     // cancel
1828     break;
1829     case DROP_TYPE_SEND_FILE:
1830 zmatsuo 9146 SendMemSendFile(FileName, FALSE, SENDMEM_DELAYTYPE_NO_DELAY, 0, 0);
1831 zmatsuo 8449 break;
1832 zmatsuo 7148 case DROP_TYPE_SEND_FILE_BINARY:
1833 zmatsuo 9146 SendMemSendFile(FileName, TRUE, SENDMEM_DELAYTYPE_NO_DELAY, 0, 0);
1834 zmatsuo 7148 break;
1835     case DROP_TYPE_PASTE_FILENAME:
1836     {
1837     const bool escape = (DropTypePaste & DROP_TYPE_PASTE_ESCAPE) ? true : false;
1838 doda 7195
1839     TermSendStartBracket();
1840    
1841 zmatsuo 9175 wchar_t *str = GetPasteString(FileName, escape);
1842     TermPasteStringNoBracket(str, wcslen(str));
1843     free(str);
1844 zmatsuo 7148 if (DropListCount > 1 && i < DropListCount - 1) {
1845 zmatsuo 9175 if (DropTypePaste & DROP_TYPE_PASTE_NEWLINE) {
1846     TermPasteStringNoBracket(L"\x0d", 1); // ���s(CR,0x0d)
1847     }
1848     else {
1849     TermPasteStringNoBracket(L" ", 1); // space
1850     }
1851 zmatsuo 7148 }
1852 doda 7195
1853     TermSendEndBracket();
1854    
1855 zmatsuo 7148 break;
1856     }
1857     case DROP_TYPE_SCP:
1858     {
1859     // send by scp
1860 doda 8445 wchar_t **FileNames = &DropLists[i];
1861 zmatsuo 7148 int FileCount = DoSameProcess ? DropListCount - i : 1;
1862     if (!SendScp(FileNames, FileCount, ts.ScpSendDir)) {
1863     goto finish;
1864     }
1865     i += FileCount - 1;
1866     break;
1867     }
1868     }
1869     }
1870 yutakapon 4891
1871 zmatsuo 7148 finish:
1872     DropListFree();
1873     return 0;
1874 maya 3227 }
1875    
1876     void CVTWindow::OnDropFiles(HDROP hDropInfo)
1877     {
1878     ::SetForegroundWindow(HVTWin);
1879 zmatsuo 8948 if (cv.Ready && IsSendVarNULL())
1880 maya 3227 {
1881 zmatsuo 7148 const UINT ShowDialog =
1882     ((GetAsyncKeyState(VK_CONTROL) & 0x8000) != 0) ? 1 : 0;
1883 doda 8445 DropListCount = _DragQueryFileW(hDropInfo, -1, NULL, 0);
1884     DropLists = (wchar_t **)malloc(sizeof(wchar_t *) * DropListCount);
1885 maya 3227
1886 zmatsuo 7148 for (int i = 0; i < DropListCount; i++) {
1887 doda 8445 const UINT cch = _DragQueryFileW(hDropInfo, i, NULL, 0);
1888     if (cch == 0) {
1889     continue;
1890     }
1891     wchar_t *FileName = (wchar_t *)malloc(sizeof(wchar_t) * (cch + 1));
1892     _DragQueryFileW(hDropInfo,i,FileName,cch + 1);
1893     FileName[cch] = '\0';
1894 zmatsuo 7148 DropLists[i] = FileName;
1895     }
1896 maya 3227
1897 zmatsuo 7148 ::PostMessage(HVTWin, WM_USER_DROPNOTIFY, ShowDialog, 0);
1898 maya 3227 }
1899     DragFinish(hDropInfo);
1900     }
1901    
1902 doda 6801 void CVTWindow::OnGetMinMaxInfo(MINMAXINFO *lpMMI)
1903 maya 3227 {
1904     #ifndef WINDOW_MAXMIMUM_ENABLED
1905     lpMMI->ptMaxSize.x = 10000;
1906     lpMMI->ptMaxSize.y = 10000;
1907     lpMMI->ptMaxTrackSize.x = 10000;
1908     lpMMI->ptMaxTrackSize.y = 10000;
1909     #endif
1910     }
1911    
1912 zmatsuo 7528 void CVTWindow::OnHScroll(UINT nSBCode, UINT nPos, HWND pScrollBar)
1913 maya 3227 {
1914     int Func;
1915    
1916     switch (nSBCode) {
1917     case SB_BOTTOM:
1918     Func = SCROLL_BOTTOM;
1919     break;
1920     case SB_ENDSCROLL:
1921     return;
1922     case SB_LINEDOWN:
1923     Func = SCROLL_LINEDOWN;
1924     break;
1925     case SB_LINEUP:
1926     Func = SCROLL_LINEUP;
1927     break;
1928     case SB_PAGEDOWN:
1929     Func = SCROLL_PAGEDOWN;
1930     break;
1931 doda 6435 case SB_PAGEUP:
1932 maya 3227 Func = SCROLL_PAGEUP;
1933     break;
1934     case SB_THUMBPOSITION:
1935     case SB_THUMBTRACK:
1936     Func = SCROLL_POS;
1937     break;
1938     case SB_TOP:
1939     Func = SCROLL_TOP;
1940     break;
1941     default:
1942     return;
1943     }
1944     DispHScroll(Func,nPos);
1945     }
1946    
1947 zmatsuo 7528 void CVTWindow::OnInitMenuPopup(HMENU hPopupMenu, UINT nIndex, BOOL bSysMenu)
1948 maya 3227 {
1949 zmatsuo 7528 InitMenuPopup(hPopupMenu);
1950 maya 3227 }
1951    
1952 zmatsuo 8337 void CVTWindow::OnKeyDown(WPARAM nChar, UINT nRepCnt, UINT nFlags)
1953 maya 3227 {
1954 doda 8445 #if UNICODE_DEBUG
1955     if (UnicodeDebugParam.CodePopupEnable)
1956     {
1957     const DWORD now = GetTickCount();
1958     switch(CtrlKeyState) {
1959     case 0:
1960     if (nChar == UnicodeDebugParam.CodePopupKey1) {
1961     CtrlKeyDownTick = now;
1962     CtrlKeyState = 1;
1963     }
1964     break;
1965     case 2:
1966     if (nChar != UnicodeDebugParam.CodePopupKey2) {
1967     CtrlKeyState = 0;
1968     break;
1969     }
1970     if (now - CtrlKeyDownTick < 500 && TipWinCodeDebug == NULL) {
1971     POINT pos;
1972     GetCursorPos(&pos);
1973     ScreenToClient(m_hWnd, &pos);
1974     CodePopup(pos.x, pos.y);
1975     CtrlKeyState = 3;
1976     } else {
1977     CtrlKeyDownTick = now;
1978     CtrlKeyState = 1;
1979     }
1980     break;
1981     case 3:
1982     break;
1983     default:
1984     CtrlKeyState = 0;
1985     break;
1986     }
1987     }
1988     if (TipWinCodeDebug != NULL && nChar == VK_SHIFT) {
1989     POINT pos;
1990     GetCursorPos(&pos);
1991     ScreenToClient(m_hWnd, &pos);
1992     wchar_t *buf = BuffGetCharInfo(pos.x, pos.y);
1993     CBSetTextW(HVTWin, buf, 0);
1994     free(buf);
1995 zmatsuo 8745 MessageBeep(MB_OK);
1996     TipWinDestroy(TipWinCodeDebug);
1997     TipWinCodeDebug = NULL;
1998     CtrlKeyState = 0;
1999 doda 8445 }
2000     #endif
2001 maya 3227 switch (KeyDown(HVTWin,nChar,nRepCnt,nFlags & 0x1ff)) {
2002     case KEYDOWN_OTHER:
2003     break;
2004     case KEYDOWN_CONTROL:
2005     return;
2006     case KEYDOWN_COMMOUT:
2007 doda 6421 // �X�N���[�����u�����Z�b�g
2008     if (WinOrgY != 0) {
2009 maya 3227 DispVScroll(SCROLL_BOTTOM, 0);
2010     }
2011     return;
2012     }
2013    
2014 doda 4519 if (MetaKey(ts.MetaKey) && (nFlags & 0x2000) != 0)
2015 doda 4414 {
2016 zmatsuo 9150 BYTE KeyState[256];
2017     MSG M;
2018    
2019 doda 4712 PeekMessage((LPMSG)&M,HVTWin,WM_CHAR,WM_CHAR,PM_REMOVE);
2020 maya 3227 /* for Ctrl+Alt+Key combination */
2021 zmatsuo 9150 GetKeyboardState(KeyState);
2022 maya 3227 KeyState[VK_MENU] = 0;
2023 zmatsuo 9150 SetKeyboardState(KeyState);
2024 maya 3227 M.hwnd = HVTWin;
2025     M.message = WM_KEYDOWN;
2026     M.wParam = nChar;
2027     M.lParam = MAKELONG(nRepCnt,nFlags & 0xdfff);
2028     TranslateMessage(&M);
2029     }
2030    
2031     }
2032    
2033 zmatsuo 8337 void CVTWindow::OnKeyUp(WPARAM nChar, UINT nRepCnt, UINT nFlags)
2034 maya 3227 {
2035     KeyUp(nChar);
2036 doda 8445 #if UNICODE_DEBUG
2037     if (CtrlKeyState == 1 && nChar == UnicodeDebugParam.CodePopupKey1) {
2038     CtrlKeyState++;
2039     } else {
2040     CtrlKeyState = 0;
2041     }
2042     if (nChar == UnicodeDebugParam.CodePopupKey2) {
2043     if (TipWinCodeDebug != NULL) {
2044     TipWinDestroy(TipWinCodeDebug);
2045     TipWinCodeDebug = NULL;
2046     CtrlKeyState = 0;
2047     }
2048     }
2049     #endif
2050 maya 3227 }
2051    
2052 zmatsuo 7528 void CVTWindow::OnKillFocus(HWND hNewWnd)
2053 maya 3227 {
2054     DispDestroyCaret();
2055     FocusReport(FALSE);
2056 zmatsuo 7784 // TTCFrameWnd::OnKillFocus(hNewWnd); // TODO
2057 maya 3227
2058 maya 3392 if (IsCaretOn()) {
2059 maya 3227 CaretKillFocus(TRUE);
2060 maya 3392 }
2061 maya 3227 }
2062    
2063 zmatsuo 8337 void CVTWindow::OnLButtonDblClk(WPARAM nFlags, POINTS point)
2064 maya 3227 {
2065 maya 3392 if (LButton || MButton || RButton) {
2066 maya 3227 return;
2067 maya 3392 }
2068 maya 3227
2069     DblClkX = point.x;
2070     DblClkY = point.y;
2071    
2072 doda 3992 if (MouseReport(IdMouseEventBtnDown, IdLeftButton, DblClkX, DblClkY)) {
2073 maya 3227 return;
2074 maya 3392 }
2075 maya 3227
2076 doda 3992 if (BuffUrlDblClk(DblClkX, DblClkY)) { // �u���E�U�����o���������������������B (2005.4.3 yutaka)
2077     return;
2078     }
2079    
2080 maya 3227 BuffDblClk(DblClkX, DblClkY);
2081    
2082     LButton = TRUE;
2083     DblClk = TRUE;
2084     AfterDblClk = TRUE;
2085     ::SetTimer(HVTWin, IdDblClkTimer, GetDoubleClickTime(), NULL);
2086    
2087     /* for AutoScrolling */
2088     ::SetCapture(HVTWin);
2089     ::SetTimer(HVTWin, IdScrollTimer, 100, NULL);
2090     }
2091    
2092 zmatsuo 8337 void CVTWindow::OnLButtonDown(WPARAM nFlags, POINTS point)
2093 maya 3227 {
2094     POINT p;
2095    
2096     p.x = point.x;
2097     p.y = point.y;
2098     ButtonDown(p,IdLeftButton);
2099     }
2100    
2101 zmatsuo 8337 void CVTWindow::OnLButtonUp(WPARAM nFlags, POINTS point)
2102 maya 3227 {
2103 doda 5341 if (IgnoreRelease)
2104     IgnoreRelease = FALSE;
2105 doda 7078 else if (MouseReport(IdMouseEventBtnUp, IdLeftButton, point.x, point.y)) {
2106     ReleaseCapture();
2107     }
2108 maya 3227
2109 maya 3392 if (! LButton) {
2110 maya 3227 return;
2111 maya 3392 }
2112 maya 3227
2113     ButtonUp(FALSE);
2114     }
2115    
2116 zmatsuo 8337 void CVTWindow::OnMButtonDown(WPARAM nFlags, POINTS point)
2117 maya 3227 {
2118     POINT p;
2119    
2120     p.x = point.x;
2121     p.y = point.y;
2122     ButtonDown(p,IdMiddleButton);
2123     }
2124    
2125 zmatsuo 8337 void CVTWindow::OnMButtonUp(WPARAM nFlags, POINTS point)
2126 maya 3227 {
2127 doda 5341 if (IgnoreRelease)
2128     IgnoreRelease = FALSE;
2129 doda 7078 else if (MouseReport(IdMouseEventBtnUp, IdMiddleButton, point.x, point.y)) {
2130     ReleaseCapture();
2131     }
2132 maya 3227
2133 maya 3392 if (! MButton) {
2134 maya 3227 return;
2135 maya 3392 }
2136 maya 3227
2137     // added DisablePasteMouseMButton (2008.3.2 maya)
2138 doda 7078 if (ts.PasteFlag & CPF_DISABLE_MBUTTON) {
2139 maya 3227 ButtonUp(FALSE);
2140 maya 3392 }
2141     else {
2142 maya 3227 ButtonUp(TRUE);
2143 maya 3392 }
2144 maya 3227 }
2145    
2146 zmatsuo 8677 LRESULT CVTWindow::OnMouseActivate(HWND pDesktopWnd, UINT nHitTest, UINT message)
2147 maya 3227 {
2148 doda 5341 if ((ts.SelOnActive==0) && (nHitTest==HTCLIENT)) { //disable mouse event for text selection
2149     IgnoreRelease = TRUE;
2150 maya 3227 return MA_ACTIVATEANDEAT; // when window is activated
2151 doda 5341 }
2152     else {
2153 maya 3227 return MA_ACTIVATE;
2154 doda 5341 }
2155 maya 3227 }
2156    
2157 doda 8445
2158     void CVTWindow::CodePopup(int client_x, int client_y)
2159     {
2160     wchar_t *buf = BuffGetCharInfo(client_x, client_y);
2161     if (TipWinCodeDebug == NULL) {
2162     TipWinCodeDebug = TipWinCreate(m_hInst, m_hWnd);
2163     }
2164     POINT pos = { client_x, client_y };
2165     ClientToScreen(m_hWnd, &pos);
2166     TipWinSetPos(TipWinCodeDebug, pos.x, pos.y);
2167     TipWinSetTextW(TipWinCodeDebug, buf);
2168     TipWinSetVisible(TipWinCodeDebug, TRUE);
2169     free(buf);
2170     }
2171    
2172 zmatsuo 8337 void CVTWindow::OnMouseMove(WPARAM nFlags, POINTS point)
2173 maya 3227 {
2174     int i;
2175 zmatsuo 9157 BOOL mousereport = FALSE;
2176 maya 3227
2177 doda 8445 #if UNICODE_DEBUG
2178     if (TipWinCodeDebug != NULL) {
2179     CodePopup(point.x, point.y);
2180     }
2181     #endif
2182    
2183 doda 5341 if (!IgnoreRelease)
2184     mousereport = MouseReport(IdMouseEventMove, 0, point.x, point.y);
2185 doda 3987
2186 maya 3227 if (! (LButton || MButton || RButton)) {
2187 doda 5279 if (BuffCheckMouseOnURL(point.x, point.y))
2188     SetMouseCursor("HAND");
2189     else
2190     SetMouseCursor(ts.MouseCursorName);
2191 maya 3227 return;
2192     }
2193    
2194 doda 3987 if (mousereport) {
2195     return;
2196     }
2197    
2198 maya 3392 if (DblClk) {
2199 maya 3227 i = 2;
2200 maya 3392 }
2201     else if (TplClk) {
2202 maya 3227 i = 3;
2203 maya 3392 }
2204     else {
2205 maya 3227 i = 1;
2206 maya 3392 }
2207 maya 3227
2208     if (!ts.SelectOnlyByLButton ||
2209 maya 3392 (ts.SelectOnlyByLButton && LButton) ) {
2210 maya 3227 // SelectOnlyByLButton == TRUE ���������A���{�^���_�E���������I������ (2007.11.21 maya)
2211     BuffChangeSelect(point.x, point.y,i);
2212     }
2213     }
2214    
2215     void CVTWindow::OnMove(int x, int y)
2216     {
2217     DispSetWinPos();
2218     }
2219    
2220     // �}�E�X�z�C�[�������]
2221     BOOL CVTWindow::OnMouseWheel(
2222     UINT nFlags, // ���z�L�[
2223     short zDelta, // ���]����
2224 zmatsuo 7528 POINTS pts // �J�[�\�����u
2225 maya 3227 )
2226     {
2227 zmatsuo 7528 POINT pt;
2228     pt.x = pts.x;
2229     pt.y = pts.y;
2230    
2231 maya 3227 int line, i;
2232    
2233 zmatsuo 7457 if (pSetLayeredWindowAttributes != NULL) {
2234 zmatsuo 7390 BOOL InTitleBar;
2235     POINT point = pt;
2236     GetPositionOnWindow(HVTWin, &point,
2237     NULL, NULL, &InTitleBar);
2238     if (InTitleBar) {
2239     int delta = zDelta < 0 ? -1 : 1;
2240     int newAlpha = Alpha;
2241 zmatsuo 8489 wchar_t tipbuf[32];
2242     wchar_t uimsg[MAX_UIMSG];
2243 yasuhide 8143 POINT tippos;
2244 yasuhide 8091
2245 zmatsuo 7390 newAlpha += delta * ts.MouseWheelScrollLine;
2246     if (newAlpha > 255)
2247     newAlpha = 255;
2248     else if (newAlpha < 0)
2249     newAlpha = 0;
2250     SetWindowAlpha(newAlpha);
2251 yasuhide 8091
2252 zmatsuo 8489 get_lang_msgW("TOOLTIP_TITLEBAR_OPACITY", uimsg, sizeof(uimsg), L"Opacity %.1f %%", ts.UILanguageFile);
2253     _snwprintf_s(tipbuf, _countof(tipbuf), uimsg, (newAlpha / 255.0) * 100);
2254 yasuhide 8091
2255 yasuhide 8143 tippos = TipWin->GetPos();
2256     if (tippos.x != pt.x ||
2257     tippos.y != pt.y) {
2258     TipWin->SetVisible(FALSE);
2259 yasuhide 8091 }
2260    
2261 yasuhide 8143 TipWin->SetText(tipbuf);
2262     TipWin->SetPos(pt.x, pt.y);
2263     TipWin->SetHideTimer(1000);
2264    
2265     if(! TipWin->IsVisible()) {
2266     TipWin->SetVisible(TRUE);
2267 yasuhide 8091 }
2268    
2269 zmatsuo 7390 return TRUE;
2270     }
2271     }
2272    
2273 maya 3227 ::ScreenToClient(HVTWin, &pt);
2274    
2275     line = abs(zDelta) / WHEEL_DELTA; // ���C����
2276     if (line < 1) line = 1;
2277    
2278     // ���X�N���[�����������s������������ (2008.4.6 yutaka)
2279     if (line == 1 && ts.MouseWheelScrollLine > 0)
2280     line *= ts.MouseWheelScrollLine;
2281    
2282     if (MouseReport(IdMouseEventWheel, zDelta<0, pt.x, pt.y))
2283     return TRUE;
2284    
2285 doda 4293 if (WheelToCursorMode()) {
2286 maya 3227 if (zDelta < 0) {
2287     KeyDown(HVTWin, VK_DOWN, line, MapVirtualKey(VK_DOWN, 0) | 0x100);
2288     KeyUp(VK_DOWN);
2289     } else {
2290     KeyDown(HVTWin, VK_UP, line, MapVirtualKey(VK_UP, 0) | 0x100);
2291     KeyUp(VK_UP);
2292     }
2293     } else {
2294     for (i = 0 ; i < line ; i++) {
2295     if (zDelta < 0) {
2296     OnVScroll(SB_LINEDOWN, 0, NULL);
2297     } else {
2298     OnVScroll(SB_LINEUP, 0, NULL);
2299     }
2300     }
2301     }
2302    
2303     return (TRUE);
2304     }
2305    
2306 zmatsuo 7528 void CVTWindow::OnNcLButtonDblClk(UINT nHitTest, POINTS point)
2307 maya 3227 {
2308 doda 7132 if (! Minimized && !ts.TermIsWin && (nHitTest == HTCAPTION)) {
2309 maya 3227 DispRestoreWinSize();
2310 maya 3392 }
2311 maya 3227 }
2312    
2313 zmatsuo 7528 void CVTWindow::OnNcRButtonDown(UINT nHitTest, POINTS point)
2314 maya 3227 {
2315     if ((nHitTest==HTCAPTION) &&
2316     (ts.HideTitle>0) &&
2317 maya 3392 AltKey()) {
2318 maya 3227 ::CloseWindow(HVTWin); /* iconize */
2319 maya 3392 }
2320 maya 3227 }
2321    
2322     void CVTWindow::OnPaint()
2323     {
2324     PAINTSTRUCT ps;
2325     HDC PaintDC;
2326     int Xs, Ys, Xe, Ye;
2327    
2328 zmatsuo 7322 // �\������������������WM_PAINT�����������P�[�X����
2329 zmatsuo 7528 if (::IsWindowVisible(m_hWnd) == 0) {
2330 zmatsuo 7322 return;
2331     }
2332    
2333 maya 3227 #ifdef ALPHABLEND_TYPE2
2334     //<!--by AKASI
2335     BGSetupPrimary(FALSE);
2336     //-->
2337     #endif
2338    
2339 zmatsuo 7528 PaintDC = BeginPaint(&ps);
2340 maya 3227
2341     PaintWindow(PaintDC,ps.rcPaint,ps.fErase, &Xs,&Ys,&Xe,&Ye);
2342     LockBuffer();
2343 zmatsuo 7499 BuffUpdateRect(Xs,Ys,Xe,Ye);
2344 maya 3227 UnlockBuffer();
2345     DispEndPaint();
2346    
2347     EndPaint(&ps);
2348    
2349     if (FirstPaint) {
2350     if (strlen(TopicName)>0) {
2351     InitDDE();
2352     SendDDEReady();
2353     }
2354     FirstPaint = FALSE;
2355     Startup();
2356     }
2357     }
2358    
2359 zmatsuo 7528 void CVTWindow::OnRButtonDown(UINT nFlags, POINTS point)
2360 maya 3227 {
2361     POINT p;
2362    
2363     p.x = point.x;
2364     p.y = point.y;
2365     ButtonDown(p,IdRightButton);
2366     }
2367    
2368 zmatsuo 7528 void CVTWindow::OnRButtonUp(UINT nFlags, POINTS point)
2369 maya 3227 {
2370