1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-18 17:10:05 +02:00
2015-04-07 22:10:17 -05:00

522 lines
17 KiB
C

/* macint.c - macintosh interface routines for xlisp 2.1e */
/* Written by Brian Kendig. */
/* The functions here are only called by macstuff.c. */
#include <Events.h>
#include <Gestalt.h>
#include <Memory.h>
#include <Menus.h>
#include <Events.h>
#include <Quickdraw.h>
#include <StandardFile.h>
#include <TextEdit.h>
#include <ToolUtils.h>
#include <Traps.h>
#include <Windows.h>
#include <Controls.h>
/* #include <ControlDefinitions.h> */
#include <SIOUX.h>
#include <AppleEvents.h>
#include "macint.h"
/* #define FALSE 0
#define TRUE 1 */
#define NIL ((void *) 0)
#include "MacCommandWin.h"
#include "macaboutbox.h"
#include "MacDrag.h"
#include "MacHandleEv.h"
#include "macstuff.h"
#include "stdio.h"
#define TEXTREC (*hTERec) /* the command window text record */
#define TEXTCHAR(i) ((*(TEXTREC->hText))[i])
// Struct for apple event handling
typedef struct AEventList {
AEEventClass evclass;
AEEventID evid;
void *handler;
long refcon;
} AEventList, *AEventListPtr;
//===========================================================================
// GLOBALS DEFINED HERE USE MacGlobals.h FOR ACCESS
//===========================================================================
// Menu handles
MenuHandle appleMenu, fileMenu, editMenu, controlMenu;
/* command and graphics windows */
WindowPtr gCommandWin, gGraphicsWin;
WindowRecord commandWinRec, bwGraphicsWinRec;
CWindowRecord colorGraphicsWinRec;
Boolean gGraphicsShown, gCommandWinResized = false;
// Screen size stuff
Rect dragRect, sizeRect;
int screenWidth, screenHeight; /* screen dimensions */
int sHorizontal, sVertical, sWidth, sHeight; /* command win, split screen */
int gHorizontal, gVertical, gWidth, gHeight; /* graphics win, split screen */
// The Text handle
TEHandle hTERec;
/* output is buffered */
//Handle hOutputBuffer = NULL;
int outputBufferLength = 0;
// Allocate space for UPPs
ControlActionUPP uppScrollProc;
TEClickLoopUPP uppScrollClickLoop;
//AEEventHandlerUPP uppAEOpenFiles, uppAEQuit;
// Text related globals
CharsHandle pastedTextH = NULL; /* a handle to pasted text */
int pastedLength = 0; /* how many chars there are in the paste buffer */
int flashTime = 0, cursorBeforeFlash; /* for flashing cursor when parens match */
char recentChar; /* the last character typed */
RgnHandle gMouseRgn; // holds current mouse regin
/* miscellaneous stuff */
Boolean gInBackground; /* are we in background or not */
int wneImplemented;
unsigned long startupTicks;
Boolean hasColorQD;
short howManyFiles = 0, whichFile = 0; /* keep track of files opened from Finder */
// Prototypes
static pascal OSErr AEQuit (AppleEvent *theAppleEvent, AppleEvent *theReply, long Refcon);
static pascal OSErr AEOpenFiles (AppleEvent *theAppleEvent, AppleEvent *theReply, long Refcon);
pascal Boolean ScrollClickLoop (void);
pascal void ScrollProc (ControlHandle control, short thePart);
Rect SetTERect (void);
void FlushOutput (void);
void ShowGrafWin (void) {
/* make the graphics window visible */
ShowWindow (gGraphicsWin);
SelectWindow (gGraphicsWin);
SetMenuItemText (controlMenu, SHOW_GRAPHICS, "\pHide Graphics");
//AdjustCursor ();
gGraphicsShown = true;
}
void HideGrafWin (void) {
/* hide the graphics window */
HideWindow (gGraphicsWin);
SetMenuItemText (controlMenu, SHOW_GRAPHICS, "\pShow Graphics");
gGraphicsShown = false;
}
static void UpdateGraphWindow ()
{
BeginUpdate (gGraphicsWin);
EndUpdate (gGraphicsWin);
}
void InitMac (void) {
// { /* set up memory properly */
// int i;
// fix this later. -EAD
//if (DefltStack < STACKMIN) SetApplLimit (CurStackBase - STACKMIN);
// MaxApplZone ();
// for (i = 0; i < MASTERS; i++) MoreMasters ();
// }
AEventListPtr theAppleEvent;
AEventList theEventList[] = {
{ kCoreEventClass, kAEOpenDocuments, AEOpenFiles, 0 },
{ kCoreEventClass, kAEQuitApplication, AEQuit, 0 },
{ 0, 0, nil, 0 }
};
int i;
/* do all the necessary initialization mumbo-jumbo */
if (StackSpace() < STACKMIN)
SetApplLimit(GetApplLimit() - STACKMIN);
MaxApplZone();
/* printf("New StackSpace %lx GetApplLimit %lx\n",
StackSpace(), GetApplLimit()); */
for (i = 0; i < MASTERS; i++) MoreMasters ();
/* getchar(); */
/* initialize the toolbox */
InitGraf (&qd.thePort);
InitFonts ();
FlushEvents (everyEvent, 0);
InitWindows ();
InitMenus ();
TEInit ();
InitDialogs (NIL);
InitCursor ();
// Setup Callbacks
uppScrollClickLoop = NewTEClickLoopProc(ScrollClickLoop);
uppScrollProc = NewControlActionProc(ScrollProc);
// Handlers for core apple events
for (theAppleEvent = theEventList; theAppleEvent->handler; theAppleEvent++)
if (AEInstallEventHandler(theAppleEvent->evclass, theAppleEvent->evid, NewAEEventHandlerProc((ProcPtr)theAppleEvent->handler),
theAppleEvent->refcon, 0) != noErr);
// Set up the SIOUX window
SIOUXSettings.initializeTB = FALSE; //Toolbox is alread inited
SIOUXSettings.setupmenus = FALSE; //keep the csound menus
SIOUXSettings.autocloseonquit = TRUE; //close sioux without asking for save
SIOUXSettings.showstatusline = FALSE; //no status line
SIOUXSettings.asktosaveonclose = FALSE; //don't ask to save
SIOUXSettings.toppixel = 40;
SIOUXSettings.leftpixel = 5;
/* see if we have WaitNextEvent and Color Quickdraw */
wneImplemented = (NGetTrapAddress (_WaitNextEvent, ToolTrap) != NGetTrapAddress (_Unimplemented, ToolTrap));
if (NGetTrapAddress ((short) Gestalt, ToolTrap) != NGetTrapAddress (_Unimplemented, ToolTrap)) {
long returnCode;
OSErr err = Gestalt (gestaltQuickdrawVersion, &returnCode);
hasColorQD = ((err == noErr) && (returnCode >= gestalt8BitQD));
} else hasColorQD = false;
{ /* set up menus */
Handle theMenuBar = GetNewMBar (MBAR_RES);
SetMenuBar (theMenuBar);
appleMenu = (MenuHandle)GetMenuHandle (APPLE_MENU_RES);
fileMenu = (MenuHandle)GetMenuHandle (FILE_MENU_RES);
editMenu = (MenuHandle)GetMenuHandle (EDIT_MENU_RES);
controlMenu = (MenuHandle)GetMenuHandle (CONTROL_MENU_RES);
AppendResMenu (appleMenu, 'DRVR');
DrawMenuBar ();
}
/* get the size of the main screen */
screenWidth = qd.screenBits.bounds.right - qd.screenBits.bounds.left;
screenHeight = qd.screenBits.bounds.bottom - qd.screenBits.bounds.top;
/* compute the size of the graphics window in split-screen mode */
gHorizontal = SCREEN_MARGIN;
gVertical = MBAR_HEIGHT + TITLEBAR_HEIGHT - 1;
gWidth = screenWidth - (SCREEN_MARGIN * 2);
gHeight = GRAFWIN_HEIGHT;
/* compute the size of the command window in split-screen mode */
sHorizontal = SCREEN_MARGIN;
sVertical = MBAR_HEIGHT + TITLEBAR_HEIGHT - 1 + SCREEN_MARGIN + GRAFWIN_HEIGHT;
sWidth = screenWidth - (SCREEN_MARGIN * 2);
sHeight = screenHeight - MBAR_HEIGHT - TITLEBAR_HEIGHT - (SCREEN_MARGIN * 2) - GRAFWIN_HEIGHT - 1;
/* set up size and drag rects */
dragRect = (*GetGrayRgn ())->rgnBBox;
// dragRect.left += DRAG_THRESHOLD;
// dragRect.right -= DRAG_THRESHOLD;
// dragRect.bottom -= DRAG_THRESHOLD;
sizeRect.top = MIN_WIN_HEIGHT;
sizeRect.left = MIN_WIN_WIDTH;
sizeRect.bottom = qd.screenBits.bounds.bottom - qd.screenBits.bounds.top;
sizeRect.right = qd.screenBits.bounds.right - qd.screenBits.bounds.left;
/* create the command window */
gCommandWin = GetNewWindow (CWINRES, &commandWinRec, (WindowPtr) -1L);
SetPort (gCommandWin);
/* create the graphics window */
if (hasColorQD) gGraphicsWin = GetNewCWindow (GWINRES, &colorGraphicsWinRec, (WindowPtr) -1L);
else gGraphicsWin = GetNewWindow (GWINRES, &bwGraphicsWinRec, (WindowPtr) -1L);
startupTicks = TickCount (); /* take note of what time we're starting up */
// Create mouse regin
gMouseRgn = NewRgn();
// Initalize some command window stuff
InitalizeCmdWindow();
// Turn on text outlineing
TEFeatureFlag(teFOutlineHilite, teBitSet, hTERec);
HideGrafWin ();
{ /* see if the user launched the app by opening text files from the Finder */
short doWhat;\
// call to CountAppFiles was commented out, but that left doWhat uninitialized
// RBD added this ifdef, I wonder where CountAppFiles came from?
#ifdef CountAppFilesDefined
CountAppFiles (&doWhat, &howManyFiles);
if (doWhat != appOpen) howManyFiles = 0;
#else
howManyFiles = 0;
#endif
}
UpdateCmdWindow ();
}
static void DoAppleMenu (int theItem) {
switch (theItem) {
case ABOUT_ITEM:
DoAboutBox ();
break;
default: {
Str255 name;
GetMenuItemText (appleMenu, theItem, name);
OpenDeskAcc (name);
break;
}
}
}
/* this should really be in a header for MacFileUtils.c */
void GetFullPath(FSSpec *theSpec, StringPtr theName);
static void DoFileMenu (int theItem) {
extern xlload (char *, int, int);
extern xlabort(char *);
extern xlisp_wrapup (void);
StandardFileReply theFile;
SFTypeList fileTypes;
Point pt = { 100, 100 };
fileTypes[0] = 'TEXT';
switch (theItem) {
case LOAD:
case LOAD_NOISILY:
StopPasting ();
StandardGetFile(NIL, 1, fileTypes, &theFile);
if (theFile.sfGood) {
Str255 theFullPath;
short wdRefNum;
OSErr err;
HiliteMenu (0);
err = OpenWD(theFile.sfFile.vRefNum, theFile.sfFile.parID, 'Nyqu', &wdRefNum);
err = SetVol(NIL, wdRefNum);
SetSelection (TEXTREC->teLength, TEXTREC->teLength); /* send cursor to end */
GetFullPath(&theFile.sfFile, theFullPath);
P2CStr(theFullPath);
if ((xlload((char *) theFullPath, 1, (theItem == LOAD_NOISILY))) == 0) {
xlabort("load error");
}
macputs ("> ");
PrepareForInput ();
}
break;
case QUIT:
xlisp_wrapup ();
}
}
static void DoEditMenu (int theItem) {
if (SystemEdit (theItem-1) == false)
switch (theItem) {
case CUT: case COPY:
if (ZeroScrap () == noErr) {
TECopy (hTERec); /* after copying, export the TE scrap */
if (TEToScrap () != noErr) ZeroScrap ();
}
if (theItem == CUT) DeleteRange ();
break;
case PASTE: {
long scrapOffset;
if (pastedTextH) DisposeHandle (pastedTextH);
pastedTextH = (CharsHandle) NewHandle (0);
pastedLength = GetScrap (pastedTextH, 'TEXT', &scrapOffset);
if (pastedLength < 0) pastedLength = 0; /* error */
else {
SetHandleSize (pastedTextH, pastedLength + 1);
HLock (pastedTextH);
((char *)(*pastedTextH))[pastedLength] = '\0';
HUnlock (pastedTextH);
}
} /* and fall through ... */
case CLEAR:
DeleteRange ();
break;
}
}
static void DoControlMenu (int theItem) {
extern xlbreak (char *, char *);
extern char *s_unbound;
extern xlcontinue (void);
extern xlcleanup (void);
extern xlabort (char *);
extern xltoplevel (void);
scrflush ();
HiliteMenu (0);
switch (theItem) {
case BREAK: StopPasting (); xlbreak ("user break", s_unbound); PrepareForInput (); break;
case CONTINUE: StopPasting (); xlcontinue (); PrepareForInput (); break;
case CLEAN_UP: StopPasting (); xlcleanup (); PrepareForInput (); break;
case CANCEL_INPUT: StopPasting (); xlabort ("input canceled"); PrepareForInput (); break;
case TOP_LEVEL: StopPasting (); xltoplevel (); PrepareForInput (); break;
case SHOW_GRAPHICS:
if (gGraphicsShown) HideGrafWin ();
else ShowGrafWin ();
break;
case SPLIT_SCREEN:
MoveWindow (gCommandWin, sHorizontal, sVertical, -1);
SizeWindow (gCommandWin, sWidth, sHeight, -1);
InvalRect (&gCommandWin->portRect);
SetTERect ();
SetScrollRect ();
ShowGrafWin ();
MoveWindow (gGraphicsWin, gHorizontal, gVertical, -1);
SizeWindow (gGraphicsWin, gWidth, gHeight, -1);
break;
}
}
void DoMenu (long choice) {
int theMenu = HiWord (choice), theItem = LoWord (choice);
HiliteMenu (theMenu);
switch (theMenu) {
case APPLE_MENU_RES: DoAppleMenu (theItem); break;
case FILE_MENU_RES: DoFileMenu (theItem); break;
case EDIT_MENU_RES: DoEditMenu (theItem); break;
case CONTROL_MENU_RES: DoControlMenu (theItem); break;
}
HiliteMenu (0);
}
void AdjustMenus (void) {
/* turn the stuff in the Edit menu on and off as necessary */
long temp;
DisableItem (editMenu, UNDO);
if (TEXTREC->selStart != TEXTREC->selEnd) {
EnableItem (editMenu, CUT);
EnableItem (editMenu, COPY);
EnableItem (editMenu, CLEAR);
} else {
DisableItem (editMenu, CUT);
DisableItem (editMenu, COPY);
DisableItem (editMenu, CLEAR);
}
if (GetScrap (NIL, 'TEXT', &temp) > 0) EnableItem (editMenu, PASTE);
else DisableItem (editMenu, PASTE);
}
RgnHandle rgn = nil;
void DoContent (EventRecord *theEvent) {
/* handle a click in a window's content region */
ControlHandle theScrollBar;
GrafPtr oldPort;
int scrollValue;
Point mouse = theEvent->where;
int thePart;
// RgnHandle rgn = nil;
GetPort (&oldPort);
SetPort (gCommandWin);
GlobalToLocal (&mouse);
// Get Selected text
rgn = NewRgn();
TEGetHiliteRgn(rgn, hTERec);
if (thePart = FindControl (mouse, gCommandWin, &theScrollBar)) {
switch (thePart) {
case kControlUpButtonPart:
case kControlDownButtonPart:
case kControlPageUpPart:
case kControlPageDownPart:
scrollValue = TrackControl (theScrollBar, mouse, uppScrollProc);
break;
case kControlIndicatorPart:
scrollValue = GetControlValue (theScrollBar);
thePart = TrackControl (theScrollBar, mouse, NIL);
if (thePart) {
scrollValue -= GetControlValue (theScrollBar);
if (scrollValue) TEScroll (0, scrollValue * LINEHEIGHT, hTERec);
}
break;
}
} else if (PtInRgn(mouse, rgn)) {
if (!DragText(theEvent)) {
TEClick(mouse, false, hTERec);
}
} else if (PtInRect (mouse, &(TEXTREC->viewRect))) {
TEClick (mouse, (theEvent->modifiers & shiftKey) != 0, hTERec);
}
SetPort (oldPort);
DisposeRgn(rgn);
}
void DoEvent (void) {
EventRecord theEvent;
if ((flashTime) && (--flashTime == 0)) SetSelection (cursorBeforeFlash, cursorBeforeFlash);
if (outputBufferLength) FlushOutput ();
if (FrontWindow () == gCommandWin) TEIdle (hTERec);
recentChar = '\0';
if (WaitNextEvent (everyEvent, &theEvent, 0, gMouseRgn)) {
AdjustCursor (theEvent.where, gMouseRgn);
switch (theEvent.what) {
case kHighLevelEvent:
AEProcessAppleEvent(&theEvent);
break;
case mouseDown:
DoMouseDown (&theEvent);
break;
case keyDown:
case autoKey:
DoKeyPress (&theEvent);
break;
case activateEvt: {
WindowPtr whichWindow = (WindowPtr)theEvent.message;
SetPort (whichWindow);
if (whichWindow == gCommandWin) {
if ((theEvent.modifiers & activeFlag) == 1) {
ActivateCmdWindow();
} else {
DeactivateCmdWindow();
}
}
break;
}
case updateEvt: {
if ((WindowPtr)theEvent.message == gCommandWin) UpdateCmdWindow ();
if ((WindowPtr)theEvent.message == gGraphicsWin) UpdateGraphWindow ();
break;
}
case osEvt:
if (((theEvent.message >> 24) & 0xff) == suspendResumeMessage) {
if (theEvent.message & resumeFlag) {
gInBackground = false;
if (FrontWindow () == gCommandWin) {
ActivateCmdWindow();
}
} else {
gInBackground = true;
if (FrontWindow () == gCommandWin) {
SetPort (gCommandWin);
DeactivateCmdWindow();
}
}
}
break;
}
}
AdjustCursor (theEvent.where, gMouseRgn);
}
void MacWrapUp (void) {
/* take everything down in preparation for quitting */
CleanupCmdWindow();
CloseWindow (gGraphicsWin);
}