mirror of
https://github.com/cookiengineer/audacity
synced 2025-11-27 15:50:10 +01:00
Update Nyquist to v3.09.
This commit is contained in:
58
lib-src/libnyquist/nyquist/sys/mac/MacAE.c
Normal file
58
lib-src/libnyquist/nyquist/sys/mac/MacAE.c
Normal file
@@ -0,0 +1,58 @@
|
||||
/* Handle required apple events -EAD */
|
||||
|
||||
#include <Files.h>
|
||||
#include <string.h>
|
||||
#include <AppleEvents.h>
|
||||
#include "macstuff.h"
|
||||
#include "MacCommandWin.h"
|
||||
#include "MacFileUtils.h"
|
||||
//#include "MiscellaneousUtilities.h"
|
||||
|
||||
#define TEXTREC (*hTERec) // the command
|
||||
extern TEHandle hTERec; // window text record
|
||||
|
||||
|
||||
//=========================================================================
|
||||
// Handle quit apple event
|
||||
//=========================================================================
|
||||
|
||||
pascal OSErr AEQuit (AppleEvent *theAppleEvent, AppleEvent *theReply, long Refcon)
|
||||
{
|
||||
osfinish();
|
||||
}
|
||||
|
||||
//=========================================================================
|
||||
// Handle Open Document apple event by trying to load it.
|
||||
//=========================================================================
|
||||
extern xlload (char *, int, int);
|
||||
extern xlabort(char *);
|
||||
|
||||
pascal OSErr AEOpenFiles(AppleEvent *theAppleEvent, AppleEvent *theReply,
|
||||
long Refcon)
|
||||
{
|
||||
AEDescList docList;
|
||||
AEKeyword keywd;
|
||||
DescType returnedType;
|
||||
Size actualSize;
|
||||
long itemsInList;
|
||||
FSSpec theSpec;
|
||||
CInfoPBRec pb;
|
||||
Str255 name;
|
||||
short i;
|
||||
|
||||
if (AEGetParamDesc(theAppleEvent, keyDirectObject, typeAEList, &docList) !=
|
||||
noErr) return;
|
||||
if (AECountItems (&docList, &itemsInList) != noErr) return;
|
||||
|
||||
SetSelection (TEXTREC->teLength, TEXTREC->teLength);
|
||||
for (i = 1; i <= itemsInList; i++) {
|
||||
AEGetNthPtr (&docList, i, typeFSS, &keywd, &returnedType,
|
||||
(Ptr) &theSpec, sizeof(theSpec), &actualSize);
|
||||
|
||||
GetFullPath(&theSpec, name);
|
||||
P2CStr(name); // was: pstrterm(name);
|
||||
if (xlload ((char *)name + 1, 1, 0) == 0) xlabort ("load error");
|
||||
}
|
||||
macputs ("> ");
|
||||
PrepareForInput ();
|
||||
}
|
||||
764
lib-src/libnyquist/nyquist/sys/mac/MacCommandWin.c
Normal file
764
lib-src/libnyquist/nyquist/sys/mac/MacCommandWin.c
Normal file
@@ -0,0 +1,764 @@
|
||||
//=============================================================================
|
||||
// All command window updates, input, etc happen here -EAD
|
||||
//=============================================================================
|
||||
#include <Controls.h>
|
||||
/* #include <ControlDefinitions.h> */
|
||||
#include <Events.h>
|
||||
#include <Fonts.h>
|
||||
#include <MacWindows.h>
|
||||
#include "MacGlobals.h"
|
||||
#include "macint.h"
|
||||
#include <ctype.h>
|
||||
#define NIL ((void *) 0)
|
||||
|
||||
//=============================================================================
|
||||
// local variables
|
||||
//=============================================================================
|
||||
|
||||
ControlHandle vScroll;
|
||||
int cursorPos; /* the cursor's position on the line */
|
||||
short linesInView; /* how many lines are in the window */
|
||||
int cmdStart; /* where (in text record) the current command starts */
|
||||
TextStyle textStyle[2]; /* styles: bold for user input, plain for output */
|
||||
/* output is buffered */
|
||||
Handle hOutputBuffer = NULL;
|
||||
enum currentStyle { plainStyle, boldStyle } currentStyle;
|
||||
|
||||
static void GoStartOfLine (void);
|
||||
static void GoEndOfLine (void);
|
||||
static void GoBackOneWord (void);
|
||||
static void GoForwardOneWord (void);
|
||||
|
||||
//=============================================================================
|
||||
// static void DoScrollBar (ControlHandle control, short change)
|
||||
//=============================================================================
|
||||
/* keep track of the user as he fiddles with the scroll bar */
|
||||
/* This routine is called while the user has the mouse down. */
|
||||
/* It makes sure the thumb isn't dragged out-of-bounds. */
|
||||
//=============================================================================
|
||||
|
||||
static void DoScrollBar (ControlHandle control, short change) {
|
||||
short value = GetControlValue (control), max = GetControlMaximum (control);
|
||||
long newval = value + change; /* this is a long in case we try to go past MAX_INT */
|
||||
if (newval < 0) newval = 0; else if (newval > max) newval = max;
|
||||
SetControlValue (control, (short) newval);
|
||||
if (newval != value) TEScroll (0, (short) (value - newval) * LINEHEIGHT, hTERec);
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
// pascal Boolean ScrollClickLoop (void)
|
||||
//=============================================================================
|
||||
//
|
||||
//=============================================================================
|
||||
|
||||
pascal Boolean ScrollClickLoop (void) {
|
||||
Rect tempRect;
|
||||
Point mouse;
|
||||
GrafPtr oldPort;
|
||||
RgnHandle oldClip;
|
||||
short amount = 0;
|
||||
|
||||
if (FrontWindow () != gCommandWin) return false;
|
||||
|
||||
GetPort (&oldPort);
|
||||
SetPort (gCommandWin);
|
||||
GetClip (oldClip = NewRgn ());
|
||||
SetRect (&tempRect, INT_MIN, INT_MIN, INT_MAX, INT_MAX);
|
||||
ClipRect (&tempRect);
|
||||
|
||||
GetMouse (&mouse);
|
||||
if (mouse.v < TEXTREC->viewRect.top) DoScrollBar (vScroll, -1);
|
||||
else if (mouse.v > TEXTREC->viewRect.bottom) DoScrollBar (vScroll, 1);
|
||||
|
||||
SetClip (oldClip);
|
||||
DisposeRgn (oldClip);
|
||||
SetPort (oldPort);
|
||||
return true;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
// static pascal void ScrollProc (ControlHandle control, short thePart)
|
||||
//=============================================================================
|
||||
// for clicks in the scroll bar or arrows; update the window properly
|
||||
//=============================================================================
|
||||
|
||||
pascal void ScrollProc (ControlHandle control, short thePart) {
|
||||
short amount;
|
||||
WindowPtr window;
|
||||
|
||||
if (!thePart) return;
|
||||
window = (*control)->contrlOwner;
|
||||
switch (thePart) {
|
||||
case kControlUpButtonPart: amount = -1; break;
|
||||
case kControlDownButtonPart: amount = 1; break;
|
||||
case kControlPageUpPart: amount = -linesInView; break;
|
||||
case kControlPageDownPart: amount = linesInView; break;
|
||||
}
|
||||
DoScrollBar (control, amount);
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
// Rect SetTERect (void)
|
||||
//=============================================================================
|
||||
// set the dimensions of the text record in its window
|
||||
//=============================================================================
|
||||
|
||||
Rect SetTERect (void) {
|
||||
Rect teRect = gCommandWin->portRect;
|
||||
teRect.right -= SCROLLER_WIDTH;
|
||||
InsetRect (&teRect, TEXT_MARGIN, TEXT_MARGIN);
|
||||
linesInView = (teRect.bottom - teRect.top) / LINEHEIGHT;
|
||||
teRect.bottom = teRect.top + linesInView * LINEHEIGHT; /* round off */
|
||||
return teRect;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
// static void AdjustCursor (EventRecord *theEvent)
|
||||
//=============================================================================
|
||||
// make the pointer an I-beam iff it's in the text window
|
||||
//=============================================================================
|
||||
|
||||
void AdjustCursor (Point theLoc, RgnHandle theRgn)
|
||||
{
|
||||
RgnHandle arrowRgn, iBeamRgn, hiliteRgn, tempRgn;
|
||||
Rect theRect;
|
||||
Point thePoint;
|
||||
|
||||
if (gInBackground)
|
||||
return;
|
||||
|
||||
arrowRgn = NewRgn();
|
||||
SetRectRgn(arrowRgn, -32767, -32767, 32767, 32767);
|
||||
|
||||
// GlobalToLocal ((theLoc); ???
|
||||
|
||||
if (gCommandWin == FrontWindow () ) {
|
||||
SetPort(gCommandWin);
|
||||
iBeamRgn = NewRgn();
|
||||
hiliteRgn = NewRgn();
|
||||
|
||||
theRect = TEXTREC->viewRect;
|
||||
LocalToGlobal((Point *)&(theRect.top));
|
||||
LocalToGlobal((Point *)&(theRect.bottom));
|
||||
RectRgn(iBeamRgn, &theRect);
|
||||
|
||||
TEGetHiliteRgn(hiliteRgn, hTERec);
|
||||
thePoint.h = thePoint.v = 0;
|
||||
LocalToGlobal(&thePoint);
|
||||
OffsetRgn(hiliteRgn, thePoint.h, thePoint.v);
|
||||
|
||||
DiffRgn(arrowRgn, hiliteRgn, arrowRgn);
|
||||
DiffRgn(arrowRgn, iBeamRgn, arrowRgn);
|
||||
|
||||
DiffRgn(iBeamRgn, hiliteRgn, iBeamRgn);
|
||||
|
||||
if (PtInRgn(theLoc, iBeamRgn)) {
|
||||
SetCursor(*GetCursor(iBeamCursor));
|
||||
CopyRgn(iBeamRgn, theRgn);
|
||||
} else if (PtInRgn(theLoc, hiliteRgn)) {
|
||||
SetCursor(&qd.arrow);
|
||||
CopyRgn(hiliteRgn, theRgn);
|
||||
} else {
|
||||
SetCursor(&qd.arrow);
|
||||
CopyRgn(arrowRgn, theRgn);
|
||||
}
|
||||
|
||||
DisposeRgn(iBeamRgn);
|
||||
DisposeRgn(hiliteRgn);
|
||||
|
||||
} else {
|
||||
SetCursor(&qd.arrow);
|
||||
CopyRgn(arrowRgn, theRgn);
|
||||
}
|
||||
|
||||
DisposeRgn(arrowRgn);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//=============================================================================
|
||||
// static void SetScrollRect (void)
|
||||
//=============================================================================
|
||||
// Set Scroll bar rec size
|
||||
//=============================================================================
|
||||
|
||||
void SetScrollRect (void) {
|
||||
/* set the dimensions of the scroll bar in its window */
|
||||
|
||||
// This change fixes the double flash on window resize -EAD
|
||||
|
||||
// MoveControl (vScroll, commandWin->portRect.right - SCROLLER_WIDTH, -1);
|
||||
// SizeControl (vScroll, SCROLLER_WIDTH + 1,
|
||||
// (commandWin->portRect.bottom - commandWin->portRect.top) - (SCROLLER_WIDTH - 2));
|
||||
(*vScroll)->contrlRect.left = gCommandWin->portRect.right - SCROLLER_WIDTH;
|
||||
(*vScroll)->contrlRect.top = -1;
|
||||
(*vScroll)->contrlRect.right = gCommandWin->portRect.right + 1;
|
||||
(*vScroll)->contrlRect.bottom = gCommandWin->portRect.bottom - (SCROLLER_WIDTH - 1);
|
||||
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
// static void AdjustScrollBar (void)
|
||||
//=============================================================================
|
||||
// Set the thumb on scrollbar
|
||||
//=============================================================================
|
||||
|
||||
static void AdjustScrollBar (void) {
|
||||
/* adjust the scroll bar to match the position of the text view */
|
||||
short oldval = GetControlValue (vScroll), oldmax = GetControlMaximum (vScroll);
|
||||
short value, max;
|
||||
short test;
|
||||
|
||||
max = TEXTREC->nLines - linesInView;
|
||||
if ((TEXTREC->teLength > 0) && (*(*TEXTREC->hText + TEXTREC->teLength - 1) == '\r')) max++;
|
||||
if (max < 0) max = 0;
|
||||
if (max != oldmax) SetControlMaximum (vScroll, max);
|
||||
value = (short)((TEXTREC->viewRect.top - TEXTREC->destRect.top) / LINEHEIGHT);
|
||||
// value = roundup ((TEXTREC->viewRect.top - TEXTREC->destRect.top) / LINEHEIGHT);
|
||||
if (value < 0) value = 0; else if (value > max) value = max;
|
||||
if (value != oldval) SetControlValue (vScroll, value);
|
||||
}
|
||||
|
||||
static short roundup (float x) { /* a kludge to round up a float to an int */
|
||||
if (((int) x) != ((int) (x += 0.5))) x += 0.5;
|
||||
return (int) x;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
// void DoKeyPress (EventRecord *theEvent)
|
||||
//=============================================================================
|
||||
// Hanlde Keyboard Input
|
||||
//=============================================================================
|
||||
|
||||
void DoKeyPress (EventRecord *theEvent) {
|
||||
short whatKey = theEvent->message & charCodeMask;
|
||||
if (theEvent->modifiers & cmdKey) {
|
||||
long choice;
|
||||
AdjustMenus ();
|
||||
if (choice = MenuKey (theEvent->message)) DoMenu (choice);
|
||||
else if (((whatKey == 'w') || (whatKey == 'W')) && (FrontWindow () == gGraphicsWin))
|
||||
HideGrafWin ();
|
||||
else if (whatKey == LEFTARROW) GoStartOfLine ();
|
||||
else if (whatKey == RIGHTARROW) GoEndOfLine ();
|
||||
else if (whatKey == UPARROW) DoScrollBar (vScroll, - linesInView);
|
||||
else if (whatKey == DOWNARROW) DoScrollBar (vScroll, linesInView);
|
||||
}
|
||||
else if (theEvent->modifiers & optionKey) {
|
||||
if (whatKey == LEFTARROW) GoBackOneWord ();
|
||||
else if (whatKey == RIGHTARROW) GoForwardOneWord ();
|
||||
}
|
||||
else switch (whatKey) {
|
||||
case PAGEUP: DoScrollBar (vScroll, -linesInView); break;
|
||||
case PAGEDN: DoScrollBar (vScroll, linesInView); break;
|
||||
case HOMEKEY: DoScrollBar (vScroll, INT_MIN); break;
|
||||
case ENDKEY: DoScrollBar (vScroll, INT_MAX); break;
|
||||
case FNKEY: break;
|
||||
case HELPKEY: break;
|
||||
default: recentChar = theEvent->message & charCodeMask;
|
||||
}
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
// static void DrawOnlyGrowIcon (WindowPtr window)
|
||||
//=============================================================================
|
||||
// draw growbox on command window with no scoll bars
|
||||
//=============================================================================
|
||||
|
||||
static void DrawOnlyGrowIcon (WindowPtr window)
|
||||
{
|
||||
RgnHandle saveRgn;
|
||||
Rect growRect;
|
||||
|
||||
growRect = window->portRect;
|
||||
growRect.top = growRect.bottom - SCROLLER_WIDTH;
|
||||
growRect.left = growRect.right - SCROLLER_WIDTH;
|
||||
GetClip (saveRgn = NewRgn ());
|
||||
ClipRect (&growRect);
|
||||
DrawGrowIcon (window);
|
||||
SetClip (saveRgn);
|
||||
DisposeRgn (saveRgn);
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
// void SetSelection (short start, short end)
|
||||
//=============================================================================
|
||||
// set text selection in the command window
|
||||
//=============================================================================
|
||||
|
||||
void SetSelection (short start, short end) {
|
||||
TEXTREC->clikStuff = 255; /* to make sure the caret appears at the start of a line when it should */
|
||||
/* see tech note "TextEdit EOL Ambiguity" for more information */
|
||||
TESetSelect (start, end, hTERec);
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
// static void CancelFlash (void)
|
||||
//=============================================================================
|
||||
// cancel the matching-paren flashing
|
||||
//=============================================================================
|
||||
|
||||
static void CancelFlash (void) {
|
||||
if (flashTime) {
|
||||
flashTime = 0;
|
||||
SetSelection (cursorBeforeFlash, cursorBeforeFlash);
|
||||
}
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
// static void StopPasting (void)
|
||||
//=============================================================================
|
||||
// clean up after finishing a paste
|
||||
//=============================================================================
|
||||
|
||||
void StopPasting (void) {
|
||||
pastedLength = 0;
|
||||
if (pastedTextH) {
|
||||
DisposeHandle (pastedTextH);
|
||||
pastedTextH = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
// static void DoStyle (int whatStyle)
|
||||
//=============================================================================
|
||||
// set the text to a certain style
|
||||
//=============================================================================
|
||||
|
||||
static void DoStyle (int whatStyle) {
|
||||
TESetStyle (doFace, &(textStyle[whatStyle]), false, hTERec);
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
// static void FlushOutput (void)
|
||||
//=============================================================================
|
||||
// clear out the output buffer, dumping its contents to the window
|
||||
//=============================================================================
|
||||
|
||||
void FlushOutput (void) {
|
||||
short totalLines, scrollAmount, max;
|
||||
|
||||
if (outputBufferLength == 0) return;
|
||||
CancelFlash ();
|
||||
DoStyle (plainStyle);
|
||||
HLock (hOutputBuffer);
|
||||
TEInsert (*hOutputBuffer, outputBufferLength, hTERec);
|
||||
HUnlock (hOutputBuffer);
|
||||
outputBufferLength = 0;
|
||||
|
||||
if (TEXTREC->teLength > SCROLLBACK_THRESHHOLD) {
|
||||
/* make sure TE record isn't too long */
|
||||
#ifdef ORIGINALCODE
|
||||
/* I replaced this because Nyquist was crashing after the
|
||||
buffer got filled. The replacement below is simpler and
|
||||
eliminates the crashes, although it probably could cause
|
||||
problems by clearing the selection.
|
||||
*/
|
||||
int i = 1, newLength;
|
||||
TEPtr textPtr;
|
||||
while ((TEXTREC->teLength - TEXTREC->lineStarts[i]) >
|
||||
(SCROLLBACK_THRESHHOLD - DELETE_BLOCK)) i++;
|
||||
i = TEXTREC->lineStarts[i];
|
||||
newLength = TEXTREC->teLength - i;
|
||||
textPtr = (TEPtr)(*(TEXTREC->hText));
|
||||
BlockMoveData ((Ptr)((long)textPtr + i), textPtr, newLength);
|
||||
SetHandleSize (TEXTREC->hText, newLength);
|
||||
TEXTREC->destRect.top += LINEHEIGHT;
|
||||
TECalText (hTERec);
|
||||
TEUpdate (&(TEXTREC->viewRect), hTERec);
|
||||
#else
|
||||
/* find the line start after DELETE_BLOCK */
|
||||
int i = 1;
|
||||
while (TEXTREC->lineStarts[i] < DELETE_BLOCK) i++;
|
||||
TESetSelect(0, TEXTREC->lineStarts[i], hTERec);
|
||||
TEDelete(hTERec);
|
||||
/* after deletion, put cursor back at end of buffer */
|
||||
TESetSelect(TEXTREC->teLength, TEXTREC->teLength, hTERec);
|
||||
#endif
|
||||
}
|
||||
TESelView (hTERec);
|
||||
AdjustScrollBar ();
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
// void PrepareForInput (void)
|
||||
//=============================================================================
|
||||
// get ready to take input
|
||||
//=============================================================================
|
||||
|
||||
void PrepareForInput (void) {
|
||||
FlushOutput ();
|
||||
cmdStart = TEXTREC->selStart;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
// static void DeleteRange (void)
|
||||
//=============================================================================
|
||||
// delete the selected range of text, updating cmdStart as necessary
|
||||
//=============================================================================
|
||||
|
||||
void DeleteRange (void) {
|
||||
if (TEXTREC->selEnd <= cmdStart) return;
|
||||
if (TEXTREC->selStart < cmdStart) SetSelection (cmdStart, TEXTREC->selEnd);
|
||||
TEDelete (hTERec);
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
// static void CopyThisLineToEnd (void)
|
||||
//=============================================================================
|
||||
// copy the line the caret is on to the end
|
||||
//=============================================================================
|
||||
|
||||
static void CopyThisLineToEnd (void) {
|
||||
char *buffer;
|
||||
short b, i, caretOffset;
|
||||
|
||||
/* first find out exactly where it starts */
|
||||
i = TEXTREC->nLines-1; /* first find which line */
|
||||
while (TEXTREC->selStart < TEXTREC->lineStarts[i]) i--;
|
||||
while ((i > 0) && ((*(TEXTREC->hText))[TEXTREC->lineStarts[i]-1] != '\r'))
|
||||
i--; /* for wrapped lines */
|
||||
i = TEXTREC->lineStarts[i]; /* now zero in on the exact character where it begins */
|
||||
while ((TEXTCHAR(i) >= '0') && (TEXTCHAR(i) <= '9')) i++; /* skip error level */
|
||||
if ((TEXTCHAR(i) == '>') && (TEXTCHAR(i+1) == ' ')) i+=2; /* get rid of leading prompt */
|
||||
|
||||
caretOffset = TEXTREC->selStart - i; /* how many characters in is the caret? */
|
||||
|
||||
/* now put the line into the buffer */
|
||||
b = 0;
|
||||
while ((TEXTCHAR(i+b) != '\r') && (i+b < TEXTREC->teLength)) b++; /* find the end of the line */
|
||||
buffer = (char *) NewPtr (b);
|
||||
BlockMoveData (*TEXTREC->hText + i, buffer, b);
|
||||
buffer[b] = '\0';
|
||||
|
||||
/* delete whatever's already on the last line */
|
||||
SetSelection (cmdStart, TEXTREC->teLength);
|
||||
TEDelete (hTERec);
|
||||
|
||||
DoStyle (boldStyle);
|
||||
TEInsert (buffer, b, hTERec);
|
||||
DisposePtr (buffer);
|
||||
|
||||
if (caretOffset < 0) caretOffset = b;
|
||||
SetSelection (cmdStart + caretOffset, cmdStart + caretOffset);
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
// Next four functions possition cursor in text
|
||||
//=============================================================================
|
||||
|
||||
static void GoStartOfLine (void) {
|
||||
short whichLine = TEXTREC->nLines - 1; /* look for the caret; start at the end and go up */
|
||||
while (TEXTREC->lineStarts[whichLine] > TEXTREC->selStart) whichLine--;
|
||||
SetSelection (TEXTREC->lineStarts[whichLine], TEXTREC->lineStarts[whichLine]);
|
||||
AdjustScrollBar ();
|
||||
}
|
||||
|
||||
static void GoEndOfLine (void) {
|
||||
short whichLine = TEXTREC->nLines - 1; /* look for the caret; start at the end and go up */
|
||||
while (TEXTREC->lineStarts[whichLine] > TEXTREC->selStart) whichLine--;
|
||||
if (whichLine == TEXTREC->nLines - 1)
|
||||
SetSelection (TEXTREC->teLength, TEXTREC->teLength);
|
||||
else SetSelection (TEXTREC->lineStarts[whichLine+1] - 1, TEXTREC->lineStarts[whichLine+1] - 1);
|
||||
AdjustScrollBar ();
|
||||
}
|
||||
|
||||
static void GoBackOneWord (void) {
|
||||
short i = TEXTREC->selStart;
|
||||
while ((i > 0) && !isalnum (TEXTCHAR(i-1))) i--;
|
||||
while ((i > 0) && isalnum (TEXTCHAR(i-1))) i--;
|
||||
SetSelection (i, i);
|
||||
}
|
||||
|
||||
static void GoForwardOneWord (void) {
|
||||
short i = TEXTREC->selStart;
|
||||
while ((i < TEXTREC->teLength) && !isalnum (TEXTCHAR(i))) i++;
|
||||
while ((i < TEXTREC->teLength) && isalnum (TEXTCHAR(i))) i++;
|
||||
SetSelection (i, i);
|
||||
}
|
||||
|
||||
|
||||
//=============================================================================
|
||||
// static void EditFreely (void)
|
||||
//=============================================================================
|
||||
// Enter text into the command windows
|
||||
//=============================================================================
|
||||
|
||||
static void EditFreely (void) {
|
||||
Boolean done;
|
||||
do {
|
||||
done = false;
|
||||
DoEvent ();
|
||||
if (pastedLength > 0) { /* if there is still text to paste, paste it */
|
||||
int i = 0;
|
||||
CancelFlash ();
|
||||
if (TEXTREC->selStart < cmdStart) StopPasting ();
|
||||
else {
|
||||
while ((i < pastedLength) && (((char *)(*pastedTextH))[i] != '\r')) i++;
|
||||
DoStyle (boldStyle);
|
||||
TEInsert (*pastedTextH, i, hTERec);
|
||||
AdjustScrollBar ();
|
||||
if (i < pastedLength) { /* we were stopped by a carriage return, so eat it */
|
||||
i++;
|
||||
done = true;
|
||||
}
|
||||
pastedLength -= i;
|
||||
if (pastedLength > 0) {
|
||||
BlockMoveData ((Ptr)((long)(*pastedTextH) + i), *pastedTextH, pastedLength);
|
||||
SetHandleSize (pastedTextH, pastedLength);
|
||||
} else StopPasting ();
|
||||
}
|
||||
}
|
||||
else if (recentChar) { /* if the last event got us a character, process it */
|
||||
int i;
|
||||
Boolean wasOnLastLine;
|
||||
CancelFlash ();
|
||||
|
||||
if ((TEXTREC->selEnd <= cmdStart) && (TEXTREC->selStart != TEXTREC->selEnd)) continue;
|
||||
if (TEXTREC->selStart < cmdStart) SetSelection (cmdStart, TEXTREC->selEnd);
|
||||
wasOnLastLine = (TEXTREC->selStart >= cmdStart);
|
||||
|
||||
if ((recentChar & 0xfc) == 0x1c) { /* was this an arrow key? */
|
||||
TEXTREC->clikStuff = 255; /* to make sure the caret appears where it should */
|
||||
TEKey (recentChar, hTERec);
|
||||
AdjustScrollBar ();
|
||||
continue;
|
||||
}
|
||||
if (!wasOnLastLine) CopyThisLineToEnd ();
|
||||
switch (recentChar) {
|
||||
case FWDDEL:
|
||||
if (TEXTREC->selStart != TEXTREC->selEnd) DeleteRange ();
|
||||
else if ((TEXTREC->selStart >= cmdStart) && (TEXTREC->selStart < TEXTREC->teLength)) {
|
||||
TEDeactivate (hTERec);
|
||||
SetSelection (TEXTREC->selStart, TEXTREC->selStart + 1);
|
||||
TEDelete (hTERec);
|
||||
if (FrontWindow () == gCommandWin) TEActivate (hTERec);
|
||||
}
|
||||
break;
|
||||
case CLRKEY:
|
||||
if (TEXTREC->selStart != TEXTREC->selEnd) DeleteRange ();
|
||||
break;
|
||||
case DELETE:
|
||||
if (TEXTREC->selStart != TEXTREC->selEnd) DeleteRange ();
|
||||
else if (TEXTREC->selStart > cmdStart) {
|
||||
TEXTREC->clikStuff = 255; /* to make sure the caret appears where it should */
|
||||
TEKey (DELETE, hTERec);
|
||||
}
|
||||
break;
|
||||
case RETURN:
|
||||
if (wasOnLastLine) done = true;
|
||||
break;
|
||||
case ENTER: /* ENTER ends command no matter what */
|
||||
done = true;
|
||||
break;
|
||||
default:
|
||||
DoStyle (boldStyle);
|
||||
TEXTREC->clikStuff = 255; /* to make sure the caret appears where it should */
|
||||
TEKey (recentChar, hTERec);
|
||||
if ((recentChar == ')') && (TEXTREC->selStart > cmdStart)) {
|
||||
short parenCount = -1;
|
||||
Boolean inQuotes = false;
|
||||
i = TEXTREC->selStart - 1;
|
||||
while ((--i >= cmdStart) && (parenCount != 0))
|
||||
switch ((*TEXTREC->hText)[i]) {
|
||||
case DBLQUOTE: inQuotes = !inQuotes; break;
|
||||
case '(': if (!inQuotes) parenCount++; break;
|
||||
case ')': if (!inQuotes) parenCount--; break;
|
||||
}
|
||||
if (parenCount == 0) {
|
||||
cursorBeforeFlash = TEXTREC->selStart;
|
||||
SetSelection (i+1, i+2); /* flash the matching open-paren */
|
||||
flashTime = 10;
|
||||
}
|
||||
} else if ((recentChar == DBLQUOTE) && (TEXTREC->selStart > cmdStart)) {
|
||||
i = TEXTREC->selStart - 1;
|
||||
while ((--i >= cmdStart) && ((*TEXTREC->hText)[i] != DBLQUOTE)) ;
|
||||
if ((*TEXTREC->hText)[i] == DBLQUOTE) {
|
||||
cursorBeforeFlash = TEXTREC->selStart;
|
||||
SetSelection (i, i+1); /* flash the matching double-quote */
|
||||
flashTime = 10;
|
||||
}
|
||||
}
|
||||
}
|
||||
AdjustScrollBar ();
|
||||
}
|
||||
} while (!done);
|
||||
}
|
||||
|
||||
char *macgets (void) {
|
||||
/* retrieve a typed character */
|
||||
/* Note that this uses some extensive (and clever, if I may say so myself) buffering. */
|
||||
int i, b, bufSize;
|
||||
char *ptr, *buffer;
|
||||
Boolean done, onLastLine;
|
||||
|
||||
PrepareForInput ();
|
||||
do { /* repeat until a full expression has been typed */
|
||||
EditFreely (); /* allow free editing for a while */
|
||||
|
||||
/* Now, we have a complete command to parse, if and only if: */
|
||||
/* - the cursor was on the last line when the user pressed Return or Enter, and */
|
||||
/* - the user either pressed Enter, or else every '(' since the beginning */
|
||||
/* of the command is matched by a ')'. */
|
||||
/* Quoting is watched for. ( ") is not a complete expression. */
|
||||
|
||||
done = true;
|
||||
if (TEXTREC->selStart != TEXTREC->teLength) /* if we're not at the end already */
|
||||
SetSelection (TEXTREC->teLength, TEXTREC->teLength); /* send cursor to end */
|
||||
TEXTREC->clikStuff = 255; /* to make sure the caret appears where it should */
|
||||
TEKey ('\r', hTERec);
|
||||
|
||||
/* check and see if we've completed the command yet */
|
||||
if (recentChar != ENTER) {
|
||||
Boolean inQuotes = false;
|
||||
short parenCount = 0;
|
||||
for (i = cmdStart; i < TEXTREC->teLength; i++)
|
||||
switch ((*TEXTREC->hText)[i]) {
|
||||
case DBLQUOTE: inQuotes = !inQuotes; break;
|
||||
case '(': if (!inQuotes) parenCount++; break;
|
||||
case ')': if (!inQuotes) parenCount--; break;
|
||||
}
|
||||
if ((parenCount > 0) || inQuotes) done = false;
|
||||
}
|
||||
|
||||
AdjustScrollBar ();
|
||||
} while (!done);
|
||||
|
||||
/* put the entire command into the buffer, and return it */
|
||||
bufSize = TEXTREC->teLength - cmdStart;
|
||||
buffer = (char *) NewPtr (bufSize + 1);
|
||||
BlockMoveData (*TEXTREC->hText + cmdStart, buffer, bufSize);
|
||||
buffer[bufSize] = '\0';
|
||||
return buffer;
|
||||
}
|
||||
|
||||
void macputc (int ch) {
|
||||
/* put a char into the output buffer, and flush the buffer if necessary */
|
||||
switch (ch) {
|
||||
case '\t':
|
||||
do { macputc (' '); } while (cursorPos & 7);
|
||||
break;
|
||||
case DELETE:
|
||||
if (cursorPos) cursorPos--; /* and fall through to default */
|
||||
default:
|
||||
if (outputBufferLength == MAX_BUF) FlushOutput ();
|
||||
if (ch == '\n') {
|
||||
cursorPos = 0;
|
||||
(*hOutputBuffer)[outputBufferLength++] = '\r';
|
||||
} else {
|
||||
cursorPos++;
|
||||
(*hOutputBuffer)[outputBufferLength++] = ch;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void macputs (char *s) {
|
||||
/* for completeness */
|
||||
while (*s) macputc (*s++);
|
||||
}
|
||||
|
||||
void scrflush (void) {
|
||||
extern void osflush (void);
|
||||
/* clear out everything */
|
||||
FlushOutput ();
|
||||
osflush ();
|
||||
}
|
||||
|
||||
void scrclear (void) {
|
||||
/* clear text window -- not implemented */
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
// static void UpdateCmdWindow (void)
|
||||
//=============================================================================
|
||||
// main command window update procedure
|
||||
//=============================================================================
|
||||
|
||||
|
||||
void UpdateCmdWindow (void) {
|
||||
long textBottom;
|
||||
Rect tempRect;
|
||||
|
||||
InvalRect (&(gCommandWin->portRect));
|
||||
BeginUpdate (gCommandWin);
|
||||
BlockMoveData(&(gCommandWin->portRect), &tempRect, sizeof(Rect));
|
||||
tempRect.right -= SCROLLER_WIDTH;
|
||||
EraseRect (&tempRect);
|
||||
if (gCommandWinResized) {
|
||||
TEXTREC->viewRect = SetTERect ();
|
||||
TEXTREC->destRect.right = TEXTREC->viewRect.right;
|
||||
TECalText (hTERec);
|
||||
SetScrollRect ();
|
||||
gCommandWinResized = false;
|
||||
}
|
||||
DrawOnlyGrowIcon (gCommandWin);
|
||||
FlushOutput ();
|
||||
|
||||
TEXTREC->viewRect = SetTERect (); /* adjust for possible change in height of status line */
|
||||
|
||||
textBottom = TEXTREC->destRect.top + (TEXTREC->nLines * LINEHEIGHT);
|
||||
if (TEXTREC->destRect.top > TEXTREC->viewRect.top)
|
||||
TEScroll (0, (TEXTREC->viewRect.top - TEXTREC->destRect.top), hTERec);
|
||||
|
||||
if (TEXTREC->destRect.top < TEXTREC->viewRect.top) { /* make sure we don't get fractions of lineheights */
|
||||
int amountOffTheTop = TEXTREC->viewRect.top - TEXTREC->destRect.top;
|
||||
if (amountOffTheTop % LINEHEIGHT) TEScroll (0, amountOffTheTop % LINEHEIGHT, hTERec);
|
||||
}
|
||||
TEUpdate (&(TEXTREC->viewRect), hTERec);
|
||||
AdjustScrollBar ();
|
||||
UpdateControls (gCommandWin, gCommandWin->visRgn);
|
||||
EndUpdate (gCommandWin);
|
||||
}
|
||||
|
||||
void ActivateCmdWindow(void)
|
||||
{
|
||||
TEActivate (hTERec);
|
||||
HiliteControl (vScroll, 0);
|
||||
DrawOnlyGrowIcon (gCommandWin);
|
||||
}
|
||||
|
||||
void DeactivateCmdWindow(void)
|
||||
{
|
||||
TEDeactivate (hTERec);
|
||||
HiliteControl (vScroll, 255);
|
||||
DrawOnlyGrowIcon (gCommandWin);
|
||||
}
|
||||
|
||||
void InitalizeCmdWindow(void)
|
||||
{
|
||||
|
||||
/* setup the font, size and writing mode for the command window */
|
||||
TextFont (kFontIDMonaco);
|
||||
TextSize (9);
|
||||
TextFace (0);
|
||||
TextMode (srcCopy);
|
||||
textStyle[plainStyle].tsFace = 0;
|
||||
textStyle[boldStyle].tsFace = bold;
|
||||
|
||||
currentStyle = plainStyle;
|
||||
|
||||
{ /* set up scroll bar */
|
||||
Rect scrollRect;
|
||||
vScroll = NewControl (gCommandWin, &scrollRect, "\p", 0, 0, 0, 0, scrollBarProc, 0L);
|
||||
SetScrollRect ();
|
||||
ShowControl (vScroll);
|
||||
}
|
||||
|
||||
{ /* set up command text record */
|
||||
Rect teRect = SetTERect ();
|
||||
hTERec = (TEHandle)TEStyleNew (&teRect, &teRect);
|
||||
TECalText (hTERec);
|
||||
TEAutoView (true, hTERec);
|
||||
TESetClickLoop (uppScrollClickLoop, hTERec);
|
||||
TEActivate (hTERec);
|
||||
}
|
||||
|
||||
hOutputBuffer = NewHandle (MAX_BUF); /* a handle to a buffer for text to be displayed */
|
||||
}
|
||||
|
||||
void CleanupCmdWindow(void)
|
||||
{
|
||||
StopPasting ();
|
||||
CloseWindow (gCommandWin);
|
||||
TEDispose (hTERec);
|
||||
DisposeHandle (hOutputBuffer);
|
||||
}
|
||||
17
lib-src/libnyquist/nyquist/sys/mac/MacCommandWin.h
Normal file
17
lib-src/libnyquist/nyquist/sys/mac/MacCommandWin.h
Normal file
@@ -0,0 +1,17 @@
|
||||
/* MacCommandWin.h -- headers for more mac stuff */
|
||||
|
||||
void SetSelection (short start, short end);
|
||||
void macputc(int ch);
|
||||
void macputs(char *s);
|
||||
void PrepareForInput(void);
|
||||
void InitalizeCmdWindow(void);
|
||||
void UpdateCmdWindow(void);
|
||||
void StopPasting(void);
|
||||
void DeleteRange(void);
|
||||
void scrflush(void);
|
||||
void SetScrollRect(void);
|
||||
void AdjustCursor(Point theLoc, RgnHandle theRgn);
|
||||
void DoKeyPress(EventRecord *theEvent);
|
||||
void ActivateCmdWindow(void);
|
||||
void DeactivateCmdWindow(void);
|
||||
void CleanupCmdWindow(void);
|
||||
3
lib-src/libnyquist/nyquist/sys/mac/MacDrag.h
Normal file
3
lib-src/libnyquist/nyquist/sys/mac/MacDrag.h
Normal file
@@ -0,0 +1,3 @@
|
||||
/* MacDrag.h -- drag text */
|
||||
|
||||
Boolean DragText(EventRecord *ev);
|
||||
81
lib-src/libnyquist/nyquist/sys/mac/MacFileUtils.c
Normal file
81
lib-src/libnyquist/nyquist/sys/mac/MacFileUtils.c
Normal file
@@ -0,0 +1,81 @@
|
||||
// Routines that deal with some mac file system stuff -EAD
|
||||
|
||||
#include <Files.h>
|
||||
#include <TextUtils.h>
|
||||
#include <string.h>
|
||||
//#include "MiscellaneousUtilities.h"
|
||||
|
||||
//=========================================================================
|
||||
// Function prototypes
|
||||
//=========================================================================
|
||||
|
||||
void set_mac_file_type(char *filename);
|
||||
void GetFullPath(FSSpec *theSpec, StringPtr theName);
|
||||
void PathNameFromDirID(long dirID, short vRefNum, StringPtr fullPathName);
|
||||
|
||||
|
||||
|
||||
//=========================================================================
|
||||
// Set the output soundfile type and creator
|
||||
//=========================================================================
|
||||
|
||||
void set_mac_file_type(char *filename)
|
||||
{
|
||||
Str255 fName;
|
||||
FSSpec fSpec;
|
||||
FInfo fFInfo;
|
||||
|
||||
fFInfo.fdType = 'AIFF';
|
||||
fFInfo.fdCreator = 'Sd2a';
|
||||
|
||||
BlockMoveData(filename, &fName[1], 256);
|
||||
fName[0] = strlen(filename);
|
||||
FSMakeFSSpec(0, 0, fName, &fSpec);
|
||||
FSpSetFInfo(&fSpec, &fFInfo);
|
||||
}
|
||||
|
||||
//==================================================================================================================================
|
||||
// void GetFullPath(FSSpec *theSpec, StringPtr theName)
|
||||
//==================================================================================================================================
|
||||
// Extracts the full pathname for the file pointed to by theSpec and returns it in theName.
|
||||
//==================================================================================================================================
|
||||
|
||||
void GetFullPath(FSSpec *theSpec, StringPtr theName)
|
||||
{
|
||||
*theName = 0;
|
||||
if (theSpec->parID != 1) PathNameFromDirID(theSpec->parID, theSpec->vRefNum, theName);
|
||||
// was: pstrcat(theName, theSpec->name);
|
||||
strcat(P2CStr(theName), P2CStr(theSpec->name));
|
||||
C2PStr((char *) theName);
|
||||
C2PStr((char *) theSpec->name);
|
||||
//pstrcat(theName, "\p:");
|
||||
theName[*theName + 1] = 0;
|
||||
}
|
||||
|
||||
//==================================================================================================================================
|
||||
// void PathNameFromDirID(long dirID, short vRefNum, StringPtr fullPathName)
|
||||
//==================================================================================================================================
|
||||
// Given a vRefNum and a directory ID, creates a full path specification.
|
||||
//==================================================================================================================================
|
||||
|
||||
void PathNameFromDirID(long dirID, short vRefNum, StringPtr fullPathName)
|
||||
{
|
||||
Str255 directoryName;
|
||||
DirInfo block;
|
||||
OSErr err;
|
||||
fullPathName[0] = 0;
|
||||
block.ioDrDirID = block.ioDrParID = dirID;
|
||||
block.ioNamePtr = directoryName;
|
||||
do {
|
||||
block.ioVRefNum = vRefNum;
|
||||
block.ioFDirIndex = -1;
|
||||
block.ioDrDirID = block.ioDrParID;
|
||||
err = PBGetCatInfo((CInfoPBPtr)&block, false);
|
||||
//pstrcat(directoryName, (StringPtr)"\p:");
|
||||
//pstrinsert(fullPathName, directoryName);
|
||||
strcat(P2CStr(directoryName), ":");
|
||||
strcat((char *) directoryName, (char *) fullPathName);
|
||||
strcpy((char *)fullPathName, (char *) directoryName);
|
||||
} while (block.ioDrDirID != 2);
|
||||
C2PStr((char *) fullPathName);
|
||||
}
|
||||
3
lib-src/libnyquist/nyquist/sys/mac/MacFileUtils.h
Normal file
3
lib-src/libnyquist/nyquist/sys/mac/MacFileUtils.h
Normal file
@@ -0,0 +1,3 @@
|
||||
/* MacFileUtils.h -- more mac stuff */
|
||||
|
||||
void GetFullPath(FSSpec *theSpec, StringPtr theName);
|
||||
50
lib-src/libnyquist/nyquist/sys/mac/MacGlobals.h
Normal file
50
lib-src/libnyquist/nyquist/sys/mac/MacGlobals.h
Normal file
@@ -0,0 +1,50 @@
|
||||
// Window pointers
|
||||
|
||||
extern WindowPtr gCommandWin, gGraphicsWin;
|
||||
|
||||
extern Boolean gCommandWinResized;
|
||||
|
||||
|
||||
|
||||
// Menu Handles
|
||||
|
||||
extern MenuHandle appleMenu, fileMenu, editMenu, controlMenu;
|
||||
|
||||
|
||||
|
||||
// The command window text handle
|
||||
|
||||
extern TEHandle hTERec;
|
||||
|
||||
#define TEXTREC (*hTERec)
|
||||
|
||||
#define TEXTCHAR(i) ((*(TEXTREC->hText))[i])
|
||||
|
||||
|
||||
|
||||
// more comand window text stuff
|
||||
|
||||
extern CharsHandle pastedTextH; /* a handle to pasted text */
|
||||
|
||||
extern int pastedLength; /* how many chars there are in the paste buffer */
|
||||
|
||||
extern int outputBufferLength;
|
||||
|
||||
extern Rect dragRect, sizeRect;
|
||||
|
||||
extern int flashTime, cursorBeforeFlash;
|
||||
|
||||
extern char recentChar; /* the last character typed */
|
||||
|
||||
|
||||
|
||||
// Allocate space for UPPs
|
||||
|
||||
extern ControlActionUPP uppScrollProc;
|
||||
|
||||
extern TEClickLoopUPP uppScrollClickLoop;
|
||||
|
||||
|
||||
|
||||
extern Boolean gInBackground;
|
||||
|
||||
64
lib-src/libnyquist/nyquist/sys/mac/MacHandleEv.c
Normal file
64
lib-src/libnyquist/nyquist/sys/mac/MacHandleEv.c
Normal file
@@ -0,0 +1,64 @@
|
||||
#include <MacTypes.h>
|
||||
#include <Quickdraw.h>
|
||||
#include <Windows.h>
|
||||
#include <Controls.h>
|
||||
#include <ToolUtils.h>
|
||||
#include "macint.h"
|
||||
|
||||
extern WindowPtr gCommandWin, gGraphicsWin;
|
||||
extern Boolean gCommandWinResized;
|
||||
extern Rect dragRect, sizeRect;
|
||||
|
||||
//=============================================================================
|
||||
// Hanlde Mouse Down Events
|
||||
//=============================================================================
|
||||
|
||||
void DoMouseDown (EventRecord *theEvent) {
|
||||
WindowPtr whichWindow;
|
||||
short int thePart = FindWindow (theEvent->where, &whichWindow);
|
||||
|
||||
switch (thePart) {
|
||||
case inSysWindow:
|
||||
SystemClick (theEvent, whichWindow);
|
||||
break;
|
||||
case inDrag:
|
||||
DragWindow (whichWindow, theEvent->where, &dragRect);
|
||||
break;
|
||||
case inMenuBar: {
|
||||
long choice;
|
||||
AdjustMenus ();
|
||||
choice = MenuSelect (theEvent->where);
|
||||
if (choice) DoMenu (choice);
|
||||
break;
|
||||
}
|
||||
case inGoAway:
|
||||
if ((whichWindow == gGraphicsWin)
|
||||
&& (TrackGoAway (whichWindow, theEvent->where)))
|
||||
HideGrafWin ();
|
||||
break;
|
||||
case inContent:
|
||||
if ((FrontWindow () == gCommandWin) && (whichWindow == gCommandWin))
|
||||
DoContent (theEvent);
|
||||
else SelectWindow (whichWindow);
|
||||
break;
|
||||
case inGrow:
|
||||
case inZoomIn:
|
||||
case inZoomOut: {
|
||||
long newSize;
|
||||
GrafPtr oldPort;
|
||||
if (thePart == inGrow) newSize = GrowWindow (whichWindow, theEvent->where, &sizeRect);
|
||||
if (((thePart == inGrow) && newSize)
|
||||
|| ((thePart != inGrow) && TrackBox (whichWindow, theEvent->where, thePart))) {
|
||||
GetPort (&oldPort);
|
||||
SetPort (whichWindow);
|
||||
EraseRect (&whichWindow->portRect);
|
||||
if (thePart == inGrow) SizeWindow (whichWindow, LoWord (newSize), HiWord (newSize), -1);
|
||||
else ZoomWindow (whichWindow, thePart, 0);
|
||||
gCommandWinResized = true;
|
||||
InvalRect (&whichWindow->portRect);
|
||||
SetPort (oldPort);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
3
lib-src/libnyquist/nyquist/sys/mac/MacHandleEv.h
Normal file
3
lib-src/libnyquist/nyquist/sys/mac/MacHandleEv.h
Normal file
@@ -0,0 +1,3 @@
|
||||
/* MacHandelEv.h -- event handlers */
|
||||
|
||||
void DoMouseDown(EventRecord *theEvent);
|
||||
69
lib-src/libnyquist/nyquist/sys/mac/README.txt
Normal file
69
lib-src/libnyquist/nyquist/sys/mac/README.txt
Normal file
@@ -0,0 +1,69 @@
|
||||
README.txt -- information on Nyquist for Mac OS X
|
||||
|
||||
Installation
|
||||
------------
|
||||
The simplest way to install and run Nyquist is to get the pre-compiled
|
||||
NyquistIDE application, which includes executables, documentation, and
|
||||
libraries all in one package.
|
||||
|
||||
When the pre-compiled package is uncompressed, it produces two directories:
|
||||
nyquist
|
||||
NyquistIDE.app
|
||||
You should always keep these together. The nyquist directory initially
|
||||
contains documentation, but when NyquistIDE.app is run, the nyquist
|
||||
folder is also populated with links to the lib and demos folders,
|
||||
which contain example code and more documentation. The symbolic links
|
||||
allow you to easily find these files.
|
||||
|
||||
You can copy both nyquist and NyquistIDE.app to the /Applications folder
|
||||
if you wish, and you can add NyquistIDE.app to the Dock.
|
||||
|
||||
You will probably run Nyquist using the NyquistIDE application, but
|
||||
you can also run nyquist from the command line. The executable is
|
||||
located in
|
||||
|
||||
NyquistIDE.app/Contents/Resources/Java/ny
|
||||
|
||||
To run from the command line, you will need to set the XLISPPATH
|
||||
environment variable using this command line (if you use the C shell,
|
||||
e.g. csh):
|
||||
|
||||
setenv XLISPPATH `pwd`/runtime:`pwd`/lib
|
||||
|
||||
If you use the bash shell, use:
|
||||
|
||||
export XLISPPATH=`pwd`/runtime:`pwd`/lib
|
||||
|
||||
Note that this sets XLISPPATH in the environment of the current
|
||||
command line shell. If you exit the shell or switch to another shell,
|
||||
the XLISPPATH variable will not be set. Your shell reads an
|
||||
initialization file when it starts. You can add the XLISPPATH
|
||||
initialization command to this file if you want the variable to be set
|
||||
automatically in every instance of your command line shell.
|
||||
|
||||
On the topic of the XLISPPATH, note that this variable is set by
|
||||
NyquistIDE when running with that application, overriding any other
|
||||
value. You can extend the search path by creating the file xlisppath
|
||||
in the same directory as the nyquist executable ny. The xlisppath file
|
||||
should have colon-separated paths on a single line of text.
|
||||
|
||||
You can also build Nyquist from sources, as described below.
|
||||
|
||||
|
||||
How To Build Nyquist on Mac OS X
|
||||
--------------------------------
|
||||
You need to install Xcode, Apple's free software development system
|
||||
for OS X.
|
||||
|
||||
Xcode 4.3.2 and later
|
||||
-------
|
||||
The nyquist project for Xcode v4 is in nyquist/macosxproject/nyquist.xcodeproj
|
||||
|
||||
To build Nyquist or NyquistIDE:
|
||||
- Open nyquist.wxworkspace in Xcode
|
||||
- Set the active target to "Nyquist" or "NyquistIDE"
|
||||
- Click on "build active target"
|
||||
- ny or NyquistIDE will be produced in a temporary folder managed by Xcode.
|
||||
To find the files Right click on the Products/NyquistIDE.app of the project
|
||||
navigator, and select "reveal in finder".
|
||||
|
||||
123
lib-src/libnyquist/nyquist/sys/mac/macaboutbox.c
Normal file
123
lib-src/libnyquist/nyquist/sys/mac/macaboutbox.c
Normal file
@@ -0,0 +1,123 @@
|
||||
/* macaboutbox.c - Display the "about box" of the application. */
|
||||
/* Written by Brian Kendig. */
|
||||
/* The functions here are only used by macint.c. */
|
||||
|
||||
//#include <THINK.h>
|
||||
#include <Dialogs.h>
|
||||
#include <Fonts.h>
|
||||
#include <Menus.h>
|
||||
#include <Quickdraw.h>
|
||||
#include <Resources.h>
|
||||
#include <ToolUtils.h>
|
||||
#include <Traps.h>
|
||||
#include <Windows.h>
|
||||
#include "macint.h"
|
||||
#define NIL ((void *) 0)
|
||||
|
||||
static DialogPtr aboutBox;
|
||||
extern Boolean hasColorQD;
|
||||
|
||||
static enum {
|
||||
theOKButton = 1,
|
||||
theOKOutline = 2,
|
||||
theIcon = 3,
|
||||
theName = 4,
|
||||
theAboutText = 5,
|
||||
theCopyright = 6
|
||||
} ;
|
||||
|
||||
pascal void DrawOKOutline (WindowPtr dialogWindow, short theItem) {
|
||||
PenState oldPen;
|
||||
short iType;
|
||||
Handle iHandle;
|
||||
Rect iRect;
|
||||
|
||||
GetPenState (&oldPen);
|
||||
PenNormal ();
|
||||
PenSize (3,3);
|
||||
|
||||
GetDialogItem (aboutBox, theOKButton, &iType, &iHandle, &iRect);
|
||||
InsetRect (&iRect, -4, -4);
|
||||
FrameRoundRect (&iRect, 16, 16);
|
||||
|
||||
SetPenState (&oldPen);
|
||||
}
|
||||
|
||||
pascal void DrawIcon (WindowPtr dialogWindow, short theItem) {
|
||||
short iType;
|
||||
Handle iHandle;
|
||||
Rect iRect;
|
||||
|
||||
GetDialogItem (aboutBox, theIcon, &iType, &iHandle, &iRect);
|
||||
PlotIcon (&iRect, GetResource ('ICN#', 128));
|
||||
}
|
||||
|
||||
pascal void DrawName (WindowPtr dialogWindow, short theItem) {
|
||||
short iType;
|
||||
Handle iHandle;
|
||||
Rect iRect;
|
||||
Str255 string;
|
||||
|
||||
TextFont (kFontIDHelvetica);
|
||||
TextSize (24);
|
||||
TextFace (0);
|
||||
GetDialogItem (aboutBox, theName, &iType, &iHandle, &iRect);
|
||||
GetIndString (string, STRINGS_RES, 1);
|
||||
TETextBox (string+1, string[0], &iRect, teFlushLeft);
|
||||
}
|
||||
|
||||
pascal void DrawAboutText (WindowPtr dialogWindow, short theItem) {
|
||||
short iType;
|
||||
Handle iHandle;
|
||||
Rect iRect;
|
||||
Str255 string;
|
||||
|
||||
TextFont (kFontIDMonaco);
|
||||
TextSize (9);
|
||||
TextFace (0);
|
||||
GetDialogItem (aboutBox, theAboutText, &iType, &iHandle, &iRect);
|
||||
GetIndString (string, STRINGS_RES, 2);
|
||||
TETextBox (string+1, string[0], &iRect, teFlushLeft);
|
||||
}
|
||||
|
||||
pascal void DrawCopyright (WindowPtr dialogWindow, short theItem) {
|
||||
short iType;
|
||||
Handle iHandle;
|
||||
Rect iRect;
|
||||
Str255 string;
|
||||
|
||||
TextFont (systemFont);
|
||||
TextSize (12);
|
||||
TextFace (0);
|
||||
GetDialogItem (aboutBox, theCopyright, &iType, &iHandle, &iRect);
|
||||
GetIndString (string, STRINGS_RES, 3);
|
||||
TETextBox (string+1, string[0], &iRect, teFlushLeft);
|
||||
}
|
||||
|
||||
void DoAboutBox (void) {
|
||||
short itemType, itemHit = 0;
|
||||
Handle itemHandle;
|
||||
Rect aboutRect;
|
||||
short width, hight;
|
||||
PicHandle aboutPict;
|
||||
|
||||
aboutPict = GetPicture(ABOUT_PICT);
|
||||
aboutRect = (*aboutPict)->picFrame;
|
||||
width = aboutRect.right - aboutRect.left;
|
||||
hight = aboutRect.bottom - aboutRect.top;
|
||||
|
||||
aboutBox = GetNewDialog (ABOUT_BOX, NIL, (WindowPtr) -1);
|
||||
SizeWindow(aboutBox, width, hight, false);
|
||||
|
||||
ShowWindow (aboutBox);
|
||||
SetPort(aboutBox);
|
||||
DrawPicture(aboutPict, &(*aboutPict)->picFrame);
|
||||
|
||||
//itemHit = 0;
|
||||
//while (itemHit != ok) ModalDialog (NIL, &itemHit);
|
||||
while (!Button());
|
||||
|
||||
DisposeDialog (aboutBox);
|
||||
|
||||
FlushEvents(everyEvent, 0); // dmazzoni
|
||||
}
|
||||
3
lib-src/libnyquist/nyquist/sys/mac/macaboutbox.h
Normal file
3
lib-src/libnyquist/nyquist/sys/mac/macaboutbox.h
Normal file
@@ -0,0 +1,3 @@
|
||||
/* macaboutbox.h -- header for about box implementation */
|
||||
|
||||
void DoAboutBox(void);
|
||||
161
lib-src/libnyquist/nyquist/sys/mac/macdrag.c
Normal file
161
lib-src/libnyquist/nyquist/sys/mac/macdrag.c
Normal file
@@ -0,0 +1,161 @@
|
||||
#include <Drag.h>
|
||||
#include <Errors.h>
|
||||
#include <TextEdit.h>
|
||||
#include <QuickDraw.h>
|
||||
|
||||
extern TEHandle hTERec;
|
||||
// Handle drag from newswatcher -EAD
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
DragText
|
||||
|
||||
Drag selected text.
|
||||
|
||||
Entry: ev = pointer to mouse down event record.
|
||||
where = location of mouse down event in local coords.
|
||||
theTE = handle to TextEdit record.
|
||||
|
||||
Exit: function result = error code.
|
||||
*dragged =
|
||||
true if text was dragged.
|
||||
false if mouse down was not over text selection, or
|
||||
user did not move the mouse before releasing the
|
||||
mouse button.
|
||||
*trashed = true if text was dragged to trash.
|
||||
----------------------------------------------------------------------------*/
|
||||
extern RgnHandle rgn;
|
||||
//extern EventRecord theEvent;
|
||||
|
||||
Boolean DragText (EventRecord *ev)
|
||||
{
|
||||
DragReference dragRef;
|
||||
OSErr err = noErr;
|
||||
Boolean haveDragRef = false;
|
||||
Handle hText;
|
||||
RgnHandle dragRgn, tempRgn;
|
||||
short selStart, selEnd;
|
||||
char state;
|
||||
Point theLoc;
|
||||
GrafPtr curPort;
|
||||
|
||||
// if (!PtInTEHiliteRgn(where, hTERec)) return noErr;
|
||||
if (!WaitMouseMoved(ev->where)) return noErr;
|
||||
|
||||
GetPort(&curPort);
|
||||
|
||||
CopyRgn(rgn, dragRgn = NewRgn());
|
||||
SetPt(&theLoc, 0, 0);
|
||||
LocalToGlobal(&theLoc);
|
||||
OffsetRgn(dragRgn, theLoc.h, theLoc.v);
|
||||
|
||||
hText = (**hTERec).hText;
|
||||
selStart = (**hTERec).selStart;
|
||||
selEnd = (**hTERec).selEnd;
|
||||
|
||||
err = NewDrag(&dragRef);
|
||||
if (err != noErr) goto exit;
|
||||
haveDragRef = true;
|
||||
state = HGetState(hText);
|
||||
HLock(hText);
|
||||
err = AddDragItemFlavor(dragRef, 1, 'TEXT', *hText + selStart, selEnd - selStart, 0);
|
||||
HSetState(hText, state);
|
||||
if (err != noErr) goto exit;
|
||||
// dragRgn = NewRgn();
|
||||
// err = TEGetHiliteRgn(dragRgn, hTERec);
|
||||
// if (err != noErr) goto exit;
|
||||
// LocalToGlobalRgn(dragRgn);
|
||||
// OutlineRegion(dragRgn);
|
||||
SetDragItemBounds(dragRef, 1, &(**dragRgn).rgnBBox);
|
||||
tempRgn = NewRgn();
|
||||
CopyRgn(dragRgn, tempRgn);
|
||||
InsetRgn(tempRgn, 1, 1);
|
||||
DiffRgn(dragRgn, tempRgn, dragRgn);
|
||||
DisposeRgn(tempRgn);
|
||||
|
||||
err = TrackDrag(dragRef, ev, dragRgn);
|
||||
if (err != noErr && err != userCanceledErr) goto exit;
|
||||
//*trashed = DragTargetWasTrash(dragRef);
|
||||
// DisposeRgn(dragRgn);
|
||||
|
||||
DisposeDrag(dragRef);
|
||||
return true;
|
||||
|
||||
exit:
|
||||
|
||||
if (haveDragRef) DisposeDrag(dragRef);
|
||||
// if (dragRgn != nil) DisposeRgn(dragRgn);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
LocalToGlobalRgn
|
||||
|
||||
Convert a region from local to global coordinates.
|
||||
|
||||
Entry: rgn = handle to region.
|
||||
----------------------------------------------------------------------------*/
|
||||
|
||||
void LocalToGlobalRgn (RgnHandle rgn)
|
||||
{
|
||||
Point where;
|
||||
|
||||
SetPt(&where, 0, 0);
|
||||
LocalToGlobal(&where);
|
||||
OffsetRgn(rgn, where.h, where.v);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
OutlineRegion
|
||||
|
||||
Change a region into a tracing of its border which is appropriate
|
||||
for normal dragging.
|
||||
|
||||
Entry: theRgn = handle to region.
|
||||
|
||||
Exit: Region changed to outline of region.
|
||||
|
||||
From Apple "HFS Drag Sample" sample code.
|
||||
----------------------------------------------------------------------------*/
|
||||
|
||||
void OutlineRegion (RgnHandle theRgn)
|
||||
{
|
||||
RgnHandle tempRgn;
|
||||
|
||||
tempRgn = NewRgn();
|
||||
CopyRgn(theRgn, tempRgn);
|
||||
InsetRgn(tempRgn, 1, 1);
|
||||
DiffRgn(theRgn, tempRgn, theRgn);
|
||||
DisposeRgn(tempRgn);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
PtInTEHiliteRgn
|
||||
|
||||
Determine whether or not a point is in the current TextEdit hilite
|
||||
region.
|
||||
|
||||
Entry: where = point in local coords.
|
||||
theTE = handle to TextEdit record.
|
||||
|
||||
Exit: function result = true if point is in the hilite region.
|
||||
----------------------------------------------------------------------------*/
|
||||
|
||||
Boolean PtInTEHiliteRgn (Point where, TEHandle theTE)
|
||||
{
|
||||
Boolean result = false;
|
||||
RgnHandle rgn = nil;
|
||||
OSErr err = noErr;
|
||||
|
||||
//if (!HaveTEGetHiliteRgn()) return false;
|
||||
rgn = NewRgn();
|
||||
err = TEGetHiliteRgn(rgn, theTE);
|
||||
if (err != noErr) goto exit;
|
||||
result = PtInRgn(where, rgn);
|
||||
|
||||
exit:
|
||||
|
||||
if (rgn != nil) DisposeRgn(rgn);
|
||||
return result;
|
||||
}
|
||||
222
lib-src/libnyquist/nyquist/sys/mac/macfun.c
Normal file
222
lib-src/libnyquist/nyquist/sys/mac/macfun.c
Normal file
@@ -0,0 +1,222 @@
|
||||
/* macfun.c - macintosh user interface functions for xlisp */
|
||||
/* Written by Brian Kendig. */
|
||||
|
||||
#include <Quickdraw.h>
|
||||
#include <Windows.h>
|
||||
#include <Memory.h>
|
||||
#include "xlisp.h"
|
||||
#include "macint.h"
|
||||
|
||||
/* externals */
|
||||
extern WindowPtr gCommandWin, gGraphicsWin;
|
||||
extern Boolean hasColorQD;
|
||||
extern unsigned long startupTicks;
|
||||
extern void ShowGrafWin (void);
|
||||
|
||||
unsigned long ticks_per_second (void) { return 60; }
|
||||
unsigned long run_tick_count (void) { return ((unsigned long) TickCount ()) - startupTicks; }
|
||||
unsigned long real_tick_count (void) { return (unsigned long) TickCount (); }
|
||||
|
||||
LVAL xrealtime (void) { return cvfixnum ((FIXTYPE)real_tick_count()); } /* get-internal-real-time */
|
||||
LVAL xruntime (void) { return cvfixnum ((FIXTYPE)run_tick_count()); } /* get-internal-run-time */
|
||||
LVAL xtime (void) { return cvfixnum ((FIXTYPE)real_tick_count()); } /* time */
|
||||
|
||||
/* get an integer parameter */
|
||||
LOCAL int getNumber () {
|
||||
LVAL num = xlgafixnum ();
|
||||
return ((int) getfixnum (num));
|
||||
}
|
||||
|
||||
/* handle commands that require integer arguments */
|
||||
LOCAL LVAL GrafCmd (char funct, int nArgs) {
|
||||
short x, y, z;
|
||||
if (nArgs > 0) x = getNumber ();
|
||||
if (nArgs > 1) y = getNumber ();
|
||||
if (nArgs > 2) z = getNumber ();
|
||||
xllastarg ();
|
||||
SetPort (gGraphicsWin);
|
||||
switch (funct) {
|
||||
case 'G': ShowGrafWin (); break;
|
||||
case 'g': HideGrafWin (); break;
|
||||
case 'x': EraseRect (&gGraphicsWin->portRect); break;
|
||||
case 's': ShowPen (); break;
|
||||
case 'h': HidePen (); break;
|
||||
case 'd': PenMode (x); break;
|
||||
case 'M': Move (x, y); break;
|
||||
case 'm': MoveTo (x, y); break;
|
||||
case 'L': Line (x, y); break;
|
||||
case 'l': LineTo (x, y); break;
|
||||
case 'S': PenSize (x, y); break;
|
||||
case 'p': PenNormal (); break;
|
||||
case 'c':
|
||||
if (hasColorQD) {
|
||||
RGBColor col; col.red = x; col.green = y; col.blue = z;
|
||||
RGBForeColor (&col);
|
||||
} break;
|
||||
}
|
||||
SetPort (gCommandWin);
|
||||
return NIL;
|
||||
}
|
||||
|
||||
LVAL xshowgraphics (void) { return GrafCmd ('G', 0); } /* show graphics win */
|
||||
LVAL xhidegraphics (void) { return GrafCmd ('g', 0); } /* hide graphics win */
|
||||
LVAL xcleargraphics (void) { return GrafCmd ('x', 0); } /* clear graphics win */
|
||||
LVAL xshowpen (void) { return GrafCmd ('s', 0); } /* show the pen */
|
||||
LVAL xhidepen (void) { return GrafCmd ('h', 0); } /* hide the pen */
|
||||
LVAL xpenmode (void) { return GrafCmd ('d', 1); } /* set the pen mode */
|
||||
LVAL xmove (void) { return GrafCmd ('M', 2); } /* move pen in a specified direction */
|
||||
LVAL xmoveto (void) { return GrafCmd ('m', 2); } /* move pen to a screen location */
|
||||
LVAL xdraw (void) { return GrafCmd ('L', 2); } /* draw a line in a specified direction */
|
||||
LVAL xdrawto (void) { return GrafCmd ('l', 2); } /* draw a line to a screen location */
|
||||
LVAL xpensize (void) { return GrafCmd ('S', 2); } /* set the pen size */
|
||||
LVAL xpennormal (void) { return GrafCmd ('p', 0); } /* set the pen to normal */
|
||||
LVAL xcolor (void) { return GrafCmd ('c', 3); } /* set RGB color of pen */
|
||||
|
||||
|
||||
LVAL xgetpen (void) { /* get the pen position */
|
||||
LVAL val;
|
||||
Point p;
|
||||
xllastarg ();
|
||||
SetPort ((GrafPtr)gGraphicsWin);
|
||||
GetPen (&p);
|
||||
SetPort (gCommandWin);
|
||||
xlsave1 (val);
|
||||
val = consa (NIL);
|
||||
rplaca (val,cvfixnum ((FIXTYPE)p.h));
|
||||
rplacd (val,cvfixnum ((FIXTYPE)p.v));
|
||||
xlpop ();
|
||||
return val;
|
||||
}
|
||||
|
||||
LVAL xpenpat (void) { /* set the pen pattern */
|
||||
LVAL plist;
|
||||
Pattern pat;
|
||||
int i;
|
||||
plist = xlgalist ();
|
||||
xllastarg ();
|
||||
for (i = 0; i < 8 && consp (plist); ++i, plist = cdr (plist))
|
||||
// if (fixp (car (plist))) pat[i] = getfixnum (car (plist));
|
||||
SetPort ((GrafPtr)gGraphicsWin);
|
||||
PenPat (&pat);
|
||||
SetPort (gCommandWin);
|
||||
return NIL;
|
||||
}
|
||||
|
||||
|
||||
/* The functions below are not yet implemented. */
|
||||
|
||||
LVAL xtool (void) { /* call the toolbox */
|
||||
int trap = getNumber ();
|
||||
LVAL val;
|
||||
|
||||
/* asm {
|
||||
move.l args(A6),D0
|
||||
beq L2
|
||||
L1: move.l D0,A0
|
||||
move.l 2(A0),A1
|
||||
move.w 4(A1),-(A7)
|
||||
move.l 6(A0),D0
|
||||
bne L1
|
||||
L2: lea L3,A0
|
||||
move.w trap(A6),(A0)
|
||||
L3: dc.w 0xA000
|
||||
clr.l val(A6)
|
||||
}
|
||||
|
||||
return val; */
|
||||
return cvfixnum ((FIXTYPE) trap);
|
||||
}
|
||||
|
||||
LVAL xtool16 (void) { /* call the toolbox with a 16 bit result */
|
||||
int trap = getNumber ();
|
||||
int val;
|
||||
|
||||
/* asm {
|
||||
clr.w -(A7)
|
||||
move.l args(A6), D0
|
||||
beq L2
|
||||
L1: move.l D0, A0
|
||||
move.l 2(A0), A1
|
||||
move.w 4(A1), -(A7)
|
||||
move.l 6(A0), D0
|
||||
bne L1
|
||||
L2: lea L3, A0
|
||||
move.w trap(A6), (A0)
|
||||
L3: dc.w 0xA000
|
||||
move.w (A7)+, val(A6)
|
||||
}
|
||||
|
||||
return cvfixnum ((FIXTYPE) val); */
|
||||
return cvfixnum ((FIXTYPE) trap);
|
||||
}
|
||||
|
||||
LVAL xtool32 (void) { /* call the toolbox with a 32 bit result */
|
||||
int trap = getNumber ();
|
||||
long val;
|
||||
|
||||
/* asm {
|
||||
clr.l -(A7)
|
||||
move.l args(A6),D0
|
||||
beq L2
|
||||
L1: move.l D0,A0
|
||||
move.l 2(A0),A1
|
||||
move.w 4(A1),-(A7)
|
||||
move.l 6(A0),D0
|
||||
bne L1
|
||||
L2: lea L3,A0
|
||||
move.w trap(A6),(A0)
|
||||
L3: dc.w 0xA000
|
||||
move.l (A7)+,val(A6)
|
||||
}
|
||||
|
||||
return cvfixnum ((FIXTYPE) val); */
|
||||
return cvfixnum ((FIXTYPE) trap);
|
||||
}
|
||||
|
||||
LVAL xnewhandle (void) { /* allocate a new handle */
|
||||
LVAL num = xlgafixnum ();
|
||||
long size = getfixnum (num);
|
||||
xllastarg ();
|
||||
return cvfixnum ((FIXTYPE) NewHandle (size));
|
||||
}
|
||||
|
||||
LVAL xnewptr (void) { /* allocate memory */
|
||||
LVAL num = xlgafixnum ();
|
||||
long size = getfixnum (num);
|
||||
xllastarg ();
|
||||
return cvfixnum ((FIXTYPE) NewPtr (size));
|
||||
}
|
||||
|
||||
LVAL xhiword (void) { /* return the high order 16 bits of an integer */
|
||||
unsigned int val = (unsigned int) (getNumber () >> 16);
|
||||
xllastarg ();
|
||||
return cvfixnum ((FIXTYPE) val);
|
||||
}
|
||||
|
||||
LVAL xloword (void) { /* return the low order 16 bits of an integer */
|
||||
unsigned int val = (unsigned int) getNumber ();
|
||||
xllastarg ();
|
||||
return cvfixnum ((FIXTYPE) val);
|
||||
}
|
||||
|
||||
LVAL xrdnohang (void) { /* get the next character in the look-ahead buffer */
|
||||
int ch = 0;
|
||||
xllastarg ();
|
||||
/* if ((ch = scrnextc ()) == EOF) return NIL; */
|
||||
return cvfixnum ((FIXTYPE) ch);
|
||||
}
|
||||
|
||||
void ossymbols (void) { /* ossymbols - enter important symbols */
|
||||
LVAL sym;
|
||||
|
||||
/* setup globals for the window handles */
|
||||
sym = xlenter ("*COMMAND-WINDOW*");
|
||||
setvalue (sym, cvfixnum ((FIXTYPE) gCommandWin));
|
||||
sym = xlenter ("*GRAPHICS-WINDOW*");
|
||||
setvalue (sym, cvfixnum ((FIXTYPE) gGraphicsWin));
|
||||
}
|
||||
|
||||
void xoserror (char *msg) { /* do nothing */ }
|
||||
|
||||
LVAL xsystem (V) { return NIL; }
|
||||
LVAL xgetkey (V) { return NIL; }
|
||||
521
lib-src/libnyquist/nyquist/sys/mac/macint.c
Normal file
521
lib-src/libnyquist/nyquist/sys/mac/macint.c
Normal file
@@ -0,0 +1,521 @@
|
||||
/* 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);
|
||||
}
|
||||
166
lib-src/libnyquist/nyquist/sys/mac/macint.h
Normal file
166
lib-src/libnyquist/nyquist/sys/mac/macint.h
Normal file
@@ -0,0 +1,166 @@
|
||||
#define INT_MAX +32767
|
||||
|
||||
#define INT_MIN -32767
|
||||
|
||||
/* resource id's */
|
||||
|
||||
#define CWINRES 400
|
||||
|
||||
#define GWINRES 401
|
||||
|
||||
#define MBAR_RES 400
|
||||
|
||||
#define APPLE_MENU_RES 400
|
||||
|
||||
#define FILE_MENU_RES 401
|
||||
|
||||
#define EDIT_MENU_RES 402
|
||||
|
||||
#define CONTROL_MENU_RES 403
|
||||
|
||||
#define STRINGS_RES 400
|
||||
|
||||
|
||||
|
||||
/* Apple menu */
|
||||
|
||||
#define ABOUT_ITEM 1
|
||||
|
||||
#define ABOUT_BOX 400
|
||||
|
||||
#define ABOUT_PICT 400
|
||||
|
||||
|
||||
|
||||
/* File menu */
|
||||
|
||||
#define LOAD 1
|
||||
|
||||
#define LOAD_NOISILY 2
|
||||
|
||||
#define QUIT 4
|
||||
|
||||
|
||||
|
||||
/* Edit menu */
|
||||
|
||||
#define UNDO 1
|
||||
|
||||
#define CUT 3
|
||||
|
||||
#define COPY 4
|
||||
|
||||
#define PASTE 5
|
||||
|
||||
#define CLEAR 6
|
||||
|
||||
|
||||
|
||||
/* Control menu */
|
||||
|
||||
#define BREAK 1
|
||||
|
||||
#define CONTINUE 2
|
||||
|
||||
#define CLEAN_UP 3
|
||||
|
||||
#define CANCEL_INPUT 4
|
||||
|
||||
#define TOP_LEVEL 5
|
||||
|
||||
#define SHOW_GRAPHICS 7
|
||||
|
||||
#define SPLIT_SCREEN 8
|
||||
|
||||
|
||||
|
||||
/* window sizing/dragging stuff */
|
||||
|
||||
#define DRAG_THRESHOLD 8
|
||||
|
||||
#define MIN_WIN_HEIGHT 80
|
||||
|
||||
#define MIN_WIN_WIDTH 120
|
||||
|
||||
|
||||
|
||||
#define MAX_BUF 250 /* max chars in output buffer */
|
||||
|
||||
#define SCROLLBACK_THRESHHOLD 30000 /* max chars kept in window */
|
||||
|
||||
#define DELETE_BLOCK 10000 /* how many chars to delete when threshhold reached */
|
||||
|
||||
|
||||
|
||||
#define LINEHEIGHT 11 /* height in pixels of 9-point Geneva, the font used */
|
||||
|
||||
#define STACKMIN 400000 /* amout of memory for application stack */
|
||||
|
||||
#define MASTERS 3 /* arbitrary -- how many times to call MoreMasters() */
|
||||
|
||||
|
||||
|
||||
/* key codes */
|
||||
|
||||
#define RETURN 0x0d
|
||||
|
||||
#define ENTER 0x03
|
||||
|
||||
#define DELETE 0x08
|
||||
|
||||
#define FWDDEL 0x7F
|
||||
|
||||
#define CLRKEY 0x1b
|
||||
|
||||
#define PAGEUP 0x0b
|
||||
|
||||
#define PAGEDN 0x0c
|
||||
|
||||
#define HOMEKEY 0x01
|
||||
|
||||
#define ENDKEY 0x04
|
||||
|
||||
#define HELPKEY 0x05
|
||||
|
||||
#define FNKEY 0x10
|
||||
|
||||
#define LEFTARROW 0x1c
|
||||
|
||||
#define RIGHTARROW 0x1d
|
||||
|
||||
#define UPARROW 0x1e
|
||||
|
||||
#define DOWNARROW 0x1f
|
||||
|
||||
#define DBLQUOTE '\"'
|
||||
|
||||
|
||||
|
||||
/* useful definitions */
|
||||
|
||||
#define MBAR_HEIGHT 20
|
||||
|
||||
#define TITLEBAR_HEIGHT 20
|
||||
|
||||
#define SCROLLER_WIDTH 15
|
||||
|
||||
#define SCREEN_MARGIN 2
|
||||
|
||||
#define TEXT_MARGIN 4
|
||||
|
||||
#define GRAFWIN_HEIGHT 232
|
||||
|
||||
void AdjustMenus(void);
|
||||
|
||||
void DoMenu(long choice);
|
||||
|
||||
void HideGrafWin(void);
|
||||
|
||||
void DoContent(EventRecord *theEvent);
|
||||
|
||||
void InitMac(void);
|
||||
|
||||
void MacWrapUp(void);
|
||||
|
||||
|
||||
void DoEvent (void);
|
||||
52
lib-src/libnyquist/nyquist/sys/mac/macptrs.h
Normal file
52
lib-src/libnyquist/nyquist/sys/mac/macptrs.h
Normal file
@@ -0,0 +1,52 @@
|
||||
{ "HIDEPEN", S, xhidepen }, /* 300 */
|
||||
|
||||
{ "SHOWPEN", S, xshowpen }, /* 301 */
|
||||
|
||||
{ "GETPEN", S, xgetpen }, /* 302 */
|
||||
|
||||
{ "PENSIZE", S, xpensize }, /* 303 */
|
||||
|
||||
{ "PENMODE", S, xpenmode }, /* 304 */
|
||||
|
||||
{ "PENPAT", S, xpenpat }, /* 305 */
|
||||
|
||||
{ "PENNORMAL", S, xpennormal }, /* 306 */
|
||||
|
||||
{ "MOVETO", S, xmoveto }, /* 307 */
|
||||
|
||||
{ "MOVE", S, xmove }, /* 308 */
|
||||
|
||||
{ "LINETO", S, xdrawto }, /* 309 */
|
||||
|
||||
{ "LINE", S, xdraw }, /* 310 */
|
||||
|
||||
{ "SHOW-GRAPHICS", S, xshowgraphics }, /* 311 */
|
||||
|
||||
{ "HIDE-GRAPHICS", S, xhidegraphics }, /* 312 */
|
||||
|
||||
{ "CLEAR-GRAPHICS", S, xcleargraphics }, /* 313 */
|
||||
|
||||
{ "TOOLBOX", S, xtool }, /* 314 */
|
||||
|
||||
{ "TOOLBOX-16", S, xtool16 }, /* 315 */
|
||||
|
||||
{ "TOOLBOX-32", S, xtool32 }, /* 316 */
|
||||
|
||||
{ "NEWHANDLE", S, xnewhandle }, /* 317 */
|
||||
|
||||
{ "NEWPTR", S, xnewptr }, /* 318 */
|
||||
|
||||
{ "HIWORD", S, xhiword }, /* 319 */
|
||||
|
||||
{ "LOWORD", S, xloword }, /* 320 */
|
||||
|
||||
{ "READ-CHAR-NO-HANG", S, xrdnohang }, /* 321 */
|
||||
|
||||
|
||||
|
||||
/* not implemented - take a look at code in directory "sys:mac:old" */
|
||||
|
||||
/*{ "COMMAND-POINT-SIZE", S, xptsize }, 322 */
|
||||
|
||||
|
||||
|
||||
229
lib-src/libnyquist/nyquist/sys/mac/macstuff.c
Normal file
229
lib-src/libnyquist/nyquist/sys/mac/macstuff.c
Normal file
@@ -0,0 +1,229 @@
|
||||
/* macstuff.c - macintosh interface routines for xlisp */
|
||||
/* Written by Brian Kendig. */
|
||||
/* This file contains the stuff that the other xlisp files call directly. */
|
||||
|
||||
#include "cext.h"
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <QuickDraw.h> /* for Random */
|
||||
#include <Memory.h> /* for DisposePtr */
|
||||
#include <SegLoad.h> /* for ExitToShell */
|
||||
#include "xlisp.h"
|
||||
#include <string.h>
|
||||
#include "macint.h"
|
||||
#include "MacCommandWin.h"
|
||||
#define DELETE 0x08
|
||||
|
||||
/* externals */
|
||||
extern FILE *tfp; /* transcript file pointer */
|
||||
extern int cursorPos;
|
||||
extern char *macgets (void);
|
||||
|
||||
/* local variables */
|
||||
int lposition;
|
||||
static char *linebuf = NULL, *lineptr;
|
||||
static int numChars;
|
||||
|
||||
/* system-dependent variable definitions */
|
||||
static const char os_pathchar = ':';
|
||||
static const char os_sepchar = ',';
|
||||
|
||||
|
||||
int isascii (char c) { return 1; } /* every char is an ascii char, isn't it? */
|
||||
|
||||
void osinit (char *banner) {
|
||||
#ifdef SAFE_NYQUIST
|
||||
SAFE_NYQUIST is not supported in macstuff.c
|
||||
#endif
|
||||
int i;
|
||||
char version[] = "\nMacintosh interface by Brian Kendig, Erik A. Dahl, and Dominic Mazzoni.\n";
|
||||
InitMac (); /* initialize the mac interface routines */
|
||||
lposition = 0; /* initialize the line editor */
|
||||
for (i = 0; banner[i] != '\0'; i++) macputc (banner[i]);
|
||||
for (i = 0; version[i] != '\0'; i++) macputc (version[i]);
|
||||
}
|
||||
|
||||
FILE *osaopen (char *name, char *mode) {
|
||||
return fopen (name, mode);
|
||||
}
|
||||
|
||||
FILE *osbopen (char *name, char *mode) {
|
||||
FILE *f;
|
||||
char nmode[4];
|
||||
strcpy (nmode, mode); strcat (nmode, "b");
|
||||
f = fopen(name, nmode);
|
||||
return f;
|
||||
}
|
||||
|
||||
int osclose (FILE *fp) { return (fclose (fp)); }
|
||||
int osaputc (int ch, FILE *fp) { return (putc (ch, fp)); }
|
||||
int osbputc (int ch, FILE *fp) { return (putc (ch, fp)); }
|
||||
|
||||
/* osagetc - get a character from an ascii file */
|
||||
int osagetc(fp)
|
||||
FILE *fp;
|
||||
{
|
||||
return (getc(fp));
|
||||
}
|
||||
|
||||
int ostgetc (void) {
|
||||
int i;
|
||||
|
||||
if (numChars <= 0) { /* get some more */
|
||||
if (linebuf) DisposePtr (linebuf);
|
||||
linebuf = macgets ();
|
||||
i = 0;
|
||||
while (linebuf[i] != '\0') i++;
|
||||
numChars = i;
|
||||
if (tfp) for (i = 0; i < numChars; i++) osaputc (linebuf[i], tfp);
|
||||
lineptr = linebuf;
|
||||
}
|
||||
numChars--;
|
||||
if (*lineptr == '\r') {
|
||||
lineptr++;
|
||||
return '\n';
|
||||
} else return (*lineptr++);
|
||||
}
|
||||
|
||||
void ostputc (int ch) {
|
||||
macputc (ch);
|
||||
if (tfp) osaputc (ch, tfp);
|
||||
}
|
||||
|
||||
void osflush (void) {
|
||||
lineptr = linebuf;
|
||||
numChars = 0;
|
||||
lposition = 0;
|
||||
}
|
||||
|
||||
void oscheck (void) { DoEvent (); }
|
||||
|
||||
void oserror (char *msg) {
|
||||
char line[100], *p;
|
||||
sprintf (line,"error: %s\n",msg);
|
||||
for (p = line; *p != '\0'; ++p) ostputc (*p);
|
||||
}
|
||||
|
||||
void osfinish(void) {
|
||||
/* dispose of everything... */
|
||||
if (linebuf) DisposePtr(linebuf);
|
||||
portaudio_exit();
|
||||
MacWrapUp ();
|
||||
ExitToShell ();
|
||||
}
|
||||
|
||||
#define GPRINTF_MESSAGE_LEN 500
|
||||
|
||||
/* nyquist_printf -- system independent version of printf */
|
||||
/*
|
||||
* this function prints to console like printf, but using GUI
|
||||
* rather than stdio when appropriate.
|
||||
*
|
||||
*/
|
||||
void nyquist_printf(char *format, ...)
|
||||
{
|
||||
char temp[GPRINTF_MESSAGE_LEN];
|
||||
va_list pvar;
|
||||
char *p = temp;
|
||||
va_start(pvar, format);
|
||||
vsnprintf(temp, GPRINTF_MESSAGE_LEN, format, pvar);
|
||||
va_end(pvar);
|
||||
while (*p) ostputc(*p++);
|
||||
}
|
||||
|
||||
int renamebackup (char *filename) { return 0; }
|
||||
|
||||
static FSSpec prefsFSSpec;
|
||||
static int need_preferences_file = false;
|
||||
static char xlisp_path[1024]; /* cache for the path */
|
||||
static int valid_xlisp_path = false;
|
||||
|
||||
/* xsetupconsole -- used to configure window in Win32 version */
|
||||
LVAL xsetupconsole() { return NIL; }
|
||||
|
||||
|
||||
/* this should really be in a header for MacFileUtils.c */
|
||||
void GetFullPath(FSSpec *theSpec, StringPtr theName);
|
||||
|
||||
|
||||
void get_xlisp_path(char *p, long p_max, int *prefs_found)
|
||||
{
|
||||
Str63 fileName = "\pXLisp Preferences";
|
||||
SInt16 foundPrefVRefNum = 0;
|
||||
SInt32 foundPrefDirID = 0;
|
||||
OSErr err = noErr;
|
||||
*p = 0; /* initialize to empty string */
|
||||
*prefs_found = false;
|
||||
/* if we find path in the cache, copy and return */
|
||||
if (valid_xlisp_path) {
|
||||
*prefs_found = true;
|
||||
strcpy(p, xlisp_path + 10); /* remember, path has XLISPPATH= at head */
|
||||
return;
|
||||
}
|
||||
/* if we've been here before, do not try opening again */
|
||||
if (need_preferences_file) return;
|
||||
err = FindFolder(kOnSystemDisk, kPreferencesFolderType,
|
||||
kDontCreateFolder, &foundPrefVRefNum,
|
||||
&foundPrefDirID);
|
||||
if (err == noErr) {
|
||||
err = FSMakeFSSpec(foundPrefVRefNum, foundPrefDirID,
|
||||
fileName, &prefsFSSpec);
|
||||
*prefs_found = (err == noErr);
|
||||
need_preferences_file = !*prefs_found;
|
||||
}
|
||||
if (*prefs_found) {
|
||||
FILE *pf;
|
||||
GetFullPath(&prefsFSSpec, (StringPtr) xlisp_path);
|
||||
P2CStr((StringPtr) xlisp_path);
|
||||
pf = fopen(xlisp_path, "r");
|
||||
if (!pf) {
|
||||
return; /* problem opening the path */
|
||||
}
|
||||
while (fgets(xlisp_path, 1023, pf)) {
|
||||
if (strncmp(xlisp_path, "XLISPPATH=", 10) == 0) {
|
||||
valid_xlisp_path = true;
|
||||
xlisp_path[strlen(xlisp_path) - 1] = 0; /* trim newline */
|
||||
strcpy(p, xlisp_path + 10);
|
||||
break;
|
||||
}
|
||||
}
|
||||
fclose(pf);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* this is called when we load a file -- if need_preference_file,
|
||||
* we will build a preference file and insert the path of the file
|
||||
* we just opened, assuming it will tell us where to find init.lsp
|
||||
*/
|
||||
void setup_preferences(char *filename)
|
||||
{
|
||||
if (need_preferences_file) {
|
||||
unsigned char prefname[256];
|
||||
FILE *pf;
|
||||
char *cp;
|
||||
int len = 0;
|
||||
GetFullPath(&prefsFSSpec, prefname);
|
||||
need_preferences_file = false;
|
||||
P2CStr(prefname);
|
||||
/* we expect file-not-found error, path is valid */
|
||||
pf = fopen((char *) prefname, "w");
|
||||
if (pf == NULL) return;
|
||||
cp = strrchr((char *) filename, ':');
|
||||
if (cp == NULL) return;
|
||||
cp[1] = 0;
|
||||
/* now, filename is the path. If filename ends in runtime, this
|
||||
* is probably the standard nyquist runtime folder. We should put
|
||||
* the nyquist lib folder on the path too.
|
||||
*/
|
||||
len = cp + 1 - filename;
|
||||
if (len >= 9 &&
|
||||
strcmp(filename + len - 9, ":runtime:") == 0) {
|
||||
filename[len - 8] = 0;
|
||||
fprintf(pf, "XLISPPATH=%sruntime:,%slib:\n", filename, filename);
|
||||
} else {
|
||||
fprintf(pf, "XLISPPATH=%s\n", filename);
|
||||
}
|
||||
fclose(pf);
|
||||
}
|
||||
}
|
||||
7
lib-src/libnyquist/nyquist/sys/mac/macstuff.h
Normal file
7
lib-src/libnyquist/nyquist/sys/mac/macstuff.h
Normal file
@@ -0,0 +1,7 @@
|
||||
/* macstuff.h -- header for mac-specific functions */
|
||||
|
||||
void osfinish(void);
|
||||
/* put searchpath into p, prefs_found tells if preference file exists */
|
||||
void get_xlisp_path(char *p, long p_max, int *prefs_found);
|
||||
void setup_preferences(char *filename);
|
||||
|
||||
2
lib-src/libnyquist/nyquist/sys/mac/sndsystem.h
Normal file
2
lib-src/libnyquist/nyquist/sys/mac/sndsystem.h
Normal file
@@ -0,0 +1,2 @@
|
||||
#include "sndmac.h"
|
||||
|
||||
58
lib-src/libnyquist/nyquist/sys/mac/switches.h
Normal file
58
lib-src/libnyquist/nyquist/sys/mac/switches.h
Normal file
@@ -0,0 +1,58 @@
|
||||
/* switches.h for Macintosh */
|
||||
|
||||
/* CHANGE LOG
|
||||
* --------------------------------------------------------------------
|
||||
* 28Apr03 dm major reorganization of conditional compilation in Nyquist
|
||||
*/
|
||||
|
||||
|
||||
#define HAS_STDLIB_H 1
|
||||
#undef HAS_SYS_TYPES_H
|
||||
#undef HAS_SYS_STAT_H
|
||||
#define HAS_STAT_H 1
|
||||
#undef HAS_MALLOC_H
|
||||
|
||||
#define HAS_GETTIMEOFDAY 1
|
||||
|
||||
#undef READ_LINE
|
||||
|
||||
#define XL_BIG_ENDIAN 1
|
||||
#undef XL_LITTLE_ENDIAN
|
||||
|
||||
#define USE_RAND 1
|
||||
#undef USE_RANDOM
|
||||
|
||||
/* define this to be printf, or define your own fn of the form
|
||||
void nyquist_printf(char *format, ...);
|
||||
(for a GUI)
|
||||
*/
|
||||
void nyquist_printf(char *format, ...);
|
||||
|
||||
#define NEED_ULONG 1
|
||||
#define NEED_USHORT 1
|
||||
#define NEED_BYTE 1
|
||||
|
||||
#define NEED_ROUND 1
|
||||
|
||||
#undef NEED_DEFINE_MALLOC
|
||||
|
||||
/* explicitly choose a platform */
|
||||
#undef UNIX
|
||||
#undef WINDOWS
|
||||
#undef MICROSOFT
|
||||
#undef DOS
|
||||
#define MACINTOSH 1
|
||||
|
||||
#define BUFFERED_SYNCHRONOUS_INPUT 1
|
||||
#define SPACE_FOR_PLAY 10000
|
||||
#define MAX_CHANNELS 16
|
||||
|
||||
/* this will enable code to read midi files, etc. */
|
||||
#define CMTSTUFF 1
|
||||
|
||||
/* NYQUIST tells some CMT code that we're really in
|
||||
* XLISP and NYQUIST
|
||||
*/
|
||||
#define NYQUIST 1
|
||||
|
||||
#include "swlogic.h"
|
||||
107
lib-src/libnyquist/nyquist/sys/mac/system.lsp
Normal file
107
lib-src/libnyquist/nyquist/sys/mac/system.lsp
Normal file
@@ -0,0 +1,107 @@
|
||||
; system.lsp -- machine/system-dependent definitions
|
||||
; Macintosh
|
||||
|
||||
(setf ny:bigendianp t)
|
||||
|
||||
;; note that *default-sf-format* is used below by
|
||||
;; compute-default-sound-file
|
||||
(if (not (boundp '*default-sf-format*))
|
||||
(setf *default-sf-format* snd-head-AIFF))
|
||||
|
||||
;; note that compute-default-sound-file uses *default-sf-format*,
|
||||
;; so be sure to set *default-sf-format* first (this was just done)
|
||||
(if (not (boundp '*default-sound-file*))
|
||||
(compute-default-sound-file))
|
||||
|
||||
(if (not (boundp '*default-sf-dir*))
|
||||
(setf *default-sf-dir* ""))
|
||||
|
||||
(if (not (boundp '*default-sf-mode*))
|
||||
(setf *default-sf-mode* snd-mode-pcm))
|
||||
|
||||
(if (not (boundp '*default-sf-bits*))
|
||||
(setf *default-sf-bits* 16))
|
||||
|
||||
(if (not (boundp '*default-plot-file*))
|
||||
(setf *default-plot-file* "points.dat"))
|
||||
|
||||
; turn off switch to play sound as it is computed
|
||||
(setf *soundenable* T)
|
||||
|
||||
; local definition for play
|
||||
(defmacro play (expr)
|
||||
`(s-save-autonorm ,expr NY:ALL *default-sound-file* :play *soundenable*))
|
||||
|
||||
(defun r ()
|
||||
(s-save (s-read *default-sound-file*) NY:ALL "" :play t)
|
||||
)
|
||||
|
||||
; PLAY-FILE -- play a file
|
||||
(defun play-file (name)
|
||||
(s-save (s-read name) NY:ALL "" :play t))
|
||||
|
||||
; FULL-NAME-P -- test if file name is a full path or relative path
|
||||
;
|
||||
; (otherwise the *default-sf-dir* will be prepended
|
||||
;
|
||||
(defun full-name-p (filename)
|
||||
(eq (char filename 0) #\:))
|
||||
|
||||
(setf *file-separator* #\:)
|
||||
|
||||
; save the standard function to write points to a file
|
||||
;
|
||||
;(setfn s-plot-points s-plot)
|
||||
|
||||
(defun array-max-abs (points)
|
||||
(let ((m 0.0))
|
||||
(dotimes (i (length points))
|
||||
(setf m (max m (abs (aref points i)))))
|
||||
m))
|
||||
|
||||
(setf graph-width 800)
|
||||
(setf graph-height 220)
|
||||
|
||||
|
||||
(defun s-plot (snd &optional (n 800))
|
||||
(show-graphics)
|
||||
(clear-graphics)
|
||||
(cond ((soundp snd)
|
||||
(s-plot-2 snd n (/ graph-height 2) graph-height nil))
|
||||
(t
|
||||
(let ((gh (/ graph-height (length snd)))
|
||||
hs)
|
||||
(dotimes (i (length snd))
|
||||
(setf hs (s-plot-2 (aref snd i) n (+ (/ gh 2) (* i gh)) gh hs)))))))
|
||||
|
||||
|
||||
(defun s-plot-2 (snd n y-offset graph-height horizontal-scale)
|
||||
(prog ((points (snd-samples snd n))
|
||||
maxpoint horizontal-scale vertical-scale)
|
||||
(setf maxpoint (array-max-abs points))
|
||||
(moveto 0 y-offset)
|
||||
(lineto graph-width y-offset)
|
||||
(moveto 0 y-offset)
|
||||
(cond ((null horizontal-scale)
|
||||
(setf horizontal-scale (/ (float graph-width) (length points)))))
|
||||
(setf vertical-scale (- (/ (float graph-height) 2 maxpoint)))
|
||||
(dotimes (i (length points))
|
||||
(lineto (truncate (* horizontal-scale i))
|
||||
(+ y-offset (truncate (* vertical-scale (aref points i))))))
|
||||
(format t "X Axis: ~A to ~A (seconds)\n" (snd-t0 snd) (/ (length points) (snd-srate snd)))
|
||||
(format t "Y Axis: ~A to ~A\n" (- maxpoint) maxpoint)
|
||||
(format t "~A samples plotted.\n" (length points))
|
||||
(return horizontal-scale)
|
||||
))
|
||||
|
||||
|
||||
|
||||
|
||||
; S-EDIT - run the audio editor on a sound
|
||||
;
|
||||
;(defmacro s-edit (&optional expr)
|
||||
; `(prog ()
|
||||
; (if ,expr (s-save ,expr 1000000000 *default-sound-file*))
|
||||
; (system (format nil "audio_editor ~A &"
|
||||
; (soundfilename *default-sound-file*)))))
|
||||
|
||||
1
lib-src/libnyquist/nyquist/sys/mac/xlextstart.c
Normal file
1
lib-src/libnyquist/nyquist/sys/mac/xlextstart.c
Normal file
@@ -0,0 +1 @@
|
||||
/* nothing to do */
|
||||
Reference in New Issue
Block a user