/************************************************************/ /* Windows Write, Copyright 1985-1992 Microsoft Corporation */ /************************************************************/ /* Quit.c -- MW quit commands (non-resident) */ #define NOGDICAPMASKS #define NOVIRTUALKEYCODES #define NOWINSTYLES #define NOSYSMETRICS #define NOMENUS #define NOICON #define NOKEYSTATE #define NOSYSCOMMANDS #define NORASTEROPS #define NOSHOWWINDOW //#define NOATOM #define NOBITMAP #define NOBRUSH #define NOCLIPBOARD #define NOCOLOR #define NOCREATESTRUCT #define NOCTLMGR #define NODRAWTEXT #define NOFONT #define NOHDC #define NOMB #define NOMEMMGR #define NOMENUS #define NOMETAFILE #define NOMINMAX //#define NOMSG #define NOOPENFILE #define NOPEN #define NOPOINT #define NORECT #define NOREGION #define NOSCROLL #define NOSOUND #define NOWH #define NOWINOFFSETS #define NOWNDCLASS #define NOCOMM #include #include "mw.h" #include "str.h" #include "cmddefs.h" #define NOKCCODES #include "ch.h" #include "docdefs.h" #include "editdefs.h" #include "filedefs.h" #include "wwdefs.h" #include "propdefs.h" #include "dlgdefs.h" #include "commdlg.h" #if defined(OLE) #include "obj.h" #endif #include "debug.h" extern PRINTDLG PD; /* Common print dlg structure, initialized in the init code */ extern struct FCB (**hpfnfcb)[]; extern int fnMac; extern struct WWD rgwwd[]; extern int wwMac; extern struct DOD (**hpdocdod)[]; extern int docCur; /* Document in current ww */ extern int vfExtScrap; extern int rgval[]; extern int docMac; extern int vfBuffersDirty; extern int vdxaPaper; extern int vdyaPaper; extern int ferror; extern int docScrap; extern struct PAP vpapAbs; extern int vccpFetch; extern CHAR *vpchFetch; extern int vfScrapIsPic; extern typeCP vcpLimParaCache; FMmwClose( hwnd ) HWND hwnd; { /* Handle WM_CLOSE message sent to parent window. Return FALSE if the CLOSE should be aborted, TRUE if it is OK to go ahead and CLOSE (DestroyWindow is called in this case). */ extern int vfDead; extern VOID (FAR PASCAL *lpfnRegisterPenApp)(WORD, BOOL); extern WORD fPrintOnly; if (fPrintOnly || FConfirmSave()) { extern int vfOwnClipboard; FreeMemoryDC( FALSE ); /* To give FRenderAll max memory */ /* Render Data BEFORE the world collapses around our ears */ if (vfOwnClipboard) { /* We are the clipboard owner -- render the clipboard contents in all datatypes that we know about */ if (!FRenderAll()) /* Render failed; abort close */ return FALSE; } #if defined(OLE) if (ObjClosingDoc(docCur,NULL)) // do this *after* call to RenderAll! return FALSE; #endif /* pen windows */ if (lpfnRegisterPenApp) // global (*lpfnRegisterPenApp)((WORD)1, fFalse); // deregister if (PD.hDevMode) { /* We'd opened a Win3 printer driver before, now discard */ GlobalFree(PD.hDevMode); PD.hDevMode = NULL; } vfDead = TRUE; /* So we don't repaint or idle anymore */ DestroyWindow( hwnd ); KillTempFiles( FALSE ); return TRUE; /* OK to close window */ } return FALSE; /* ABort the close */ } MmwDestroy() { /* Parent window is being destroyed */ extern HWND hParentWw; extern HWND vhWndPageInfo; extern HDC vhDCRuler; extern HBRUSH hbrBkgrnd; extern HFONT vhfPageInfo; extern HBITMAP hbmBtn; extern HBITMAP hbmMark; #ifdef JAPAN //01/21/93 extern HANDLE hszNoMemorySel; #endif extern HANDLE hszNoMemory; extern HANDLE hszDirtyDoc; extern HANDLE hszCantPrint; extern HANDLE hszPRFAIL; HBRUSH hbr = GetStockObject( WHITE_BRUSH ); HDC hDC = GetDC( vhWndPageInfo ); #ifdef WIN30 { /* We use the help engine so advise it we're going far far away */ CHAR sz[cchMaxFile]; PchFillPchId(sz, IDSTRHELPF, sizeof(sz)); WinHelp(hParentWw, (LPSTR)sz, HELP_QUIT, NULL); } #endif FreeMemoryDC( TRUE ); SelectObject( GetDC( hParentWw ), hbr ); SelectObject( wwdCurrentDoc.hDC, hbr ); if (vhDCRuler != NULL) { SelectObject( vhDCRuler, hbr ); } DeleteObject( hbrBkgrnd ); DeleteObject( SelectObject( hDC, hbr ) ); if (vhfPageInfo != NULL) { DeleteObject( SelectObject( hDC, GetStockObject( SYSTEM_FONT ) ) ); } if (hbmBtn != NULL) { DeleteObject( hbmBtn ); } if (hbmMark != NULL) { DeleteObject( hbmMark ); } #ifdef JAPAN //01/21/93 if (hszNoMemorySel != NULL) { GlobalFree( hszNoMemorySel ); } #endif if (hszNoMemory != NULL) { GlobalFree( hszNoMemory ); } if (hszDirtyDoc != NULL) { GlobalFree( hszDirtyDoc ); } if (hszCantPrint != NULL) { GlobalFree( hszCantPrint ); } if (hszPRFAIL != NULL) { GlobalFree( hszPRFAIL ); } #if defined(JAPAN) & defined(DBCS_IME) /* Release Ime communication memory */ { extern HANDLE hImeMem; extern HANDLE hImeSetFont; if (hImeMem) GlobalFree(hImeMem); if(hImeSetFont != NULL) { HDC hdc; HANDLE oldhfont; hdc = GetDC(NULL); oldhfont = SelectObject(hdc,hImeSetFont); SelectObject(hdc,oldhfont); DeleteObject(hImeSetFont); ReleaseDC(NULL, hdc); } } #endif #if defined(JAPAN) & defined(IME_HIDDEN) //IME3.1J //IR_UNDETERMINE /* Release Ime Undetermin string & attrib memory */ { extern HANDLE hImeUnAttrib; extern HANDLE hImeUnString; extern CHAR szWriteProduct[]; extern CHAR szImeHidden[]; extern int vfImeHidden; /*T-HIROYN ImeHidden Mode flag*/ if (hImeUnAttrib) GlobalFree(hImeUnAttrib); if (hImeUnString) GlobalFree(hImeUnString); WriteProfileString((LPSTR)szWriteProduct, (LPSTR)szImeHidden, vfImeHidden ? (LPSTR)"1" : (LPSTR)"0" ); } #endif #ifdef FONT_KLUDGE RemoveFontResource( (LPSTR)"helv.fon" ); #endif /* FONT_KLUDGE */ #if defined(OLE) ObjShutDown(); #endif PostQuitMessage( 0 ); } KillTempFiles( fEndSession ) int fEndSession; { /* Kill off all of the temp files. MEMO cannot run after this is done */ int f; int fn, fnT; CloseEveryRfn( TRUE ); /* Delete all temp files */ /* loop thru the FCB table looking for files that should be deleted before we quit. */ for (fn = 0; fn < fnMac; fn++) { int fpe; struct FCB *pfcb = &(**hpfnfcb)[fn]; if (pfcb->rfn != rfnFree && pfcb->fDelete) /* Having found a file that must be deleted, delete it */ { /* This should be FDeleteFile all of the time, but we don't want to add a window enumeration during End Session at this very late stage of the project */ if (fEndSession) FpeDeleteSzFfname( **pfcb->hszFile ); else FDeleteFile( **pfcb->hszFile ); (**hpfnfcb) [fn].rfn = rfnFree; } } } #ifdef ENABLE /* Part of "Save All", not needed */ int CnfrmSz(sz) CHAR *sz; { extern AlertBoxSz2(); int cch; cch = CchFillSzId(&stBuf[1], IDPMTSaveChanges); stBuf[++cch] = chSpace; cch += CchCopySz(sz, &stBuf[cch+1]); stBuf[++cch] = chQMark; stBuf[0] = cch; return(AlertBoxSz2(stBuf)); } #endif /* ENABLE */ #ifdef ENABLE /* Not needed, only 1 document in MEMO */ int FAllDocsClean() { int fAllClean = true; int dty; int doc; if (vfBuffersDirty) return false; for (doc = 0; doc < docMac; ++doc) { dty = (**hpdocdod)[doc].dty; if ((dty != dtyNormal && dty != dtySsht) || (**hpdocdod)[doc].hpctb == 0 || !(**hpdocdod)[doc].fDirty) continue; fAllClean = false; } return fAllClean; } #endif #ifdef ENABLE /* We don't support saving between-session state info */ WriteStateInfo() { /* Write out state information into Word resource file */ struct STATEINFO stiTemp; HANDLE hRes, hData; UseResFile(vresSystem); SetWords(&stiTemp,0,cwSTATEINFO); stiTemp.sf.fScrnDraftStor = vfScrnDraft; stiTemp.sf.fPrintModeStor = vfPrintMode; stiTemp.sf.fDriverDefaultOK = vfDriverDefaultOK; stiTemp.utCurStor = utCur; stiTemp.vcDaisyPitchStor = vcDaisyPitch; stiTemp.vBaudRateStor =vBaudRate; stiTemp.vPortNumStor = vPortNum; if (hszPrdFile != 0) {/* User has a Word printer driver selected currently */ int cch = CchCopySz(**hszPrdFile,stiTemp.rgchPrd); stiTemp.vdxaPaperStor = vdxaPaper; stiTemp.vdyaPaperStor = vdyaPaper; stiTemp.sf.fPrintStateOK = true; } else stiTemp.sf.fPrintStateOK = false; hRes = GetResource(WINF, 1); if (hRes != 0L) RmveResource(hRes); hData = NewHandle(0); if (HandleAppendQ(hData,&stiTemp,sizeof(stiTemp))) AddResource(hData, WINF, 1, ""); } #endif /* ENABLE */ fnQuit(hWnd) /* user has selected Quit menu item... */ HWND hWnd; { SendMessage(hWnd, WM_CLOSE, 0, 0L); }