323 lines
6.2 KiB
C++
323 lines
6.2 KiB
C++
/***
|
|
*macmain.cpp
|
|
*
|
|
* Copyright (C) 1992-1994, Microsoft Corporation. All Rights Reserved.
|
|
*
|
|
*Purpose:
|
|
*
|
|
*Implementation Notes:
|
|
*
|
|
*****************************************************************************/
|
|
|
|
#include "dispdemo.h"
|
|
|
|
#include <stdio.h>
|
|
|
|
extern "C" {
|
|
|
|
Boolean g_fInitOle = false;
|
|
#ifndef _PPCMAC
|
|
Boolean g_fInitLibraryManager = false;
|
|
#endif //_PPCMAC
|
|
|
|
WindowPtr g_pwndClient = nil;
|
|
WindowPtr g_pwndDebug = nil;
|
|
|
|
}
|
|
|
|
void Init(void);
|
|
void EventLoop(void);
|
|
|
|
void AdjustMenus(void);
|
|
void Close(WindowPtr window);
|
|
void DoEvent(EventRecord *pevent);
|
|
void DoMenuCommand(long menuResult);
|
|
void Quit(void);
|
|
#ifndef _MSC_VER
|
|
#ifndef ConstStr255Param
|
|
#define ConstStr255Param StringPtr
|
|
#endif
|
|
#endif
|
|
void Fatal(ConstStr255Param);
|
|
|
|
Boolean
|
|
IsAppWindow(WindowPtr window)
|
|
{
|
|
return (window == nil)
|
|
? false : ((WindowPeek)window)->windowKind == userKind;
|
|
}
|
|
|
|
Boolean
|
|
IsDAWindow(WindowPtr window)
|
|
{
|
|
return (window == nil)
|
|
? false : (((WindowPeek)window)->windowKind < 0);
|
|
}
|
|
|
|
void
|
|
main()
|
|
{
|
|
Init();
|
|
EventLoop();
|
|
}
|
|
|
|
void
|
|
EventLoop()
|
|
{
|
|
EventRecord event;
|
|
RgnHandle cursorRgn;
|
|
|
|
cursorRgn = NewRgn();
|
|
while(1){
|
|
if(WaitNextEvent(everyEvent, &event, MAXLONG, cursorRgn))
|
|
DoEvent(&event);
|
|
}
|
|
}
|
|
|
|
void
|
|
DoEvent(EventRecord *pevent)
|
|
{
|
|
char key;
|
|
short part;
|
|
WindowPtr window;
|
|
|
|
switch(pevent->what){
|
|
case mouseDown:
|
|
part = FindWindow(pevent->where, &window);
|
|
switch(part){
|
|
case inMenuBar:
|
|
AdjustMenus();
|
|
DoMenuCommand(MenuSelect(pevent->where));
|
|
break;
|
|
|
|
case inSysWindow: /* let the system handle the mouseDown */
|
|
SystemClick(pevent, window);
|
|
break;
|
|
|
|
case inContent:
|
|
if(window != FrontWindow()){
|
|
SelectWindow(window);
|
|
}
|
|
break;
|
|
|
|
case inDrag:
|
|
DragWindow(window, pevent->where, &qd.screenBits.bounds);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case keyDown:
|
|
case autoKey: /* check for menukey equivalents */
|
|
key = (char)(pevent->message & charCodeMask);
|
|
if(pevent->modifiers & cmdKey){ /* Command key down */
|
|
if(pevent->what == keyDown){
|
|
/* enable/disable/check menu items properly */
|
|
AdjustMenus();
|
|
DoMenuCommand(MenuKey(key));
|
|
}
|
|
}
|
|
break;
|
|
|
|
case updateEvt:
|
|
window = (WindowPtr)pevent->message;
|
|
if(IsAppWindow(window)){
|
|
BeginUpdate(window);
|
|
if(!EmptyRgn(window->visRgn)){
|
|
SetPort(window);
|
|
EraseRect(&window->portRect);
|
|
}
|
|
EndUpdate(window);
|
|
}
|
|
break;
|
|
|
|
case kHighLevelEvent:
|
|
AEProcessAppleEvent(pevent);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void
|
|
Enable(MenuHandle hmenu, short sItem, Boolean fEnable)
|
|
{
|
|
if(fEnable)
|
|
EnableItem(hmenu, sItem);
|
|
else
|
|
DisableItem(hmenu, sItem);
|
|
}
|
|
|
|
void
|
|
AdjustMenus()
|
|
{
|
|
Boolean fIsDA;
|
|
MenuHandle hmenu;
|
|
|
|
fIsDA = IsDAWindow(FrontWindow());
|
|
|
|
/* we can allow desk accessories to be closed from the menu */
|
|
hmenu = GetMHandle(mFile);
|
|
Enable(hmenu, iClose, fIsDA);
|
|
|
|
hmenu = GetMHandle(mEdit);
|
|
Enable(hmenu, iUndo, fIsDA);
|
|
Enable(hmenu, iCut, fIsDA);
|
|
Enable(hmenu, iCopy, fIsDA);
|
|
Enable(hmenu, iClear, fIsDA);
|
|
Enable(hmenu, iPaste, fIsDA);
|
|
}
|
|
|
|
void
|
|
DoMenuCommand(long menuResult)
|
|
{
|
|
short menuID; /* the resource ID of the selected menu */
|
|
short menuItem; /* the item number of the selected menu */
|
|
Str255 daName;
|
|
|
|
menuID = HiWord(menuResult);
|
|
menuItem = LoWord(menuResult);
|
|
|
|
switch(menuID){
|
|
case mApple:
|
|
switch(menuItem){
|
|
case iAbout:
|
|
Alert(rAboutAlert, nil);
|
|
break;
|
|
default: /* all non-About items in this menu are DAs */
|
|
GetMenuItemText(GetMHandle(mApple), menuItem, daName);
|
|
OpenDeskAcc(daName);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case mFile:
|
|
switch(menuItem){
|
|
case iClose:
|
|
Close(FrontWindow());
|
|
break;
|
|
case iQuit:
|
|
Quit();
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case mEdit:
|
|
SystemEdit(menuItem-1);
|
|
break;
|
|
|
|
case mSpoly:
|
|
DoPoly(CLSID_CPoly);
|
|
break;
|
|
|
|
case mSpoly2:
|
|
DoPoly(CLSID_CPoly2);
|
|
break;
|
|
}
|
|
|
|
HiliteMenu(0);
|
|
}
|
|
|
|
void
|
|
Close(WindowPtr window)
|
|
{
|
|
if(IsDAWindow(window))
|
|
CloseDeskAcc(((WindowPeek)window)->windowKind);
|
|
else if(IsAppWindow(window))
|
|
CloseWindow(window);
|
|
}
|
|
|
|
#if defined(_MSC_VER)
|
|
OSErr pascal
|
|
#else
|
|
pascal OSErr
|
|
#endif
|
|
RemoteLowLevelEvt(AppleEvent theAppEvt, AppleEvent reply, long HandlerRefCon)
|
|
{
|
|
long cb;
|
|
OSErr err;
|
|
DescType descType;
|
|
EventRecord event;
|
|
|
|
UNUSED(reply);
|
|
UNUSED(HandlerRefCon);
|
|
|
|
err = AEGetKeyPtr(
|
|
&theAppEvt,
|
|
keyDirectObject,
|
|
typeWildCard,
|
|
&descType,
|
|
(Ptr)&event, sizeof(event), &cb);
|
|
|
|
if(err != noErr)
|
|
return err;
|
|
|
|
DoEvent(&event);
|
|
|
|
return noErr;
|
|
}
|
|
|
|
void
|
|
Init()
|
|
{
|
|
Handle menuBar;
|
|
|
|
MaxApplZone();
|
|
|
|
InitGraf((Ptr)&qd.thePort);
|
|
InitFonts();
|
|
InitWindows();
|
|
InitMenus();
|
|
TEInit();
|
|
InitDialogs(nil);
|
|
InitCursor();
|
|
FlushEvents(everyEvent, 0);
|
|
|
|
#ifndef _PPCMAC
|
|
if (InitOleManager(0) != NOERROR)
|
|
Fatal((ConstStr255Param)"\pCould not initialize OLE Applet");
|
|
|
|
g_fInitLibraryManager = true;
|
|
#endif //_PPCMAC
|
|
|
|
if(InitOle() != NOERROR)
|
|
Fatal((ConstStr255Param)"\pUnable to Initialize Ole");
|
|
g_fInitOle = true;
|
|
|
|
if(AEInstallEventHandler('OLE2', 'EVNT', (EventHandlerProcPtr)RemoteLowLevelEvt, 0, false) != noErr)
|
|
Fatal((ConstStr255Param)"\pUnable to install handler");
|
|
|
|
if((g_pwndClient = (WindowPtr)NewPtr(sizeof(WindowRecord))) == nil)
|
|
Fatal((ConstStr255Param)"\pOut of memory");
|
|
g_pwndClient = GetNewCWindow(rWindow, (Ptr)g_pwndClient, (WindowPtr)-1);
|
|
|
|
g_pwndDebug = g_pwndClient;
|
|
|
|
if((menuBar = GetNewMBar(rMenuBar)) == nil)
|
|
Fatal((ConstStr255Param)"\pUnable to load menu bar");
|
|
SetMenuBar(menuBar);
|
|
DisposHandle(menuBar);
|
|
AddResMenu(GetMHandle(mApple), 'DRVR'); /* add DA names to Apple menu */
|
|
DrawMenuBar();
|
|
}
|
|
|
|
void
|
|
Quit()
|
|
{
|
|
if(g_fInitOle)
|
|
UninitOle();
|
|
#ifndef _PPCMAC
|
|
if(g_fInitLibraryManager)
|
|
UninitOleManager(); // clean up applet
|
|
#endif //_PPCMAC
|
|
ExitToShell();
|
|
}
|
|
|
|
/* display fatal error alert, and exit */
|
|
void
|
|
Fatal(ConstStr255Param msg)
|
|
{
|
|
SetCursor(&qd.arrow);
|
|
ParamText(msg, (ConstStr255Param)"\p", (ConstStr255Param)"\p", (ConstStr255Param)"\p");
|
|
Alert(rUserAlert, nil);
|
|
Quit();
|
|
}
|
|
|