| 1 |
/* |
| 2 |
* Copyright (C) 1994-1998 T. Teranishi |
| 3 |
* (C) 2006- TeraTerm Project |
| 4 |
* All rights reserved. |
| 5 |
* |
| 6 |
* Redistribution and use in source and binary forms, with or without |
| 7 |
* modification, are permitted provided that the following conditions |
| 8 |
* are met: |
| 9 |
* |
| 10 |
* 1. Redistributions of source code must retain the above copyright |
| 11 |
* notice, this list of conditions and the following disclaimer. |
| 12 |
* 2. Redistributions in binary form must reproduce the above copyright |
| 13 |
* notice, this list of conditions and the following disclaimer in the |
| 14 |
* documentation and/or other materials provided with the distribution. |
| 15 |
* 3. The name of the author may not be used to endorse or promote products |
| 16 |
* derived from this software without specific prior written permission. |
| 17 |
* |
| 18 |
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR |
| 19 |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
| 20 |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
| 21 |
* IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
| 22 |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
| 23 |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 24 |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 25 |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 26 |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
| 27 |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 28 |
*/ |
| 29 |
|
| 30 |
/* TERATERM.EXE, TEK window */ |
| 31 |
#include <windowsx.h> |
| 32 |
#include "teraterm.h" |
| 33 |
#include "tttypes.h" |
| 34 |
#include "tttypes_key.h" |
| 35 |
#include "tektypes.h" |
| 36 |
#include "teklib.h" |
| 37 |
#include "ttwinman.h" |
| 38 |
#include "ttcommon.h" |
| 39 |
#include "keyboard.h" |
| 40 |
#include "clipboar.h" |
| 41 |
#include "ttdialog.h" |
| 42 |
#include "teraprn.h" |
| 43 |
#include "helpid.h" |
| 44 |
#include "tt_res.h" |
| 45 |
#include "tekwin.h" |
| 46 |
#include "ttlib.h" |
| 47 |
#include <htmlhelp.h> |
| 48 |
#include "dlglib.h" |
| 49 |
#include "codeconv.h" |
| 50 |
#include "compat_win.h" |
| 51 |
|
| 52 |
#define TEKClassName L"TEKWin32" |
| 53 |
|
| 54 |
///////////////////////////////////////////////////////////////////////////// |
| 55 |
// CTEKWindow |
| 56 |
|
| 57 |
CTEKWindow::CTEKWindow(HINSTANCE hInstance) |
| 58 |
{ |
| 59 |
WNDCLASSW wc; |
| 60 |
RECT rect; |
| 61 |
DWORD Style; |
| 62 |
m_hInst = hInstance; |
| 63 |
|
| 64 |
if (! LoadTTTEK()) { |
| 65 |
return; |
| 66 |
} |
| 67 |
TEKInit(&tk, &ts); |
| 68 |
|
| 69 |
if (ts.HideTitle>0) { |
| 70 |
Style = WS_POPUP | WS_THICKFRAME | WS_BORDER; |
| 71 |
} |
| 72 |
else { |
| 73 |
Style = WS_CAPTION | WS_SYSMENU | |
| 74 |
WS_MINIMIZEBOX | WS_BORDER | WS_THICKFRAME; |
| 75 |
} |
| 76 |
|
| 77 |
wc.style = CS_HREDRAW | CS_VREDRAW; |
| 78 |
wc.lpfnWndProc = (WNDPROC)ProcStub; |
| 79 |
wc.cbClsExtra = 0; |
| 80 |
wc.cbWndExtra = 0; |
| 81 |
wc.hInstance = hInstance; |
| 82 |
wc.hIcon = NULL; |
| 83 |
wc.hCursor = LoadCursor(NULL,IDC_ARROW); |
| 84 |
wc.hbrBackground = NULL; |
| 85 |
wc.lpszMenuName = NULL; |
| 86 |
wc.lpszClassName = TEKClassName; |
| 87 |
|
| 88 |
RegisterClassW(&wc); |
| 89 |
|
| 90 |
if (ts.TEKPos.x==CW_USEDEFAULT) { |
| 91 |
rect = rectDefault; |
| 92 |
} |
| 93 |
else { |
| 94 |
rect.left = ts.TEKPos.x; |
| 95 |
rect.top = ts.TEKPos.y; |
| 96 |
rect.right = rect.left + 640; //temporary width |
| 97 |
rect.bottom = rect.top + 400; //temporary height |
| 98 |
} |
| 99 |
CreateW(hInstance, TEKClassName, L"Tera Term", Style, rect, ::GetDesktopWindow(), NULL); |
| 100 |
|
| 101 |
//-------------------------------------------------------- |
| 102 |
HTEKWin = GetSafeHwnd(); |
| 103 |
if (HTEKWin == NULL) { |
| 104 |
return; |
| 105 |
} |
| 106 |
|
| 107 |
// Windows 11 ���E�B���h�E���p������������������������ |
| 108 |
if (ts.WindowCornerDontround && pDwmSetWindowAttribute != NULL) { |
| 109 |
DWM_WINDOW_CORNER_PREFERENCE preference = DWMWCP_DONOTROUND; |
| 110 |
pDwmSetWindowAttribute(HTEKWin, DWMWA_WINDOW_CORNER_PREFERENCE, &preference, sizeof(preference)); |
| 111 |
} |
| 112 |
|
| 113 |
tk.HWin = HTEKWin; |
| 114 |
// register this window to the window list |
| 115 |
RegWin(HVTWin,HTEKWin); |
| 116 |
|
| 117 |
TTSetIcon(m_hInst, m_hWnd, MAKEINTRESOURCEW((ts.TEKIcon!=IdIconDefault)?ts.TEKIcon:IDI_TEK), 0); |
| 118 |
|
| 119 |
MainMenu = NULL; |
| 120 |
WinMenu = NULL; |
| 121 |
if ((ts.HideTitle==0) && (ts.PopupMenu==0)) { |
| 122 |
InitMenu(&MainMenu); |
| 123 |
::SetMenu(HTEKWin,MainMenu); |
| 124 |
} |
| 125 |
|
| 126 |
ChangeTitle(); |
| 127 |
|
| 128 |
::GetWindowRect(tk.HWin,&rect); |
| 129 |
TEKResizeWindow(&tk,&ts, rect.right-rect.left, rect.bottom-rect.top); |
| 130 |
|
| 131 |
if ((ts.PopupMenu>0) || (ts.HideTitle>0)) { |
| 132 |
::PostMessage(HTEKWin,WM_USER_CHANGEMENU,0,0); |
| 133 |
} |
| 134 |
|
| 135 |
::ShowWindow(tk.HWin, SW_SHOWNORMAL); |
| 136 |
} |
| 137 |
|
| 138 |
int CTEKWindow::Parse() |
| 139 |
{ |
| 140 |
return (TEKParse(&tk,&ts,&cv)); |
| 141 |
} |
| 142 |
|
| 143 |
void CTEKWindow::RestoreSetup() |
| 144 |
{ |
| 145 |
TEKRestoreSetup(&tk,&ts); |
| 146 |
ChangeTitle(); |
| 147 |
} |
| 148 |
|
| 149 |
void CTEKWindow::InitMenu(HMENU *Menu) |
| 150 |
{ |
| 151 |
static const DlgTextInfo MenuTextInfo[] = { |
| 152 |
{ 0, "TEKMENU_FILE" }, |
| 153 |
{ 1, "TEKMENU_EDIT" }, |
| 154 |
{ 2, "TEKMENU_SETUP" }, |
| 155 |
{ ID_TEKVTWIN, "TEKMENU_VTWIN"}, |
| 156 |
{ 4, "TEKMENU_HELP"}, |
| 157 |
}; |
| 158 |
static const DlgTextInfo FileMenuTextInfo[] = { |
| 159 |
{ ID_TEKFILE_PRINT, "TEKMENU_FILE_PRINT" }, |
| 160 |
{ ID_TEKFILE_EXIT, "TEKMENU_FILE_EXIT" }, |
| 161 |
}; |
| 162 |
static const DlgTextInfo EditMenuTextInfo[] = { |
| 163 |
{ ID_TEKEDIT_COPY, "TEKMENU_EDIT_COPY" }, |
| 164 |
{ ID_TEKEDIT_COPYSCREEN, "TEKMENU_EDIT_COPYSCREEN" }, |
| 165 |
{ ID_TEKEDIT_PASTE, "TEKMENU_EDIT_PASTE" }, |
| 166 |
{ ID_TEKEDIT_PASTECR, "TEKMENU_EDIT_PASTECR" }, |
| 167 |
{ ID_TEKEDIT_CLEARSCREEN, "TEKMENU_EDIT_CLSCREEN" }, |
| 168 |
}; |
| 169 |
static const DlgTextInfo SetupMenuTextInfo[] = { |
| 170 |
{ ID_TEKSETUP_WINDOW, "TEKMENU_SETUP_WINDOW" }, |
| 171 |
{ ID_TEKSETUP_FONT, "TEKMENU_SETUP_FONT" }, |
| 172 |
}; |
| 173 |
static const DlgTextInfo HelpMenuTextInfo[] = { |
| 174 |
{ ID_TEKHELP_INDEX, "TEKMENU_HELP_INDEX" }, |
| 175 |
{ ID_TEKHELP_ABOUT, "TEKMENU_HELP_ABOUT" }, |
| 176 |
}; |
| 177 |
|
| 178 |
*Menu = ::LoadMenu(m_hInst, |
| 179 |
MAKEINTRESOURCE(IDR_TEKMENU)); |
| 180 |
FileMenu = GetSubMenu(*Menu,0); |
| 181 |
EditMenu = GetSubMenu(*Menu,1); |
| 182 |
SetupMenu = GetSubMenu(*Menu,2); |
| 183 |
HelpMenu = GetSubMenu(*Menu,4); |
| 184 |
|
| 185 |
SetDlgMenuTextsW(*Menu, MenuTextInfo, _countof(MenuTextInfo), ts.UILanguageFileW); |
| 186 |
SetDlgMenuTextsW(FileMenu, FileMenuTextInfo, _countof(FileMenuTextInfo), ts.UILanguageFileW); |
| 187 |
SetDlgMenuTextsW(EditMenu, EditMenuTextInfo, _countof(EditMenuTextInfo), ts.UILanguageFileW); |
| 188 |
SetDlgMenuTextsW(SetupMenu, SetupMenuTextInfo, _countof(SetupMenuTextInfo), ts.UILanguageFileW); |
| 189 |
SetDlgMenuTextsW(HelpMenu, HelpMenuTextInfo, _countof(HelpMenuTextInfo), ts.UILanguageFileW); |
| 190 |
|
| 191 |
if ((ts.MenuFlag & MF_SHOWWINMENU) !=0) { |
| 192 |
wchar_t *uimsg; |
| 193 |
WinMenu = CreatePopupMenu(); |
| 194 |
GetI18nStrWW("Tera Term", "TEKMENU_WINDOW", L"&Window", ts.UILanguageFileW, &uimsg); |
| 195 |
::InsertMenuW(*Menu,4,MF_STRING | MF_ENABLED | MF_POPUP | MF_BYPOSITION, |
| 196 |
(UINT_PTR)WinMenu, uimsg); |
| 197 |
free(uimsg); |
| 198 |
} |
| 199 |
} |
| 200 |
|
| 201 |
void CTEKWindow::InitMenuPopup(HMENU SubMenu) |
| 202 |
{ |
| 203 |
if (SubMenu==EditMenu) { |
| 204 |
if (tk.Select) { |
| 205 |
EnableMenuItem(EditMenu,ID_TEKEDIT_COPY,MF_BYCOMMAND | MF_ENABLED); |
| 206 |
} |
| 207 |
else { |
| 208 |
EnableMenuItem(EditMenu,ID_TEKEDIT_COPY,MF_BYCOMMAND | MF_GRAYED); |
| 209 |
} |
| 210 |
|
| 211 |
if (cv.Ready && |
| 212 |
(IsClipboardFormatAvailable(CF_TEXT) || |
| 213 |
IsClipboardFormatAvailable(CF_OEMTEXT))) { |
| 214 |
EnableMenuItem(EditMenu,ID_TEKEDIT_PASTE,MF_BYCOMMAND | MF_ENABLED); |
| 215 |
EnableMenuItem(EditMenu,ID_TEKEDIT_PASTECR,MF_BYCOMMAND | MF_ENABLED); |
| 216 |
} |
| 217 |
else { |
| 218 |
EnableMenuItem(EditMenu,ID_TEKEDIT_PASTE,MF_BYCOMMAND | MF_GRAYED); |
| 219 |
EnableMenuItem(EditMenu,ID_TEKEDIT_PASTECR,MF_BYCOMMAND | MF_GRAYED); |
| 220 |
} |
| 221 |
} |
| 222 |
else if ( SubMenu == WinMenu ) { |
| 223 |
SetWinMenuW(WinMenu, ts.UILanguageFileW, 0); |
| 224 |
} |
| 225 |
} |
| 226 |
|
| 227 |
///////////////////////////////////////////////////////////////////////////// |
| 228 |
// CTEKWindow message handler |
| 229 |
|
| 230 |
BOOL CTEKWindow::OnCommand(WPARAM wParam, LPARAM lParam) |
| 231 |
{ |
| 232 |
if ((LOWORD(wParam)>=ID_WINDOW_1) && (LOWORD(wParam)<ID_WINDOW_1+9)) { |
| 233 |
SelectWin(LOWORD(wParam)-ID_WINDOW_1); |
| 234 |
return TRUE; |
| 235 |
} |
| 236 |
else { |
| 237 |
return TTCFrameWnd::OnCommand(wParam, lParam); |
| 238 |
} |
| 239 |
} |
| 240 |
|
| 241 |
void CTEKWindow::OnActivate(UINT nState, HWND pWndOther, BOOL bMinimized) |
| 242 |
{ |
| 243 |
if (nState!=WA_INACTIVE) { |
| 244 |
tk.Active = TRUE; |
| 245 |
ActiveWin = IdTEK; |
| 246 |
} |
| 247 |
else { |
| 248 |
tk.Active = FALSE; |
| 249 |
} |
| 250 |
} |
| 251 |
|
| 252 |
/** |
| 253 |
* �L�[�{�[�h����1�������� |
| 254 |
* @param nChar UTF-16 char(wchar_t) IsWindowUnicode() == TRUE �� |
| 255 |
* ANSI char(char) IsWindowUnicode() == FALSE �� |
| 256 |
*/ |
| 257 |
void CTEKWindow::OnChar(WPARAM nChar, UINT nRepCnt, UINT nFlags) |
| 258 |
{ |
| 259 |
|
| 260 |
if (!KeybEnabled || (TalkStatus!=IdTalkKeyb)) { |
| 261 |
return; |
| 262 |
} |
| 263 |
|
| 264 |
wchar_t u16; |
| 265 |
if (IsWindowUnicode(HTEKWin) == TRUE) { |
| 266 |
// ������ UTF-16 |
| 267 |
u16 = (wchar_t)nChar; |
| 268 |
} else { |
| 269 |
// ������ ANSI |
| 270 |
// ANSI(ACP) -> UTF-32 -> UTF-16 |
| 271 |
const char mb_str[2] = {(char)nChar, 0}; |
| 272 |
unsigned int u32; |
| 273 |
size_t mb_len = MBCPToUTF32(mb_str, 1, CP_ACP, &u32); |
| 274 |
if (mb_len == 0) { |
| 275 |
return; |
| 276 |
} |
| 277 |
u16 = (wchar_t)u32; |
| 278 |
} |
| 279 |
|
| 280 |
if (tk.GIN) { |
| 281 |
char Code = (char)nChar; |
| 282 |
TEKReportGIN(&tk, &ts, &cv, Code); |
| 283 |
} |
| 284 |
else { |
| 285 |
for (unsigned int i = 1; i <= nRepCnt; i++) { |
| 286 |
CommTextOutW(&cv, &u16, 1); |
| 287 |
if (ts.LocalEcho > 0) { |
| 288 |
CommTextEchoW(&cv, &u16, 1); |
| 289 |
} |
| 290 |
} |
| 291 |
} |
| 292 |
} |
| 293 |
|
| 294 |
void CTEKWindow::OnDestroy() |
| 295 |
{ |
| 296 |
// remove this window from the window list |
| 297 |
UnregWin(HTEKWin); |
| 298 |
|
| 299 |
TEKEnd(&tk); |
| 300 |
FreeTTTEK(); |
| 301 |
HTEKWin = NULL; |
| 302 |
pTEKWin = NULL; |
| 303 |
ActiveWin = IdVT; |
| 304 |
|
| 305 |
TTSetIcon(m_hInst, m_hWnd, NULL, 0); |
| 306 |
} |
| 307 |
|
| 308 |
void CTEKWindow::OnGetMinMaxInfo(MINMAXINFO *lpMMI) |
| 309 |
{ |
| 310 |
lpMMI->ptMaxSize.x = 10000; |
| 311 |
lpMMI->ptMaxSize.y = 10000; |
| 312 |
lpMMI->ptMaxTrackSize.x = 10000; |
| 313 |
lpMMI->ptMaxTrackSize.y = 10000; |
| 314 |
} |
| 315 |
|
| 316 |
void CTEKWindow::OnInitMenuPopup(HMENU hPopupMenu, UINT nIndex, BOOL bSysMenu) |
| 317 |
{ |
| 318 |
InitMenuPopup(hPopupMenu); |
| 319 |
} |
| 320 |
|
| 321 |
void CTEKWindow::OnKeyDown(WPARAM nChar, UINT nRepCnt, UINT nFlags) |
| 322 |
{ |
| 323 |
KeyDown(HTEKWin,nChar,nRepCnt,nFlags & 0x1ff); |
| 324 |
} |
| 325 |
|
| 326 |
void CTEKWindow::OnKeyUp(WPARAM nChar, UINT nRepCnt, UINT nFlags) |
| 327 |
{ |
| 328 |
KeyUp(nChar); |
| 329 |
} |
| 330 |
|
| 331 |
void CTEKWindow::OnKillFocus(HWND hNewWnd) |
| 332 |
{ |
| 333 |
TEKDestroyCaret(&tk,&ts); |
| 334 |
TTCFrameWnd::OnKillFocus(hNewWnd); |
| 335 |
} |
| 336 |
|
| 337 |
void CTEKWindow::OnLButtonDown(WPARAM nFlags, POINTS point) |
| 338 |
{ |
| 339 |
POINT p; |
| 340 |
HMENU PopupMenu, PopupBase; |
| 341 |
|
| 342 |
p.x = point.x; |
| 343 |
p.y = point.y; |
| 344 |
|
| 345 |
// popup menu |
| 346 |
if (ControlKey() && (MainMenu==NULL)) |
| 347 |
{ |
| 348 |
int i, numItems; |
| 349 |
char itemText[256]; |
| 350 |
|
| 351 |
InitMenu(&PopupMenu); |
| 352 |
|
| 353 |
PopupBase = CreatePopupMenu(); |
| 354 |
numItems = GetMenuItemCount(PopupMenu); |
| 355 |
|
| 356 |
for (i = 0; i < numItems; i++) { |
| 357 |
HMENU submenu = GetSubMenu(PopupMenu, i); |
| 358 |
|
| 359 |
if (submenu != NULL) { |
| 360 |
InitMenuPopup(submenu); |
| 361 |
} |
| 362 |
|
| 363 |
if (GetMenuString(PopupMenu, i, itemText, sizeof(itemText), MF_BYPOSITION) != 0) { |
| 364 |
int state = GetMenuState(PopupMenu, i, MF_BYPOSITION) & |
| 365 |
(MF_CHECKED | MF_DISABLED | MF_GRAYED | MF_HILITE | |
| 366 |
MF_MENUBARBREAK | MF_MENUBREAK | MF_SEPARATOR); |
| 367 |
|
| 368 |
AppendMenu(PopupBase, |
| 369 |
submenu != NULL ? LOBYTE(state) | MF_POPUP : state, |
| 370 |
submenu != NULL ? (UINT_PTR)submenu : GetMenuItemID(PopupMenu, i), |
| 371 |
itemText); |
| 372 |
} |
| 373 |
} |
| 374 |
|
| 375 |
::ClientToScreen(tk.HWin, &p); |
| 376 |
TrackPopupMenu(PopupBase,TPM_LEFTALIGN | TPM_LEFTBUTTON, |
| 377 |
p.x,p.y,0,tk.HWin,NULL); |
| 378 |
if (WinMenu!=NULL) { |
| 379 |
DestroyMenu(WinMenu); |
| 380 |
WinMenu = NULL; |
| 381 |
} |
| 382 |
DestroyMenu(PopupBase); |
| 383 |
DestroyMenu(PopupMenu); |
| 384 |
PopupMenu = 0; |
| 385 |
return; |
| 386 |
} |
| 387 |
|
| 388 |
TEKWMLButtonDown(&tk,&ts,&cv,p); |
| 389 |
} |
| 390 |
|
| 391 |
void CTEKWindow::OnLButtonUp(WPARAM nFlags, POINTS point) |
| 392 |
{ |
| 393 |
TEKWMLButtonUp(&tk,&ts); |
| 394 |
} |
| 395 |
|
| 396 |
void CTEKWindow::OnMButtonUp(WPARAM nFlags, POINTS point) |
| 397 |
{ |
| 398 |
//OnRButtonUp(nFlags,point); |
| 399 |
} |
| 400 |
|
| 401 |
int CTEKWindow::OnMouseActivate(HWND pDesktopWnd, UINT nHitTest, UINT message) |
| 402 |
{ |
| 403 |
if ((ts.SelOnActive==0) && |
| 404 |
(nHitTest==HTCLIENT)) { //disable mouse event for text selection |
| 405 |
return MA_ACTIVATEANDEAT; // when window is activated |
| 406 |
} |
| 407 |
else { |
| 408 |
return MA_ACTIVATE; |
| 409 |
} |
| 410 |
} |
| 411 |
|
| 412 |
void CTEKWindow::OnMouseMove(WPARAM nFlags, POINTS point) |
| 413 |
{ |
| 414 |
POINT p; |
| 415 |
|
| 416 |
p.x = point.x; |
| 417 |
p.y = point.y; |
| 418 |
TEKWMMouseMove(&tk,&ts,p); |
| 419 |
} |
| 420 |
|
| 421 |
void CTEKWindow::OnMove(int x, int y) |
| 422 |
{ |
| 423 |
RECT R; |
| 424 |
|
| 425 |
::GetWindowRect(HTEKWin,&R); |
| 426 |
ts.TEKPos.x = R.left; |
| 427 |
ts.TEKPos.y = R.top; |
| 428 |
} |
| 429 |
|
| 430 |
void CTEKWindow::OnPaint() |
| 431 |
{ |
| 432 |
PAINTSTRUCT ps; |
| 433 |
HDC PaintDC; |
| 434 |
|
| 435 |
PaintDC = BeginPaint(&ps); |
| 436 |
|
| 437 |
TEKPaint(&tk,&ts,PaintDC,&ps); |
| 438 |
|
| 439 |
EndPaint(&ps); |
| 440 |
} |
| 441 |
|
| 442 |
void CTEKWindow::OnRButtonUp(UINT nFlags, POINTS point) |
| 443 |
{ |
| 444 |
CBStartPaste(tk.HWin, FALSE, FALSE); |
| 445 |
} |
| 446 |
|
| 447 |
void CTEKWindow::OnSetFocus(HWND hOldWnd) |
| 448 |
{ |
| 449 |
TEKChangeCaret(&tk,&ts); |
| 450 |
TTCFrameWnd::OnSetFocus(hOldWnd); |
| 451 |
} |
| 452 |
|
| 453 |
void CTEKWindow::OnSize(WPARAM nType, int cx, int cy) |
| 454 |
{ |
| 455 |
int w, h; |
| 456 |
RECT R; |
| 457 |
|
| 458 |
if (tk.Minimized && (nType==SIZE_RESTORED)) { |
| 459 |
tk.Minimized = FALSE; |
| 460 |
return; |
| 461 |
} |
| 462 |
tk.Minimized = (nType==SIZE_MINIMIZED); |
| 463 |
if (tk.Minimized) { |
| 464 |
return; |
| 465 |
} |
| 466 |
|
| 467 |
::GetWindowRect(tk.HWin,&R); |
| 468 |
w = R.right - R.left; |
| 469 |
h = R.bottom - R.top; |
| 470 |
|
| 471 |
TEKWMSize(&tk,&ts,w,h,cx,cy); |
| 472 |
} |
| 473 |
|
| 474 |
void CTEKWindow::OnSysCommand(WPARAM nID, LPARAM lParam) |
| 475 |
{ |
| 476 |
if (nID==ID_SHOWMENUBAR) { |
| 477 |
ts.PopupMenu = 0; |
| 478 |
SwitchMenu(); |
| 479 |
} |
| 480 |
else { |
| 481 |
TTCFrameWnd::OnSysCommand(nID,lParam); |
| 482 |
} |
| 483 |
} |
| 484 |
|
| 485 |
void CTEKWindow::OnSysKeyDown(WPARAM nChar, UINT nRepCnt, UINT nFlags) |
| 486 |
{ |
| 487 |
if (nChar==VK_F10) { |
| 488 |
OnKeyDown(nChar,nRepCnt,nFlags); |
| 489 |
} |
| 490 |
else { |
| 491 |
TTCFrameWnd::OnSysKeyDown(nChar,nRepCnt,nFlags); |
| 492 |
} |
| 493 |
} |
| 494 |
|
| 495 |
void CTEKWindow::OnSysKeyUp(WPARAM nChar, UINT nRepCnt, UINT nFlags) |
| 496 |
{ |
| 497 |
if (nChar==VK_F10) { |
| 498 |
OnKeyUp(nChar,nRepCnt,nFlags); |
| 499 |
} |
| 500 |
else { |
| 501 |
TTCFrameWnd::OnSysKeyUp(nChar,nRepCnt,nFlags); |
| 502 |
} |
| 503 |
} |
| 504 |
|
| 505 |
void CTEKWindow::OnTimer(UINT_PTR nIDEvent) |
| 506 |
{ |
| 507 |
UINT T; |
| 508 |
|
| 509 |
if (nIDEvent==IdCaretTimer) { |
| 510 |
if (ts.NonblinkingCursor!=0) { |
| 511 |
T = GetCaretBlinkTime(); |
| 512 |
SetCaretBlinkTime(T); |
| 513 |
} |
| 514 |
else { |
| 515 |
::KillTimer(HTEKWin,IdCaretTimer); |
| 516 |
} |
| 517 |
return; |
| 518 |
} |
| 519 |
else { |
| 520 |
::KillTimer(HTEKWin,nIDEvent); |
| 521 |
} |
| 522 |
} |
| 523 |
|
| 524 |
LRESULT CTEKWindow::OnAccelCommand(WPARAM wParam, LPARAM lParam) |
| 525 |
{ |
| 526 |
switch (wParam) { |
| 527 |
case IdPrint: |
| 528 |
OnFilePrint(); |
| 529 |
break; |
| 530 |
case IdCmdEditCopy: |
| 531 |
OnEditCopy(); |
| 532 |
break; |
| 533 |
case IdCmdEditPaste: |
| 534 |
OnEditPaste(); |
| 535 |
break; |
| 536 |
case IdCmdEditPasteCR: |
| 537 |
OnEditPasteCR(); |
| 538 |
break; |
| 539 |
case IdCmdEditCLS: |
| 540 |
OnEditClearScreen(); |
| 541 |
break; |
| 542 |
case IdCmdCtrlCloseTEK: |
| 543 |
OnFileExit(); |
| 544 |
break; |
| 545 |
case IdCmdNextWin: |
| 546 |
SelectNextWin(HTEKWin,1,FALSE); |
| 547 |
break; |
| 548 |
case IdCmdPrevWin: |
| 549 |
SelectNextWin(HTEKWin,-1,FALSE); |
| 550 |
break; |
| 551 |
case IdCmdNextSWin: |
| 552 |
SelectNextWin(HTEKWin,1,TRUE); |
| 553 |
break; |
| 554 |
case IdCmdPrevSWin: |
| 555 |
SelectNextWin(HTEKWin,-1,TRUE); |
| 556 |
break; |
| 557 |
case IdBreak: |
| 558 |
case IdCmdRestoreSetup: |
| 559 |
case IdCmdLoadKeyMap: |
| 560 |
::PostMessage(HVTWin,WM_USER_ACCELCOMMAND,wParam,0); |
| 561 |
break; |
| 562 |
} |
| 563 |
return 0; |
| 564 |
} |
| 565 |
|
| 566 |
LRESULT CTEKWindow::OnChangeMenu(WPARAM wParam, LPARAM lParam) |
| 567 |
{ |
| 568 |
HMENU SysMenu; |
| 569 |
BOOL Show, B1, B2; |
| 570 |
|
| 571 |
Show = (ts.PopupMenu==0) && (ts.HideTitle==0); |
| 572 |
if (Show != (MainMenu!=NULL)) { |
| 573 |
if (! Show) { |
| 574 |
if (WinMenu!=NULL) { |
| 575 |
DestroyMenu(WinMenu); |
| 576 |
} |
| 577 |
WinMenu = NULL; |
| 578 |
DestroyMenu(MainMenu); |
| 579 |
MainMenu = NULL; |
| 580 |
} |
| 581 |
else { |
| 582 |
InitMenu(&MainMenu); |
| 583 |
} |
| 584 |
|
| 585 |
tk.AdjustSize = TRUE; |
| 586 |
::SetMenu(tk.HWin, MainMenu); |
| 587 |
::DrawMenuBar(HTEKWin); |
| 588 |
} |
| 589 |
|
| 590 |
B1 = ((ts.MenuFlag & MF_SHOWWINMENU)!=0); |
| 591 |
B2 = (WinMenu!=NULL); |
| 592 |
if ((MainMenu!=NULL) && |
| 593 |
(B1 != B2)) { |
| 594 |
if (WinMenu==NULL) { |
| 595 |
wchar_t *uimsg; |
| 596 |
WinMenu = CreatePopupMenu(); |
| 597 |
GetI18nStrWW("Tera Term", "TEKMENU_WINDOW", L"&Window", ts.UILanguageFileW, &uimsg); |
| 598 |
::InsertMenuW(MainMenu,4, |
| 599 |
MF_STRING | MF_ENABLED | MF_POPUP | MF_BYPOSITION, |
| 600 |
(UINT_PTR)WinMenu, uimsg); |
| 601 |
free(uimsg); |
| 602 |
} |
| 603 |
else { |
| 604 |
RemoveMenu(MainMenu,4,MF_BYPOSITION); |
| 605 |
DestroyMenu(WinMenu); |
| 606 |
WinMenu = NULL; |
| 607 |
} |
| 608 |
::DrawMenuBar(HTEKWin); |
| 609 |
} |
| 610 |
|
| 611 |
::GetSystemMenu(tk.HWin,TRUE); |
| 612 |
if ((! Show) && ((ts.MenuFlag & MF_NOSHOWMENU)==0)) { |
| 613 |
wchar_t *uimsg; |
| 614 |
SysMenu = ::GetSystemMenu(tk.HWin,FALSE); |
| 615 |
AppendMenuW(SysMenu, MF_SEPARATOR, 0, NULL); |
| 616 |
GetI18nStrWW("Tera Term", "TEKMENU_SHOW_MENUBAR", L"Show menu &bar", ts.UILanguageFileW, &uimsg); |
| 617 |
AppendMenuW(SysMenu, MF_STRING, ID_SHOWMENUBAR, uimsg); |
| 618 |
free(uimsg); |
| 619 |
} |
| 620 |
return 0; |
| 621 |
} |
| 622 |
|
| 623 |
LRESULT CTEKWindow::OnChangeTBar(WPARAM wParam, LPARAM lParam) |
| 624 |
{ |
| 625 |
BOOL TBar; |
| 626 |
DWORD Style; |
| 627 |
HMENU SysMenu; |
| 628 |
|
| 629 |
Style = GetWindowLongPtr (GWL_STYLE); |
| 630 |
TBar = ((Style & WS_SYSMENU)!=0); |
| 631 |
if (TBar == (ts.HideTitle==0)) { |
| 632 |
return 0; |
| 633 |
} |
| 634 |
if (ts.HideTitle>0) { |
| 635 |
Style = Style & ~(WS_SYSMENU | WS_CAPTION | |
| 636 |
WS_MINIMIZEBOX) | WS_BORDER | WS_POPUP; |
| 637 |
} |
| 638 |
else { |
| 639 |
Style = Style & ~WS_POPUP | WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX; |
| 640 |
} |
| 641 |
tk.AdjustSize = TRUE; |
| 642 |
SetWindowLongPtr (GWL_STYLE, Style); |
| 643 |
::SetWindowPos (HTEKWin, NULL, 0, 0, 0, 0, |
| 644 |
SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); |
| 645 |
::ShowWindow (HTEKWin, SW_SHOW); |
| 646 |
|
| 647 |
if ((ts.HideTitle==0) && (MainMenu==NULL) && |
| 648 |
((ts.MenuFlag & MF_NOSHOWMENU) == 0)) { |
| 649 |
wchar_t *uimsg; |
| 650 |
SysMenu = ::GetSystemMenu(HTEKWin,FALSE); |
| 651 |
AppendMenuW(SysMenu, MF_SEPARATOR, 0, NULL); |
| 652 |
GetI18nStrWW("Tera Term", "TEKMENU_SHOW_MENUBAR", L"Show menu &bar", ts.UILanguageFileW, &uimsg); |
| 653 |
AppendMenuW(SysMenu, MF_STRING, ID_SHOWMENUBAR, uimsg); |
| 654 |
free(uimsg); |
| 655 |
} |
| 656 |
return 0; |
| 657 |
} |
| 658 |
|
| 659 |
LRESULT CTEKWindow::OnDlgHelp(WPARAM wParam, LPARAM lParam) |
| 660 |
{ |
| 661 |
DWORD help_id = (wParam == 0) ? HelpId : (DWORD)wParam; |
| 662 |
OpenHelpCV(&cv, HH_HELP_CONTEXT, help_id); |
| 663 |
return 0; |
| 664 |
} |
| 665 |
|
| 666 |
LRESULT CTEKWindow::OnGetSerialNo(WPARAM wParam, LPARAM lParam) |
| 667 |
{ |
| 668 |
return (LONG)SerialNo; |
| 669 |
} |
| 670 |
|
| 671 |
void CTEKWindow::OnFilePrint() |
| 672 |
{ |
| 673 |
BOOL Sel; |
| 674 |
HDC PrintDC; |
| 675 |
|
| 676 |
HelpId = HlpTEKFilePrint; |
| 677 |
|
| 678 |
Sel = tk.Select; |
| 679 |
PrintDC = PrnBox(tk.HWin,&Sel); |
| 680 |
if (PrintDC==NULL) { |
| 681 |
return; |
| 682 |
} |
| 683 |
if (! PrnStart(ts.Title)) { |
| 684 |
return; |
| 685 |
} |
| 686 |
|
| 687 |
(*TEKPrint)(&tk,&ts,PrintDC,Sel); |
| 688 |
|
| 689 |
PrnStop(); |
| 690 |
} |
| 691 |
|
| 692 |
void CTEKWindow::OnFileExit() |
| 693 |
{ |
| 694 |
DestroyWindow(); |
| 695 |
} |
| 696 |
|
| 697 |
void CTEKWindow::OnEditCopy() |
| 698 |
{ |
| 699 |
(*TEKCMCopy)(&tk,&ts); |
| 700 |
} |
| 701 |
|
| 702 |
void CTEKWindow::OnEditCopyScreen() |
| 703 |
{ |
| 704 |
(*TEKCMCopyScreen)(&tk,&ts); |
| 705 |
} |
| 706 |
|
| 707 |
void CTEKWindow::OnEditPaste() |
| 708 |
{ |
| 709 |
CBStartPaste(tk.HWin, FALSE, FALSE); |
| 710 |
} |
| 711 |
|
| 712 |
void CTEKWindow::OnEditPasteCR() |
| 713 |
{ |
| 714 |
CBStartPaste(tk.HWin, TRUE, FALSE); |
| 715 |
} |
| 716 |
|
| 717 |
void CTEKWindow::OnEditClearScreen() |
| 718 |
{ |
| 719 |
(*TEKClearScreen)(&tk,&ts); |
| 720 |
} |
| 721 |
|
| 722 |
void CTEKWindow::OnSetupWindow() |
| 723 |
{ |
| 724 |
BOOL Ok; |
| 725 |
WORD OldEmu; |
| 726 |
|
| 727 |
HelpId = HlpTEKSetupWindow; |
| 728 |
ts.VTFlag = 0; |
| 729 |
ts.SampleFont = tk.TEKFont[0]; |
| 730 |
|
| 731 |
if (! LoadTTDLG()) { |
| 732 |
return; |
| 733 |
} |
| 734 |
OldEmu = ts.TEKColorEmu; |
| 735 |
SetDialogFont(ts.DialogFontNameW, ts.DialogFontPoint, ts.DialogFontCharSet, |
| 736 |
ts.UILanguageFileW, "Tera Term", "DLG_SYSTEM_FONT"); |
| 737 |
Ok = (*SetupWin)(HTEKWin, &ts); |
| 738 |
if (Ok) { |
| 739 |
(*TEKResetWin)(&tk,&ts,OldEmu); |
| 740 |
ChangeTitle(); |
| 741 |
SwitchMenu(); |
| 742 |
SwitchTitleBar(); |
| 743 |
} |
| 744 |
} |
| 745 |
|
| 746 |
void CTEKWindow::OnSetupFont() |
| 747 |
{ |
| 748 |
BOOL Ok; |
| 749 |
|
| 750 |
HelpId = HlpTEKSetupFont; |
| 751 |
ts.VTFlag = 0; |
| 752 |
if (! LoadTTDLG()) { |
| 753 |
return; |
| 754 |
} |
| 755 |
Ok = (*ChooseFontDlg)(HTEKWin,&tk.TEKlf,&ts); |
| 756 |
if (! Ok) { |
| 757 |
return; |
| 758 |
} |
| 759 |
|
| 760 |
(*TEKSetupFont)(&tk,&ts); |
| 761 |
} |
| 762 |
|
| 763 |
void CTEKWindow::OnVTWin() |
| 764 |
{ |
| 765 |
VTActivate(); |
| 766 |
} |
| 767 |
|
| 768 |
void CTEKWindow::OnWindowWindow() |
| 769 |
{ |
| 770 |
BOOL Close; |
| 771 |
|
| 772 |
HelpId = HlpWindowWindow; |
| 773 |
if (! LoadTTDLG()) { |
| 774 |
return; |
| 775 |
} |
| 776 |
SetDialogFont(ts.DialogFontNameW, ts.DialogFontPoint, ts.DialogFontCharSet, |
| 777 |
ts.UILanguageFileW, "Tera Term", "DLG_SYSTEM_FONT"); |
| 778 |
(*WindowWindow)(HTEKWin,&Close); |
| 779 |
if (Close) { |
| 780 |
OnClose(); |
| 781 |
} |
| 782 |
} |
| 783 |
|
| 784 |
void CTEKWindow::OnHelpIndex() |
| 785 |
{ |
| 786 |
OpenHelpCV(&cv, HH_DISPLAY_TOPIC, 0); |
| 787 |
} |
| 788 |
|
| 789 |
void CTEKWindow::OnHelpAbout() |
| 790 |
{ |
| 791 |
if (! LoadTTDLG()) { |
| 792 |
return; |
| 793 |
} |
| 794 |
(*AboutDialog)(tk.HWin); |
| 795 |
} |
| 796 |
|
| 797 |
LRESULT CTEKWindow::Proc(UINT msg, WPARAM wp, LPARAM lp) |
| 798 |
{ |
| 799 |
LRESULT retval = 0; |
| 800 |
if (msg == MsgDlgHelp) { |
| 801 |
// HELPMSGSTRING message �� |
| 802 |
// wp = dialog handle |
| 803 |
// lp = initialization structure |
| 804 |
OnDlgHelp(HelpId, 0); |
| 805 |
return 0; |
| 806 |
} |
| 807 |
switch(msg) |
| 808 |
{ |
| 809 |
case WM_ACTIVATE: |
| 810 |
OnActivate(wp & 0xFFFF, (HWND)wp, (wp >> 16) & 0xFFFF); |
| 811 |
break; |
| 812 |
case WM_CHAR: |
| 813 |
OnChar(wp, LOWORD(lp), HIWORD(lp)); |
| 814 |
break; |
| 815 |
case WM_DESTROY: |
| 816 |
OnDestroy(); |
| 817 |
break; |
| 818 |
case WM_GETMINMAXINFO: |
| 819 |
OnGetMinMaxInfo((MINMAXINFO *)lp); |
| 820 |
break; |
| 821 |
case WM_INITMENUPOPUP: |
| 822 |
OnInitMenuPopup((HMENU)wp, LOWORD(lp), HIWORD(lp)); |
| 823 |
break; |
| 824 |
case WM_KEYDOWN: |
| 825 |
OnKeyDown(wp, LOWORD(lp), HIWORD(lp)); |
| 826 |
break; |
| 827 |
case WM_KEYUP: |
| 828 |
OnKeyUp(wp, LOWORD(lp), HIWORD(lp)); |
| 829 |
break; |
| 830 |
case WM_KILLFOCUS: |
| 831 |
OnKillFocus((HWND)wp); |
| 832 |
break; |
| 833 |
case WM_LBUTTONDOWN: |
| 834 |
OnLButtonDown(wp, MAKEPOINTS(lp)); |
| 835 |
break; |
| 836 |
case WM_LBUTTONUP: |
| 837 |
OnLButtonUp(wp, MAKEPOINTS(lp)); |
| 838 |
break; |
| 839 |
case WM_MBUTTONUP: |
| 840 |
OnMButtonUp(wp, MAKEPOINTS(lp)); |
| 841 |
break; |
| 842 |
case WM_MOUSEACTIVATE: |
| 843 |
retval = OnMouseActivate((HWND)wp, LOWORD(lp), HIWORD(lp)); |
| 844 |
break; |
| 845 |
case WM_MOUSEMOVE: |
| 846 |
OnMouseMove(wp, MAKEPOINTS(lp)); |
| 847 |
break; |
| 848 |
case WM_MOVE: |
| 849 |
OnMove(LOWORD(lp), HIWORD(lp)); |
| 850 |
break; |
| 851 |
case WM_PAINT: |
| 852 |
OnPaint(); |
| 853 |
break; |
| 854 |
case WM_RBUTTONUP: |
| 855 |
OnRButtonUp((UINT)wp, MAKEPOINTS(lp)); |
| 856 |
break; |
| 857 |
case WM_SETFOCUS: |
| 858 |
OnSetFocus((HWND)wp); |
| 859 |
DefWindowProc(msg, wp, lp); |
| 860 |
break; |
| 861 |
case WM_SIZE: |
| 862 |
OnSize(wp, LOWORD(lp), HIWORD(lp)); |
| 863 |
break; |
| 864 |
case WM_SYSCOMMAND: |
| 865 |
OnSysCommand(wp, lp); |
| 866 |
DefWindowProc(msg, wp, lp); |
| 867 |
break; |
| 868 |
case WM_SYSKEYDOWN: |
| 869 |
OnSysKeyDown(wp, LOWORD(lp), HIWORD(lp)); |
| 870 |
break; |
| 871 |
case WM_SYSKEYUP: |
| 872 |
OnSysKeyUp(wp, LOWORD(lp), HIWORD(lp)); |
| 873 |
break; |
| 874 |
case WM_TIMER: |
| 875 |
OnTimer(wp); |
| 876 |
break; |
| 877 |
case WM_USER_ACCELCOMMAND: |
| 878 |
OnAccelCommand(wp, lp); |
| 879 |
break; |
| 880 |
case WM_USER_CHANGEMENU: |
| 881 |
OnChangeMenu(wp, lp); |
| 882 |
break; |
| 883 |
case WM_USER_CHANGETBAR: |
| 884 |
OnChangeTBar(wp, lp); |
| 885 |
break; |
| 886 |
case WM_USER_DLGHELP2: |
| 887 |
OnDlgHelp(wp, lp); |
| 888 |
break; |
| 889 |
case WM_USER_GETSERIALNO: |
| 890 |
OnGetSerialNo(wp, lp); |
| 891 |
break; |
| 892 |
case WM_COMMAND: |
| 893 |
{ |
| 894 |
const WORD wID = GET_WM_COMMAND_ID(wp, lp); |
| 895 |
switch (wID) { |
| 896 |
case ID_TEKFILE_PRINT: OnFilePrint(); break; |
| 897 |
case ID_TEKFILE_EXIT: OnFileExit(); break; |
| 898 |
case ID_TEKEDIT_COPY: OnEditCopy(); break; |
| 899 |
case ID_TEKEDIT_COPYSCREEN: OnEditCopyScreen(); break; |
| 900 |
case ID_TEKEDIT_PASTE: OnEditPaste(); break; |
| 901 |
case ID_TEKEDIT_PASTECR: OnEditPasteCR(); break; |
| 902 |
case ID_TEKEDIT_CLEARSCREEN: OnEditClearScreen(); break; |
| 903 |
case ID_TEKSETUP_WINDOW: OnSetupWindow(); break; |
| 904 |
case ID_TEKSETUP_FONT: OnSetupFont(); break; |
| 905 |
case ID_TEKVTWIN: OnVTWin(); break; |
| 906 |
case ID_TEKWINDOW_WINDOW: OnWindowWindow(); break; |
| 907 |
case ID_TEKHELP_INDEX: OnHelpIndex(); break; |
| 908 |
case ID_TEKHELP_ABOUT: OnHelpAbout(); break; |
| 909 |
default: |
| 910 |
OnCommand(wp, lp); |
| 911 |
break; |
| 912 |
} |
| 913 |
break; |
| 914 |
} |
| 915 |
case WM_NCHITTEST: { |
| 916 |
retval = TTCFrameWnd::DefWindowProc(msg, wp, lp); |
| 917 |
if (ts.HideTitle>0) { |
| 918 |
if ((retval ==HTCLIENT) && AltKey()) { |
| 919 |
retval = HTCAPTION; |
| 920 |
} |
| 921 |
} |
| 922 |
break; |
| 923 |
} |
| 924 |
case WM_DPICHANGED: { |
| 925 |
const UINT NewDPI = LOWORD(wp); |
| 926 |
TTSetIcon(m_hInst, m_hWnd, MAKEINTRESOURCEW((ts.TEKIcon!=IdIconDefault)?ts.TEKIcon:IDI_TEK), NewDPI); |
| 927 |
break; |
| 928 |
} |
| 929 |
default: |
| 930 |
retval = DefWindowProc(msg, wp, lp); |
| 931 |
break; |
| 932 |
} |
| 933 |
|
| 934 |
return retval; |
| 935 |
} |