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 10130 - (hide annotations) (download) (as text)
Tue Aug 9 01:08:44 2022 UTC (20 months ago) by zmatsuo
Original Path: trunk/teraterm/teraterm/vtwin.cpp
File MIME type: text/x-c++src
File size: 140981 byte(s)
ttpcmn.dll 内の関数の一部分を ttermpro.exe へ移動

- 文字列などヒープ領域を使用する箇所
  - ttcmn_static.c,h へまとめたて、ttermpro.exeへ移動
- この移動で、ttpcmn.dllとtermpro.exeでモジュールをまたいだヒープの操作はなくなった

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