/* * Copyright 1994 by Hilgraeve Inc. -- Monroe, MI * All rights reserved * * $Revision: 24 $ * $Date: 7/12/02 12:42p $ */ // #define DEBUGSTR 1 #include #pragma hdrstop #include #include #include "stdtyp.h" #include "assert.h" #include "globals.h" #include "session.h" #include "session.hh" #include "term.h" #include "print.h" #include "cnct.h" #include "misc.h" #include "banner.h" #include "file_msc.h" #include "errorbox.h" #include "load_res.h" #include "sf.h" #include "cloop.h" #include "com.h" #include "timers.h" #include "capture.h" #include "xfer_msc.h" #include #include #include #include #include "property.h" #include "htchar.h" #include "backscrl.h" //mpt:08-22-97 added HTML help #if defined(INCL_USE_HTML_HELP) #include #endif #include "tdll.h" #include "hlptable.h" #include "statusbr.h" //*jcm #include "open_msc.h" #include "mc.h" //*end of jcm #if defined(TESTMENU) && !defined(NDEBUG) #include #endif #ifdef INCL_KEY_MACROS #include "keyutil.h" #endif #ifdef INCL_NAG_SCREEN #include "nagdlg.h" #include "register.h" #endif STATIC_FUNC void SP_WM_SIZE(const HWND hwnd, const unsigned fwSizeType, const int iWidth, const int iHite); STATIC_FUNC void SP_WM_CREATE(const HWND hwnd, const CREATESTRUCT *pcs); STATIC_FUNC void SP_WM_DESTROY(const HWND hwnd); STATIC_FUNC LRESULT SP_WM_CMD(const HWND hwnd, const int nId, const int nNotify, const HWND hwndCtrl); STATIC_FUNC void SP_WM_INITMENUPOPUP(const HWND hwnd, const HMENU hMenu, const UINT uPos, const BOOL fSysMenu); STATIC_FUNC void SP_WM_CONTEXTMENU(const HWND hwnd); STATIC_FUNC BOOL SP_WM_CLOSE(const HWND hwnd); STATIC_FUNC int CheckOpenFile(const HSESSION hSession, ATOM aFile); /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * FUNCTION: * SessProc * * DESCRIPTION: * Main window proc for term * */ LRESULT CALLBACK SessProc(HWND hwnd, UINT uMsg, WPARAM wPar, LPARAM lPar) { HSESSION hSession; #if defined(INCL_USE_HTML_HELP) TCHAR achHtmlFilename[100]; #endif switch (uMsg) { // User pressed F1 key over the session window. // We also get this message from child windows if they do not process // it themselves. // case WM_HELP: //#if 0 //mpt:3-10-98 for some reason, using this call causes an access violation // in HyperTrm.dll. Using the winhelp call gives us the same results. //mpt:4-30-98 Re-enabled for the NT folks - go figure #if defined(INCL_USE_HTML_HELP) LoadString(glblQueryDllHinst(), IDS_HTML_HELPFILE, achHtmlFilename, sizeof(achHtmlFilename) / sizeof(TCHAR)); HtmlHelp(0, achHtmlFilename, HH_HELP_FINDER, 0); //formely owned by hwnd - mpt #else WinHelp(hwnd, glblQueryHelpFileName(), HELP_FINDER, // mrw:3/10/95 (DWORD)(LPTSTR)""); #endif return 0; case WM_CREATE: SP_WM_CREATE(hwnd, (CREATESTRUCT *)lPar); return 0; case WM_SIZE: SP_WM_SIZE(hwnd, (unsigned)wPar, LOWORD(lPar), HIWORD(lPar)); return 0; case WM_COMMAND: return SP_WM_CMD(hwnd, LOWORD(wPar), HIWORD(wPar), (HWND)lPar); case WM_TIMER: case WM_FAKE_TIMER: hSession = (HSESSION)GetWindowLongPtr(hwnd, GWLP_USERDATA); TimerMuxProc(hSession); return 0; case WM_SETFOCUS: hSession = (HSESSION)GetWindowLongPtr(hwnd, GWLP_USERDATA); SetFocus(sessQueryHwndTerminal(hSession)); return 0; case WM_SYSCOLORCHANGE: hSession = (HSESSION)GetWindowLongPtr(hwnd, GWLP_USERDATA); SendDlgItemMessage(hwnd, IDC_TERMINAL_WIN, uMsg, wPar, lPar); return 0; case WM_GETMINMAXINFO: hSession = (HSESSION)GetWindowLongPtr(hwnd, GWLP_USERDATA); sessSetMinMaxInfo(hSession, (PMINMAXINFO)lPar); return 0; case WM_CONTEXTMENU: SP_WM_CONTEXTMENU(hwnd); return 0; case WM_INITMENUPOPUP: SP_WM_INITMENUPOPUP(hwnd, (HMENU)wPar, LOWORD(lPar), HIWORD(lPar)); return 0; case WM_EXITMENULOOP: hSession = (HSESSION)GetWindowLongPtr(hwnd, GWLP_USERDATA); PostMessage(sessQueryHwndStatusbar(hSession), SBR_NTFY_REFRESH, (WPARAM)SBR_MAX_PARTS, 0); break; case WM_MENUSELECT: { TCHAR ach[128]; hSession = (HSESSION)GetWindowLongPtr(hwnd, GWLP_USERDATA); if (HIWORD(wPar) & MF_POPUP) { SendMessage(sessQueryHwndStatusbar(hSession), SBR_NTFY_NOPARTS, 0, (LPARAM)(LPTSTR)""); return 0; } if (LOWORD(wPar)) { LoadString(glblQueryDllHinst(), IDM_MENU_BASE+LOWORD(wPar), ach, sizeof(ach) / sizeof(TCHAR)); SendMessage(sessQueryHwndStatusbar(hSession), SBR_NTFY_NOPARTS, 0, (LPARAM)(LPTSTR)ach); } } return 0; case WM_PASTE: hSession = (HSESSION)GetWindowLongPtr(hwnd, GWLP_USERDATA); PasteFromClipboardToHost(hwnd, hSession); return 0; case WM_DRAWITEM: if (wPar == IDC_STATUS_WIN) { hSession = (HSESSION)GetWindowLongPtr(hwnd, GWLP_USERDATA); sbr_WM_DRAWITEM(sessQueryHwndStatusbar(hSession), (LPDRAWITEMSTRUCT)lPar); return 1; } return 0; case WM_QUERYENDSESSION: case WM_CLOSE: if (!SP_WM_CLOSE(hwnd)) return 0; break; case WM_DESTROY: SP_WM_DESTROY(hwnd); return 0; /* --- Public Session Messages --- */ case WM_NOTIFY: DecodeNotification(hwnd, wPar, lPar); return 1; case WM_SESS_NOTIFY: DecodeSessionNotification(hwnd, (NOTIFICATION)wPar, lPar); return 1; case WM_SESS_ENDDLG: if (IsWindow((HWND)lPar)) { // I think that this needs to be done in this order. // Think about it. DestroyWindow((HWND)lPar); glblDeleteModelessDlgHwnd((HWND)lPar); } return 0; case WM_CMDLN_DIAL: hSession = (HSESSION)GetWindowLongPtr(hwnd, GWLP_USERDATA); // mrw:4/21/95 by microsoft's request //if (sessQueryWindowShowCmd(hSession) != SW_SHOWMINIMIZED) sessCmdLnDial(hSession); return 0; case WM_SESS_SIZE_SHOW: sessSizeAndShow(hwnd, (int)wPar); return 0; case WM_CNCT_DIALNOW: // wPar contains connection flags // hSession = (HSESSION)GetWindowLongPtr(hwnd, GWLP_USERDATA); cnctConnect(sessQueryCnctHdl(hSession), (unsigned int)wPar); return 0; case WM_DISCONNECT: // wPar contains disconnection flags // hSession = (HSESSION)GetWindowLongPtr(hwnd, GWLP_USERDATA); cnctDisconnect(sessQueryCnctHdl(hSession), (unsigned int)wPar); return 0; case WM_HT_QUERYOPENFILE: hSession = (HSESSION)GetWindowLongPtr(hwnd, GWLP_USERDATA); return CheckOpenFile(hSession, (ATOM)lPar); case WM_SESS_SHOW_SIDEBAR: // Autoloads can't do this directly or they hang hypertrm. // hSession = (HSESSION)GetWindowLongPtr(hwnd, GWLP_USERDATA); ShowWindow(sessQuerySidebarHwnd(hSession), SW_SHOW); // Force terminal window to fit // SendDlgItemMessage(hwnd, IDC_TERMINAL_WIN, WM_SIZE, 0, 0); return 0; case WM_ERROR_MSG: { TCHAR ach[128]; LoadString(glblQueryDllHinst(), (UINT)wPar, ach, sizeof(ach)/sizeof(TCHAR)); TimedMessageBox(hwnd, ach, "Message", MB_OK, 0); } return 0; default: break; } return DefWindowProc(hwnd, uMsg, wPar, lPar); } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * FUNCTION: * SP_WM_CMD * * DESCRIPTION: * WM_COMMAND processor for SessProc() * * ARGUMENTS: * hwnd - session window handle * nId - item, control, or accelerator identifier * nNotify - notification code * hwndCtrl - handle of control * * RETURNS: * void * */ STATIC_FUNC LRESULT SP_WM_CMD(const HWND hwnd, const int nId, const int nNotify, const HWND hwndCtrl) { const HSESSION hSession = (HSESSION)GetWindowLongPtr(hwnd, GWLP_USERDATA); DWORD dwCnt; void *pv; LPTSTR pszFileName; TCHAR ach[100], achList[100], achDir[MAX_PATH]; #if defined(INCL_USE_HTML_HELP) TCHAR achHtmlFilename[100]; #endif switch (nId) { case IDC_TOOLBAR_WIN: /* Got a notification from the toolbar */ return ToolbarNotification(hwnd, nId, nNotify, hwndCtrl); /* --- File Menu --- */ case IDM_NEW: if (!sessDisconnectToContinue(hSession, hwnd)) break; if (SaveSession(hSession, hwnd)) { if (ReinitializeSessionHandle(hSession, TRUE) == FALSE) break; cnctConnect(sessQueryCnctHdl(hSession), CNCT_NEW); } PostMessage(sessQueryHwndStatusbar(hSession), SBR_NTFY_REFRESH, (WPARAM)SBR_KEY_PARTS, 0); break; case IDM_OPEN: if (!sessDisconnectToContinue(hSession, hwnd)) break; // In the OpenSession() we will ask if the user wants to save // existing opened new session, or save silently, only after the // user has commited to opening a new one by pressing the OK button. // -jac. 10-06-94 03:56pm if (OpenSession(hSession, hwnd) >= 0) { PostMessage(sessQueryHwndStatusbar(hSession), SBR_NTFY_REFRESH, (WPARAM)SBR_MAX_PARTS, 0); // Run through the connection procedure. This message is // Posted instead of calling cnctConnect directly to avoid // a focus problem on the connection dialog. Calling // cnctConnect from here leaves focus on the terminal screen, // instead of on the connection dialog, which is where we want it. // PostMessage(hwnd, WM_COMMAND, IDM_ACTIONS_DIAL, 0); } break; case IDM_SAVE: SilentSaveSession(hSession, hwnd, TRUE); break; case IDM_SAVE_AS: SaveAsSession(hSession, hwnd); PostMessage(sessQueryHwndStatusbar(hSession), SBR_NTFY_REFRESH, (WPARAM)SBR_KEY_PARTS, 0); break; case IDA_CONTEXT_MENU: // SHIFT+F10 SP_WM_CONTEXTMENU(hwnd); return 0; case IDM_PAGESETUP: case IDM_CHOOSEPRINT: printPageSetup(sessQueryPrintHdl(hSession), hwnd); PostMessage(sessQueryHwndStatusbar(hSession), SBR_NTFY_REFRESH, (WPARAM)SBR_KEY_PARTS, 0); break; case IDM_PRINT: case IDM_CONTEXT_PRINT: printsetSetup(sessQueryPrintHdl(hSession), hwnd); break; case IDM_PROPERTIES: DoInternalProperties(hSession, hwnd); PostMessage(sessQueryHwndStatusbar(hSession), SBR_NTFY_REFRESH, (WPARAM)SBR_ALL_PARTS, 0); break; case IDM_EXIT: PostMessage(hwnd, WM_CLOSE, 0, 0); break; /* --- Edit Menu --- */ case IDM_SELECT_ALL: case IDM_CONTEXT_SELECT_ALL: SendMessage(sessQueryHwndTerminal(hSession), WM_TERM_MARK_ALL, 0, 0); break; case IDM_PASTE: case IDM_CONTEXT_PASTE: SendMessage(hwnd, WM_PASTE, 0, 0L); break; case IDM_COPY: case IDM_CONTEXT_COPY: if (CopyMarkedTextFromTerminal(hSession, &pv, &dwCnt, TRUE)) { CopyBufferToClipBoard(hwnd, dwCnt, pv); SendMessage(sessQueryHwndTerminal(hSession), WM_TERM_UNMARK, 0, 0); free(pv); // free allocated buffer from terminal pv = NULL; } break; case IDM_CLEAR_BACKSCROLL: #if defined(INCL_TERMINAL_CLEAR) case IDM_CONTEXT_CLEAR_BACKSCROLL: #endif backscrlFlush(sessQueryBackscrlHdl(hSession)); break; #if defined(INCL_TERMINAL_CLEAR) case IDM_CLEAR_SCREEN: case IDM_CONTEXT_CLEAR_SCREEN: emuEraseTerminalScreen(sessQueryEmuHdl(hSession)); emuHomeHostCursor(sessQueryEmuHdl(hSession)); NotifyClient(hSession, EVENT_TERM_UPDATE, 0); RefreshTermWindow(sessQueryHwndTerminal(hSession)); break; #endif /* --- View Menu --- */ case IDM_VIEW_TOOLBAR: sessSetToolbarVisible(hSession, !sessQueryToolbarVisible(hSession)); SP_WM_SIZE(hwnd, (unsigned)(-1), 0, 0); PostMessage(sessQueryHwndStatusbar(hSession), SBR_NTFY_REFRESH, (WPARAM)SBR_MAX_PARTS, 0); break; case IDM_VIEW_STATUS: sessSetStatusbarVisible(hSession, !sessQueryStatusbarVisible(hSession)); SP_WM_SIZE(hwnd, (unsigned)(-1), 0, 0); PostMessage(sessQueryHwndStatusbar(hSession), SBR_NTFY_REFRESH, (WPARAM)SBR_MAX_PARTS, 0); break; case IDM_VIEW_FONTS: DisplayFontDialog(hSession, FALSE); PostMessage(sessQueryHwndStatusbar(hSession), SBR_NTFY_REFRESH, (WPARAM)SBR_KEY_PARTS, 0); break; case IDM_VIEW_SNAP: case IDM_CONTEXT_SNAP: sessSnapToTermWindow(hwnd); break; #ifdef INCL_KEY_MACROS case IDM_KEY_MACROS: DoDialog(glblQueryDllHinst(), MAKEINTRESOURCE(IDD_KEYSUMMARYDLG), hwnd, KeySummaryDlg, (LPARAM)hSession); break; #endif /* --- Actions Menu --- */ case IDM_ACTIONS_DIAL: { HWND hWnd = sessQueryHwnd(hSession); cnctConnect(sessQueryCnctHdl(hSession), 0); PostMessage(sessQueryHwndStatusbar(hSession), SBR_NTFY_REFRESH, (WPARAM)SBR_KEY_PARTS, 0); if (hWnd != NULL) { PostMessage(hWnd, WM_COMMAND, XFER_CNCT, 0); } } break; case IDM_ACTIONS_HANGUP: { HWND hWnd = sessQueryHwnd(hSession); //mpt:10-28-97 added exit upon disconnect feature // REV: 02/16/2001 Added support for canceling file transfers. int iDisconnectStatus = cnctDisconnect(sessQueryCnctHdl(hSession), sessQueryExit(hSession) ? DISCNCT_EXIT | CNCT_XFERABORTCONFIRM : CNCT_XFERABORTCONFIRM); if (hWnd != NULL && iDisconnectStatus != CNCT_IN_DISCONNECT) { PostMessage(hWnd, WM_COMMAND, XFER_CNCT, 0); } } break; case IDM_ACTIONS_SEND: case IDM_CONTEXT_SEND: DoDialog(glblQueryDllHinst(), MAKEINTRESOURCE(IDD_TRANSFERSEND), hwnd, /* parent window */ TransferSendDlg, (LPARAM)hSession); break; case IDM_ACTIONS_RCV: case IDM_CONTEXT_RECEIVE: /* * This will probably need to be modeless later. * Maybe only for Upper Wacker. */ DoDialog(glblQueryDllHinst(), MAKEINTRESOURCE(IDD_TRANSFERRECEIVE), hwnd, TransferReceiveDlg, (LPARAM)hSession); break; case IDM_ACTIONS_CAP: DoDialog(glblQueryDllHinst(), MAKEINTRESOURCE(IDD_CAPTURE), hwnd, CaptureFileDlg, (LPARAM)hSession); PostMessage(sessQueryHwndStatusbar(hSession), SBR_NTFY_REFRESH, (WPARAM)SBR_CAPT_PART_NO, 0); break; case IDM_CAPTURE_STOP: cpfSetCaptureState(sessQueryCaptureFileHdl(hSession), CPF_CAPTURE_OFF); PostMessage(sessQueryHwndStatusbar(hSession), SBR_NTFY_REFRESH, (WPARAM)SBR_CAPT_PART_NO, 0); break; case IDM_CAPTURE_PAUSE: cpfSetCaptureState(sessQueryCaptureFileHdl(hSession), CPF_CAPTURE_PAUSE); PostMessage(sessQueryHwndStatusbar(hSession), SBR_NTFY_REFRESH, (WPARAM)SBR_CAPT_PART_NO, 0); break; case IDM_CAPTURE_RESUME: cpfSetCaptureState(sessQueryCaptureFileHdl(hSession), CPF_CAPTURE_ON); PostMessage(sessQueryHwndStatusbar(hSession), SBR_NTFY_REFRESH, (WPARAM)SBR_CAPT_PART_NO, 0); break; case IDM_ACTIONS_SEND_TEXT: LoadString(glblQueryDllHinst(), IDS_SND_TXT_FILE, ach, sizeof(ach)/sizeof(TCHAR)); resLoadFileMask(glblQueryDllHinst(), IDS_CPF_FILES1, 2, achList, sizeof(achList) / sizeof(TCHAR)); //Changed to use working folder rather than current folder - mpt 8-18-99 if ( !GetWorkingDirectory( achDir, sizeof(achDir) / sizeof(TCHAR)) ) { GetCurrentDirectory(sizeof(achDir) / sizeof(TCHAR), achDir); } pszFileName = gnrcFindFileDialog(hwnd, ach, achDir, achList); if (pszFileName) { CLoopSendTextFile(sessQueryCLoopHdl(hSession), pszFileName); free(pszFileName); pszFileName = NULL; } break; case IDM_ACTIONS_PRINT: if (!printQueryStatus(emuQueryPrintEchoHdl(sessQueryEmuHdl(hSession)))) { if (printVerifyPrinter(sessQueryPrintHdl(hSession)) == -1) break; } else { printEchoClose(emuQueryPrintEchoHdl(sessQueryEmuHdl(hSession))); } printStatusToggle(emuQueryPrintEchoHdl(sessQueryEmuHdl(hSession))); PostMessage(sessQueryHwndStatusbar(hSession), SBR_NTFY_REFRESH, (WPARAM)SBR_PRNE_PART_NO, 0); break; case IDM_ACTIONS_WAIT_FOR_CALL: cnctConnect(sessQueryCnctHdl(hSession), CNCT_ANSWER); break; case IDM_ACTIONS_STOP_WAITING: cnctDisconnect(sessQueryCnctHdl(hSession), DISCNCT_NOBEEP); break; /* --- Help Menu --- */ case IDM_HELPTOPICS: //#if 0 //mpt:3-10-98 for some reason, using this call causes an access violation // in HyperTrm.dll. Using the winhelp call gives us the same results. //mpt:4-30-98 Re-enabled for the NT folks - go figure #if defined(INCL_USE_HTML_HELP) LoadString(glblQueryDllHinst(), IDS_HTML_HELPFILE, achHtmlFilename, sizeof(achHtmlFilename) / sizeof(TCHAR)); HtmlHelp(0, achHtmlFilename, HH_HELP_FINDER, 0); #else WinHelp(hwnd, glblQueryHelpFileName(), HELP_FINDER, // mrw:3/10/95 (DWORD)(LPTSTR)""); #endif break; #if defined(INCL_NAG_SCREEN) case IDM_PURCHASE_INFO: DoUpgradeDlg(hwnd); break; case IDM_REG_CODE: DoRegisterDlg(hwnd); break; case IDM_REGISTER: DoRegister(); break; case IDM_DISCUSSION: ShellExecute(NULL, "open", TEXT("http://www.hilgraeve.com/discuss"), NULL, NULL, SW_SHOW); break; #endif case IDM_ABOUT: AboutDlg(hwnd); break; /* --- Session Context Menu --- */ // Other context menu items are placed with their main menu // equivalents. #if 0 // mrw, 1/27/95 case IDM_CONTEXT_WHATS_THIS: WinHelp(hwnd, glblQueryHelpFileName(), HELP_CONTEXTPOPUP, (DWORD)(LPTSTR)IDH_TERM_CONTEXT_WHATS_THIS); break; #endif #if defined(TESTMENU) && !defined(NDEBUG) /* --- Test Menu --- */ case IDM_TEST_SAVEAS: SaveAsSession(hSession, hwnd); break; case IDM_TEST_CLEARTERM: break; case IDM_TEST_CLEARBACK: break; case IDM_TEST_SELECTTERM: break; case IDM_TEST_SELECTBACK: break; case IDM_TEST_TESTFILE: { pszFileName = 0; pszFileName = gnrcFindFileDialog(hwnd, "Emulator test file", "D:\\WACKER", "Text files\0*.TXT\0Ansi files\0*.ans\0VT100 files\0*.100"); if (pszFileName) { CLoopSendTextFile(sessQueryCLoopHdl(hSession), pszFileName); free(pszFileName); pszFileName = NULL; } } break; case IDM_TEST_BEZEL: SendMessage(sessQueryHwndTerminal(hSession), WM_TERM_BEZEL, 0, 0); break; case IDM_TEST_SNAP: sessSnapToTermWindow(hwnd); break; case IDM_TEST_NEW_CONNECTION: DoDialog(glblQueryDllHinst(), MAKEINTRESOURCE(IDD_NEWCONNECTION), hwnd, NewConnectionDlg, (LPARAM)hSession); break; case IDM_TEST_FLUSH_BACKSCRL: backscrlFlush(sessQueryBackscrlHdl(hSession)); break; case IDM_TEST_LOAD_ANSI: emuLoad(sessQueryEmuHdl(hSession), EMU_ANSI); break; case IDM_TEST_LOAD_MINITEL: emuLoad(sessQueryEmuHdl(hSession), EMU_MINI); break; case IDM_TEST_LOAD_VIEWDATA: emuLoad(sessQueryEmuHdl(hSession), EMU_VIEW); break; case IDM_TEST_LOAD_AUTO: emuLoad(sessQueryEmuHdl(hSession), EMU_AUTO); break; case IDM_TEST_LOAD_TTY: emuLoad(sessQueryEmuHdl(hSession), EMU_TTY); break; case IDM_TEST_LOAD_VT52: emuLoad(sessQueryEmuHdl(hSession), EMU_VT52); break; case IDM_TEST_LOAD_VT100: emuLoad(sessQueryEmuHdl(hSession), EMU_VT100); break; #if defined(INCL_VT220) case IDM_TEST_LOAD_VT220: emuLoad(sessQueryEmuHdl(hSession), EMU_VT220); break; #endif #if defined(INCL_VT320) case IDM_TEST_LOAD_VT320: emuLoad(sessQueryEmuHdl(hSession), EMU_VT320); break; #endif #if defined(INCL_VT100PLUS) case IDM_TEST_LOAD_VT100PLUS: emuLoad(sessQueryEmuHdl(hSession), EMU_VT100PLUS); break; #endif #if defined(INCL_VTUTF8) case IDM_TEST_LOAD_VTUTF8: emuLoad(sessQueryEmuHdl(hSession), EMU_VTUTF8); break; #endif case IDM_TEST_SESSNAME: { TCHAR ach[FNAME_LEN]; sessQueryName(hSession, ach, FNAME_LEN); TimedMessageBox(hwnd, ach, "Message", MB_OK, 0); } break; #endif default: break; } return 0; } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * FUNCTION: * SP_WM_CREATE * * DESCRIPTION: * Does the WM_CREATE stuff for the frameproc window. * * ARGUMENTS: * hwnd - frame window handle. * *pcs - pointer to CREATESTRUCT, structure passed from CreateWindowEx(). * * RETURNS: * void * */ STATIC_FUNC void SP_WM_CREATE(const HWND hwnd, const CREATESTRUCT *pcs) { HSESSION hSession; hSession = CreateSessionHandle(hwnd); // Need to set even if hSession is zero so the destroy handle routine // does not try to destroy a non-handle. SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)hSession); if (hSession == 0) { assert(FALSE); PostMessage(hwnd, WM_CLOSE, 0, 0); return; } if (InitializeSessionHandle(hSession, hwnd, pcs) == FALSE) { assert(FALSE); PostMessage(hwnd, WM_CLOSE, 0, 0); return; } if (glblQueryProgramStatus()) { /* Something has shut use down, don't continue */ return; } // mrw, 1/27/95 SetWindowContextHelpId(hwnd, IDH_TERM_WINDOW); return; } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * FUNCTION: * SP_WM_DESTROY * * DESCRIPTION: * WM_DESTROY message processor for session window. * * ARGUMENTS: * hwnd - session window handle. * * RETURNS: * void * */ STATIC_FUNC void SP_WM_DESTROY(const HWND hwnd) { const HSESSION hSession = (HSESSION)GetWindowLongPtr(hwnd, GWLP_USERDATA); if (GetFileSizeFromName(glblQueryHelpFileName(), NULL)) WinHelp(hwnd, glblQueryHelpFileName(), HELP_QUIT, 0L); // It appears that our subclassed statusbar window doesn't get the // WM_DESTROY message when its parent, the session window, is getting // destroyed, so we force it... // DestroyWindow(sessQueryHwndStatusbar(hSession)); if (hSession) DestroySessionHandle(hSession); PostQuitMessage(0); return; } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * FUNCTION: * SP_WM_SIZE * * DESCRIPTION: * WM_SIZE message processor for sessproc. * * ARGUMENTS: * hwnd - session window * fwSizeType - from WM_SIZE * iWidth - width of window * iHige - hite of window * * RETURNS: * void * */ STATIC_FUNC void SP_WM_SIZE(const HWND hwnd, const unsigned fwSizeType, const int iWidth, const int iHite) { const HSESSION hSession = (HSESSION)GetWindowLongPtr(hwnd, GWLP_USERDATA); HWND hwndDisplay; // DbgOutStr("WM_SIZE %d (%d x %d)\r\n", fwSizeType, iWidth, iHite, 0,0); /* * We need a bunch of fiddling around for the transfer display */ if (hSession) { hwndDisplay = xfrGetDisplayWindow(sessQueryXferHdl(hSession)); if (IsWindow(hwndDisplay)) { switch (fwSizeType) { case SIZE_MINIMIZED: case SIZE_MAXHIDE: // DbgOutStr("Iconic\r\n", 0,0,0,0,0); if (IsWindowVisible(hwndDisplay)) ShowWindow(hwndDisplay, SW_HIDE); break; case SIZE_MAXIMIZED: case SIZE_RESTORED: case SIZE_MAXSHOW: if (!IsWindowVisible(hwndDisplay)) ShowWindow(hwndDisplay, SW_SHOWDEFAULT); break; default: break; } } } SendDlgItemMessage(hwnd, IDC_STATUS_WIN, WM_SIZE, 0, 0); SendDlgItemMessage(hwnd, IDC_TOOLBAR_WIN, WM_SIZE, 0, 0); SendDlgItemMessage(hwnd, IDC_TERMINAL_WIN, WM_SIZE, 0, 0); SendDlgItemMessage(hwnd, IDC_SIDEBAR_WIN, WM_SIZE, 0, 0); return; } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * FUNCTION: * SP_WM_INITMENUPOPUP * * DESCRIPTION: * WM_INITMENUPOPUP message handler for session window. * * ARGUMENTS: * hwnd - session window handle * hMenu - menu handle of popup * uPos - position of menu item that invoked popup * fSysMenu- TRUE if system menu popup * * RETURNS: * void * */ STATIC_FUNC void SP_WM_INITMENUPOPUP(const HWND hwnd, const HMENU hMenu, const UINT uPos, const BOOL fSysMenu) { HMENU hWinMenu; int nOK, nIdx; TCHAR ach[50]; // Popup menus are referenced by position since id's can't be assigned // (grrrrr!). Actual menu init functions are in sessmenu.c #define MENU_FILE_POS 0 #define MENU_EDIT_POS 1 #define MENU_VIEW_POS 2 #define MENU_CALL_POS 3 #define MENU_TRANSFER_POS 4 #define MENU_HELP_POS 5 const HSESSION hSession = (HSESSION)GetWindowLongPtr(hwnd, GWLP_USERDATA); // Display help for top menu item. // I suppose we will have to be read from the resource file once we know // what the strings and their ids are. // LoadString(glblQueryDllHinst(), IDM_MENU_BASE+uPos, ach, sizeof(ach) / sizeof(TCHAR)); //wsprintf(ach, "Help for menu item %d\0", uPos); SendMessage(sessQueryHwndStatusbar(hSession), SBR_NTFY_NOPARTS, 0, (LPARAM)(LPTSTR)ach); if (fSysMenu) return; /* * This makes sure we only handle top level menu items here. * * The problem is that secondary popup menus also cause a WM_INITPOPUP * message to get sent. The only way to tell one of these messages from * another is to check the menu handle. As MRW alluded to above, this * would be less of a problem if they did this stuff with IDs instead of * offsets. */ hWinMenu = GetMenu(hwnd); nOK = FALSE; for (nIdx = 0; nIdx <= MENU_HELP_POS; nIdx += 1) { if (hMenu == GetSubMenu(hWinMenu, nIdx)) nOK = TRUE; } if (!nOK) return; /* --- Ok, its a top-level menu, let's have at it --- */ switch (uPos) { case MENU_FILE_POS: break; case MENU_EDIT_POS: sessInitMenuPopupEdit(hSession, hMenu); break; case MENU_VIEW_POS: sessInitMenuPopupView(hSession, hMenu); break; case MENU_CALL_POS: sessInitMenuPopupCall(hSession, hMenu); break; case MENU_TRANSFER_POS: sessInitMenuPopupTransfer(hSession, hMenu); break; case MENU_HELP_POS: sessInitMenuPopupHelp(hSession, hMenu); break; default: break; } return; } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * FUNCTION: * DecodeSessionNotification * * DESCRIPTION: * Receives a NotifyClient event and routes the notification. * * ARGUMENTS: * hwndSession - session window handle * nEvent - notification event * lExtra - additional data to pass * * RETURNS: * void * */ void DecodeSessionNotification(const HWND hwndSession, const NOTIFICATION nEvent, const LPARAM lExtra) { const HSESSION hSession = (HSESSION)GetWindowLongPtr(hwndSession, GWLP_USERDATA); switch (nEvent) /*lint -e787 -e788 */ { case EVENT_TERM_UPDATE: // This message must be sent, not posted so initialization // at program startup works - mrw SendMessage(sessQueryHwndTerminal(hSession), WM_TERM_GETUPDATE, 0, 0); break; case EVENT_TERM_TRACK: PostMessage(sessQueryHwndTerminal(hSession), WM_TERM_TRACK, 0, 0); break; case EVENT_EMU_CLRATTR: // This message must be sent, not posted so initialization // at program startup works - mrw SendMessage(sessQueryHwndTerminal(hSession), WM_TERM_CLRATTR, 0, 0); break; case EVENT_EMU_SETTINGS: // This message must be sent, not posted so initialization // at program startup works - mrw SendMessage(sessQueryHwndTerminal(hSession), WM_TERM_EMU_SETTINGS, 0, 0); break; case EVENT_CONNECTION_OPENED: //cnctMessage(sessQueryCnctHdl(hSession), IDS_CNCT_OPEN); emuNotify(sessQueryEmuHdl(hSession), EMU_EVENT_CONNECTED); cnctSetStartTime(sessQueryCnctHdl(hSession)); CLoopControl(sessQueryCLoopHdl(hSession), CLOOP_SET, CLOOP_CONNECTED); break; case EVENT_CONNECTION_INPROGRESS: emuNotify(sessQueryEmuHdl(hSession), EMU_EVENT_CONNECTING); break; case EVENT_CONNECTION_CLOSED: //cnctMessage(sessQueryCnctHdl(hSession), IDS_CNCT_CLOSE); emuNotify(sessQueryEmuHdl(hSession), EMU_EVENT_DISCONNECTED); CLoopControl(sessQueryCLoopHdl(hSession), CLOOP_CLEAR, CLOOP_CONNECTED); break; case EVENT_HOST_XFER_REQ: xfrDoAutostart(sessQueryXferHdl(hSession), (long)lExtra); break; case EVENT_CLOOP_SEND: PostMessage(sessQueryHwndTerminal(hSession), WM_TERM_TRACK, (WPARAM)1, 0); break; case EVENT_PORTONLY_OPEN: cnctConnect(sessQueryCnctHdl(hSession), CNCT_PORTONLY); break; case EVENT_LOST_CONNECTION: cnctDisconnect(sessQueryCnctHdl(hSession), (unsigned int)(lExtra) | CNCT_LOSTCARRIER); break; default: break; } /*lint +e787 +e788 */ return; } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * FUNCTION: * DecodeNotification * * DESCRIPTION: * Receives a NotifyClient event and routes the notification. * * ARGUMENTS: * hwndSession - session window handle * wPar - standard wPar to window proc * lPar - standard lPar to window proc, points to NMHDR structure for * details of notification. See WM_NOTIFY. * * RETURNS: * void * */ void DecodeNotification(const HWND hwndSession, WPARAM wPar, LPARAM lPar) { const HSESSION hSession = (HSESSION)GetWindowLongPtr(hwndSession, GWLP_USERDATA); NMHDR *pN = (NMHDR *)lPar; switch (pN->code) /*lint -e787 -e788 */ { case TTN_NEEDTEXT: ToolbarNeedsText(hSession, lPar); break; default: break; } /*lint +e787 +e788 */ return; } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * FUNCTION: * SP_WM_CONTEXTMENU * * DESCRIPTION: * WM_CONTEXTMENU message handler for session window. * * ARGUMENTS: * * RETURNS: */ STATIC_FUNC void SP_WM_CONTEXTMENU(const HWND hwnd) { RECT rc; POINT pt; HWND hwndToolbar, hwndStatus; const HSESSION hSession = (HSESSION)GetWindowLongPtr(hwnd, GWLP_USERDATA); GetCursorPos((LPPOINT)&pt); hwndToolbar = sessQueryHwndToolbar(hSession); if (IsWindowVisible(hwndToolbar)) { GetClientRect(hwndToolbar, (LPRECT)&rc); ScreenToClient(hwndToolbar, (LPPOINT)&pt); if (PtInRect((LPRECT)&rc, pt)) return; } GetCursorPos((LPPOINT)&pt); hwndStatus = sessQueryHwndStatusbar(hSession); if (IsWindowVisible(hwndStatus)) { GetClientRect(hwndStatus, (LPRECT)&rc); ScreenToClient(hwndStatus, (LPPOINT)&pt); if (PtInRect((LPRECT)&rc, pt)) return; } GetCursorPos((LPPOINT)&pt); GetClientRect(hwnd, (LPRECT)&rc); ScreenToClient(hwnd, (LPPOINT)&pt); if (PtInRect((LPRECT)&rc, pt)) HandleContextMenu(hwnd, pt); } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * FUNCTION: * SP_WM_CLOSE * * DESCRIPTION: * WM_CLOSE message processing. * * ARGUMENTS: * hwnd - session window. * * RETURNS: * TRUE if all OK, FALSE otherwise. * */ STATIC_FUNC BOOL SP_WM_CLOSE(const HWND hwnd) { HSESSION hSession = (HSESSION)GetWindowLongPtr(hwnd, GWLP_USERDATA); if (!sessDisconnectToContinue(hSession, hwnd)) return FALSE; if (!SaveSession(hSession, hwnd)) return FALSE; return TRUE; } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * FUNCTION: * CheckOpenFile * * DESCRIPTION: * Checks if given atom matches current system file name * * ARGUMENTS: * hSession - public session handle * aFile - atom of session file * * RETURNS: * TRUE if current system file matches the one in the atom * * AUTHOR: Mike Ward, 27-Jan-1995 */ static int CheckOpenFile(const HSESSION hSession, ATOM aFile) { TCHAR ach[FNAME_LEN]; TCHAR achSessFile[FNAME_LEN]; ach[0] = TEXT('\0'); if (GlobalGetAtomName(aFile, ach, FNAME_LEN)) { achSessFile[0] = TEXT('\0'); sfGetSessionFileName(sessQuerySysFileHdl(hSession), FNAME_LEN, achSessFile); return !StrCharCmpi(achSessFile, ach); } return FALSE; }