mirror of
https://github.com/cookiengineer/audacity
synced 2025-11-21 16:37:12 +01:00
Update Nyquist to v3.09.
This commit is contained in:
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);
|
||||
}
|
||||
Reference in New Issue
Block a user