--- np2/macosx/np2.cpp 2003/10/25 16:07:34 1.20 +++ np2/macosx/np2.cpp 2003/11/06 01:58:36 1.31 @@ -30,16 +30,19 @@ #include "mousemng.h" #include "configure.h" #include "screenopt.h" +#include "soundopt.h" +#include "macnewdisk.h" +#include "fdefine.h" +#include "hid.h" +#include "midiopt.h" +#include "macalert.h" +#include "np2opening.h" +#include "toolwin.h" - +#include #define USE_RESUME #define NP2OPENING - -#ifdef NP2OPENING -#include // #define OPENING_WAIT 1500 -#endif - NP2OSCFG np2oscfg = {0, 2, 0, 0, 0, 0, 1, 0}; @@ -49,7 +52,7 @@ static UINT framecnt = 0; static UINT waitcnt = 0; static UINT framemax = 1; -static BYTE scrnmode; + BYTE scrnmode; #define DRAG_THRESHOLD 5 @@ -67,15 +70,12 @@ static const char np2resume[] = "sav"; // ---- おまじない -#if TARGET_CARBON #define AEProc(fn) NewAEEventHandlerUPP((AEEventHandlerProcPtr)(fn)) -#else -#define AEProc(fn) NewAEEventHandlerProc(fn) -#endif static void setUpCarbonEvent(void); +static bool setupMainWindow(void); +static void toggleFullscreen(void); -#ifdef TARGET_API_MAC_CARBON static pascal OSErr handleQuitApp(const AppleEvent *event, AppleEvent *reply, long refcon) { @@ -84,30 +84,42 @@ static pascal OSErr handleQuitApp(const (void)event, (void)reply, (void)refcon; return(noErr); } -#endif + +pascal OSErr OpenAppleEventHandler(const AppleEvent *event, AppleEvent *reply,long print) +{ + long i,ct,len; + FSSpec fsc,*pp; + DescType rtype; + AEKeyword key; + AEDescList dlist; + + if(!AEGetParamDesc(event,keyDirectObject,typeAEList,&dlist)) { + AECountItems( &dlist,&ct ); + for( i=1;i<=ct;i++ ) { + pp=&fsc; + if (!AEGetNthPtr( &dlist,i,typeFSS,&key,&rtype,(Ptr)pp,(long)sizeof(FSSpec),&len)) { + setDropFile(fsc, i-1); + } + } + AEDisposeDesc( &dlist ); + } + return( 0 ); +} + static void InitToolBox(void) { -#if !TARGET_CARBON - MaxApplZone(); - InitGraf(&qd.thePort); - InitFonts(); - InitWindows(); - InitMenus(); - TEInit(); - InitDialogs(0); -#endif FlushEvents(everyEvent, 0); InitCursor(); -#ifdef TARGET_API_MAC_CARBON AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, AEProc(handleQuitApp), 0L, false); -#endif + AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, + AEProc(OpenAppleEventHandler), 0L, false); } static void MenuBarInit(void) { -#if 0 +#if 1 Handle hMenu; MenuHandle happlemenu; @@ -125,26 +137,54 @@ static void MenuBarInit(void) { InsertMenu(GetMenu(IDM_KEYBOARD), -1); InsertMenu(GetMenu(IDM_SOUND), -1); InsertMenu(GetMenu(IDM_MEMORY), -1); + SetMenuItemModifiers(GetMenuRef(IDM_FDD2), IDM_FDD2OPEN, kMenuOptionModifier); + SetMenuItemModifiers(GetMenuRef(IDM_FDD2), IDM_FDD2EJECT, kMenuOptionModifier); + SetMenuItemModifiers(GetMenuRef(IDM_SASI2), IDM_SASI2OPEN, kMenuOptionModifier); DrawMenuBar(); -#endif +#else OSStatus err; IBNibRef nibRef; err = CreateNibReference(CFSTR("np2"), &nibRef); if (err!=noErr) return; err = SetMenuBarFromNib(nibRef, CFSTR("MainMenu")); DisposeNibReference(nibRef); +#endif } static void changescreen(BYTE mode) { - (void)mode; + BYTE change; + BYTE renewal; + + change = scrnmode ^ mode; + renewal = (change & SCRNMODE_FULLSCREEN); + if (mode & SCRNMODE_FULLSCREEN) { + renewal |= (change & SCRNMODE_HIGHCOLOR); + } + else { + renewal |= (change & SCRNMODE_ROTATEMASK); + } + if (renewal) { + soundmng_stop(); + mouse_running(MOUSE_STOP); + scrnmng_destroy(); + if (scrnmng_create(mode) == SUCCESS) { + scrnmode = mode; + } + scrndraw_redraw(); + mouse_running(MOUSE_CONT); + soundmng_play(); + } + else { + scrnmode = mode; + } } static void HandleMenuChoice(long wParam) { UINT update; - Str255 applname; + soundmng_stop(); update = 0; switch(wParam) { case IDM_ABOUT: @@ -152,25 +192,24 @@ static void HandleMenuChoice(long wParam break; case IDM_RESET: - pccore_cfgupdate(); - pccore_reset(); + if (ResetWarningDialogProc()) { + pccore_cfgupdate(); + pccore_reset(); + } break; case IDM_CONFIGURE: initConfig(); break; -#if 0 - case IDM_NEWFDD: - newdisk(); + case IDM_NEWDISK: + newdisk(); break; -#endif #if 0 case IDM_NEWHDD: newhdddisk(); break; #endif - case IDM_FONT: dialog_font(); break; @@ -185,6 +224,7 @@ static void HandleMenuChoice(long wParam case IDM_FDD1EJECT: diskdrv_setfdd(0, NULL, 0); + toolwin_setfdd(0, NULL); break; case IDM_FDD2OPEN: @@ -193,6 +233,7 @@ static void HandleMenuChoice(long wParam case IDM_FDD2EJECT: diskdrv_setfdd(1, NULL, 0); + toolwin_setfdd(1, NULL); break; case IDM_SASI1OPEN: @@ -211,6 +252,10 @@ static void HandleMenuChoice(long wParam diskdrv_sethdd(1, NULL); break; + case IDM_FULLSCREEN: + toggleFullscreen(); + break; + case IDM_ROLNORMAL: menu_setrotate(0); changescreen(scrnmode & (~SCRNMODE_ROTATEMASK)); @@ -268,7 +313,6 @@ static void HandleMenuChoice(long wParam update |= SYS_UPDATECFG; break; -#if defined(NP2GCC) case IDM_SCREENOPT: initScreenOpt(); break; @@ -278,7 +322,20 @@ static void HandleMenuChoice(long wParam menu_setmouse(np2oscfg.MOUSE_SW ^ 1); sysmng_update(SYS_UPDATECFG); break; -#endif + + case IDM_MIDIOPT: + initMidiOpt(); + break; + + case IDM_MIDIPANIC: + rs232c_midipanic(); + mpu98ii_midipanic(); + pc9861k_midipanic(); + break; + + case IDM_SNDOPT: + initSoundOpt(); + break; case IDM_KEY: menu_setkey(0); @@ -427,6 +484,14 @@ static void HandleMenuChoice(long wParam update |= SYS_UPDATECFG; break; + case IDM_BMPSAVE: + dialog_writebmp(); + break; + + case IDM_S98LOGGING: + dialog_s98(); + break; + case IDM_DISPCLOCK: menu_setdispclk(np2oscfg.DISPCLK ^ 1); update |= SYS_UPDATECFG; @@ -447,134 +512,57 @@ static void HandleMenuChoice(long wParam update |= SYS_UPDATECFG; break; + case IDM_MSRAPID: + menu_setmsrapid(np2cfg.MOUSERAPID ^ 1); + update |= SYS_UPDATECFG; + break; + case IDM_I286SAVE: debugsub_status(); break; + case IDM_RECORDING: + menu_setrecording(false); + break; + default: - if (HiWord(wParam) == IDM_APPLE) { - GetMenuItemText(GetMenuHandle(IDM_APPLE), - LoWord(wParam), applname); -#if !TARGET_API_MAC_CARBON - (void)OpenDeskAcc(applname); -#endif - } break; } sysmng_update(update); HiliteMenu(0); } -#if 0 -static void HandleUpdateEvent(EventRecord *pevent) { - - WindowPtr hWnd; - - hWnd = (WindowPtr)pevent->message; - BeginUpdate(hWnd); - scrndraw_redraw(); - EndUpdate(hWnd); -} -#endif - static void HandleMouseDown(EventRecord *pevent) { WindowPtr hWnd; - Rect rDrag; soundmng_stop(); switch(FindWindow(pevent->where, &hWnd)) { case inMenuBar: HandleMenuChoice(MenuSelect(pevent->where)); break; - - case inDrag: -#if TARGET_API_MAC_CARBON - { - BitMap gscreenBits; - GetQDGlobalsScreenBits(&gscreenBits); - rDrag = gscreenBits.bounds; - InsetRect(&rDrag, DRAG_THRESHOLD, DRAG_THRESHOLD); - DragWindow(hWnd, pevent->where, &rDrag); - } -#else - rDrag = qd.screenBits.bounds; - InsetRect(&rDrag, DRAG_THRESHOLD, DRAG_THRESHOLD); - DragWindow(hWnd, pevent->where, &rDrag); -#endif - break; - - case inContent: -#if defined(NP2GCC) - if (controlKey & GetCurrentKeyModifiers() ) { - mouse_btn(MOUSE_RIGHTDOWN); - } - else { - mouse_btn(MOUSE_LEFTDOWN); - } -#endif - break; - -#ifndef NP2GCC - case inGoAway: - if (TrackGoAway(hWnd, pevent->where)) { } - np2running = FALSE; - break; -#endif } - soundmng_play(); } -#if 0 -static void eventproc(EventRecord *event) { - - switch(event->what) { - case mouseDown: - HandleMouseDown(event); - break; - - case updateEvt: - HandleUpdateEvent(event); - break; - case keyDown: - case autoKey: - mackbd_f12down(((event->message) & keyCodeMask) >> 8); - if (event->modifiers & cmdKey) { - HandleMenuChoice(MenuKey(event->message & charCodeMask)); - } - break; +// ---- - case keyUp: - mackbd_f12up(((event->message) & keyCodeMask) >> 8); - break; +static void framereset(UINT waitcnt) { -#if defined(NP2GCC) - case mouseUp: - if (controlKey & GetCurrentKeyModifiers()) { - mouse_btn(MOUSE_RIGHTUP); - } - else { - mouse_btn(MOUSE_LEFTUP); - } - break; -#endif + framecnt = 0; + toolwin_draw((BYTE)waitcnt); + if (np2oscfg.DISPCLK & 3) { + if (sysmng_workclockrenewal()) { + sysmng_updatecaption(3); + } } } -#endif - -// ---- static void processwait(UINT waitcnt) { if (timing_getcount() >= waitcnt) { - framecnt = 0; timing_setcount(0); - if (np2oscfg.DISPCLK & 3) { - if (sysmng_workclockrenewal()) { - sysmng_updatecaption(3); - } - } + framereset(waitcnt); } } @@ -593,74 +581,40 @@ static void flagsave(const char *ext) { statsave_save(path); } +static void flagdelete(const char *ext) { + + char path[MAX_PATH]; + + getstatfilename(path, ext, sizeof(path)); + file_delete(path); +} + static void flagload(const char *ext) { char path[MAX_PATH]; char buf[1024]; - int ret; + int ret, r; + ret = IDOK; getstatfilename(path, ext, sizeof(path)); - ret = statsave_check(path, buf, sizeof(buf)); - if (ret == NP2FLAG_SUCCESS) { + r = statsave_check(path, buf, sizeof(buf)); + if (r & (~NP2FLAG_DISKCHG)) { + ResumeErrorDialogProc(); + ret = IDCANCEL; + } + else if (r & NP2FLAG_DISKCHG) { + ret = ResumeWarningDialogProc(buf); + } + if (ret == IDOK) { statsave_load(path); + toolwin_setfdd(0, fdd_diskname(0)); + toolwin_setfdd(1, fdd_diskname(1)); } + return; } -#ifdef NP2OPENING -static void openingNP2(void) { - Rect srt, bounds; - GrafPtr port; - CFURLRef openingURL; - CFStringRef path; - char buffer[1024]; - FSRef fsr; - FSSpec fsc; - PicHandle pict; - GraphicsImportComponent gi; - - GetPort(&port); - SetPortWindowPort(hWndMain); - const RGBColor col = {0, 0, 0}; - SetRect(&bounds, 0, 0, 640, 400); - RGBBackColor(&col); - EraseRect(&bounds); - - openingURL=CFURLCopyAbsoluteURL(CFBundleCopyResourcesDirectoryURL(CFBundleGetMainBundle())); - if (openingURL) { - path = CFURLCopyFileSystemPath(openingURL, kCFURLPOSIXPathStyle); - if (path) { - if (CFStringGetCString(path, buffer, 1024, CFStringGetSystemEncoding())) { - strcat(buffer, "/nekop2.bmp"); - FSPathMakeRef((const UInt8*)buffer, &fsr, NULL); - FSGetCatalogInfo(&fsr, kFSCatInfoNone, NULL, NULL, &fsc, NULL); - if (!GetGraphicsImporterForFile(&fsc, &gi)) { - if (!GraphicsImportGetNaturalBounds(gi, &srt)) { - OffsetRect( &srt, -srt.left, -srt.top); - GraphicsImportSetBoundsRect(gi, &srt); - GraphicsImportGetAsPicture(gi, &pict); - OffsetRect(&srt, (640-srt.right)/2, (400-srt.bottom)/2); - DrawPicture(pict,&srt); - QDFlushPortBuffer(GetWindowPort(hWndMain), NULL); - KillPicture(pict); - } - CloseComponent(gi); - } - } - if (path) CFRelease(path); - } - if (openingURL) CFRelease(openingURL); - } - SetPort(port); -} -#endif - - int main(int argc, char *argv[]) { - Rect wRect; -#if 0 - EventRecord event; -#endif EventRef theEvent; EventTargetRef theTarget; #ifdef OPENING_WAIT @@ -677,20 +631,12 @@ int main(int argc, char *argv[]) { initload(); TRACEINIT(); + + toolwin_readini(); + if (!(setupMainWindow())) { + return(0); + } - SetRect(&wRect, 100, 100, 100, 100); - hWndMain = NewWindow(0, &wRect, "\pNeko Project II", FALSE, - noGrowDocProc, (WindowPtr)-1, TRUE, 0); - if (!hWndMain) { - TRACETERM(); - macossub_term(); - dosio_term(); - return(0); - } - scrnmng_initialize(); - SizeWindow(hWndMain, 640, 400, TRUE); - setUpCarbonEvent(); - ShowWindow(hWndMain); #ifdef NP2OPENING openingNP2(); #endif @@ -728,6 +674,12 @@ int main(int argc, char *argv[]) { pccore_init(); S98_init(); + hid_init(); + if (soundmng_initialize() == SUCCESS) { + soundmng_pcmvolume(SOUND_PCMSEEK, np2cfg.MOTORVOL); + soundmng_pcmvolume(SOUND_PCMSEEK1, np2cfg.MOTORVOL); + } + #if defined(NP2GCC) if (np2oscfg.MOUSE_SW) { // ver0.30 mouse_running(MOUSE_ON); @@ -736,7 +688,6 @@ int main(int argc, char *argv[]) { #ifdef OPENING_WAIT while((GETTICK() - tick) < OPENING_WAIT); #endif - scrndraw_redraw(); pccore_reset(); #if defined(USE_RESUME) @@ -745,9 +696,6 @@ int main(int argc, char *argv[]) { } #endif -#if 0 - SetEventMask(everyEvent); -#endif theTarget = GetEventDispatcherTarget(); np2running = TRUE; @@ -757,16 +705,9 @@ int main(int argc, char *argv[]) { SendEventToEventTarget (theEvent, theTarget); ReleaseEvent(theEvent); } -#if 0 - if (WaitNextEvent(everyEvent, &event, 0, 0)) { - eventproc(&event); - } -#endif else { + soundmng_play(); if (np2oscfg.NOWAIT) { -#if 0 - mackbd_callback(); -#endif pccore_exec(framecnt == 0); if (np2oscfg.DRAW_SKIP) { // nowait frame skip framecnt++; @@ -783,9 +724,6 @@ int main(int argc, char *argv[]) { } else if (np2oscfg.DRAW_SKIP) { // frame skip if (framecnt < np2oscfg.DRAW_SKIP) { -#if 0 - mackbd_callback(); -#endif pccore_exec(framecnt == 0); framecnt++; } @@ -796,9 +734,6 @@ int main(int argc, char *argv[]) { else { // auto skip if (!waitcnt) { UINT cnt; -#if 0 - mackbd_callback(); -#endif pccore_exec(framecnt == 0); framecnt++; cnt = timing_getcount(); @@ -818,7 +753,7 @@ int main(int argc, char *argv[]) { else { timing_setcount(cnt - framecnt); } - processwait(0); + framereset(0); } } else { @@ -829,32 +764,44 @@ int main(int argc, char *argv[]) { } } np2running = FALSE; + menu_setrecording(true); + if (scrnmode & SCRNMODE_FULLSCREEN) { + toggleFullscreen(); + } + pccore_cfgupdate(); #if defined(USE_RESUME) if (np2oscfg.resume) { flagsave(np2resume); } + else { + flagdelete(np2resume); + } #endif pccore_term(); S98_trash(); + hid_clear(); #if defined(NP2GCC) mouse_running(MOUSE_OFF); #endif + soundmng_deinitialize(); scrnmng_destroy(); if (sys_updates & (SYS_UPDATECFG | SYS_UPDATEOSCFG)) { - initsave(); + initsave(); // np2.cfg create + toolwin_writeini(); // np2.cfg append } TRACETERM(); macossub_term(); dosio_term(); DisposeWindow(hWndMain); + toolwin_close(); (void)argc; (void)argv; @@ -959,10 +906,28 @@ static pascal OSStatus np2windowevent(Ev switch (eventClass) { - case kEventClassWindow: - if (whatHappened == kEventWindowClose) { - np2running = FALSE; - result = noErr; + case kEventClassWindow: + switch (whatHappened) + { + case kEventWindowClose: + np2running = FALSE; + result = noErr; + break; + case kEventWindowActivated: + DisableAllMenuItems(GetMenuHandle(IDM_EDIT)); + break; + case kEventWindowToolbarSwitchMode: + toolwin_open(); + break; + case kEventWindowDragStarted: + soundmng_stop(); + break; + case kEventWindowDragCompleted: + soundmng_play(); + break; + case kEventWindowShown: + scrndraw_redraw(); + break; } break; case kEventClassKeyboard: @@ -1027,6 +992,11 @@ static const EventTypeSpec appEventList[ static const EventTypeSpec windEventList[] = { {kEventClassWindow, kEventWindowClose}, + {kEventClassWindow, kEventWindowActivated}, + {kEventClassWindow, kEventWindowToolbarSwitchMode}, + {kEventClassWindow, kEventWindowDragStarted}, + {kEventClassWindow, kEventWindowDragCompleted}, + {kEventClassWindow, kEventWindowShown}, {kEventClassKeyboard, kEventRawKeyDown}, {kEventClassKeyboard, kEventRawKeyUp}, {kEventClassKeyboard, kEventRawKeyRepeat}, @@ -1043,5 +1013,77 @@ static void setUpCarbonEvent(void) { InstallWindowEventHandler(hWndMain, NewEventHandlerUPP(np2windowevent), GetEventTypeCount(windEventList), windEventList, 0, NULL); + InstallStandardEventHandler(GetWindowEventTarget(hWndMain)); +} + +static bool setupMainWindow(void) { +#if defined(NP2GCC) + OSStatus err; + IBNibRef nibRef; + + err = CreateNibReference(CFSTR("np2"), &nibRef); + if (err ==noErr ) { + CreateWindowFromNib(nibRef, CFSTR("MainWindow"), &hWndMain); + DisposeNibReference ( nibRef); + } + else { + return(false); + } + +#else + Rect wRect; + + SetRect(&wRect, 100, 100, 100, 100); + hWndMain = NewWindow(0, &wRect, "\pNeko Project II", FALSE, + noGrowDocProc, (WindowPtr)-1, TRUE, 0); + if (!hWndMain) { + TRACETERM(); + macossub_term(); + dosio_term(); + return(false); + } + SizeWindow(hWndMain, 640, 400, TRUE); +#endif + scrnmng_initialize(); + setUpCarbonEvent(); + ShowWindow(hWndMain); + return(true); +} + +static void toggleFullscreen(void) { + static Ptr bkfullscreen; + static BYTE mouse = 0; + + soundmng_stop(); + if (!scrnmode & SCRNMODE_FULLSCREEN) { + RGBColor col = {0, 0, 0}; + short w=640, h=480; + DisposeWindow(hWndMain); + BeginFullScreen(&bkfullscreen,0,&w,&h,&hWndMain,&col,(fullScreenAllowEvents | fullScreenDontChangeMenuBar)); + HideMenuBar(); + setUpCarbonEvent(); + if (!np2oscfg.MOUSE_SW) { + mouse = np2oscfg.MOUSE_SW; + mouse_running(MOUSE_ON); + menu_setmouse(1); + } + changescreen(scrnmode | SCRNMODE_FULLSCREEN); + } + else { + scrnmng_destroy(); + EndFullScreen(bkfullscreen, 0); + setupMainWindow(); + changescreen(scrnmode & (~SCRNMODE_FULLSCREEN)); + if (!mouse) { + mouse_running(MOUSE_OFF); + menu_setmouse(0); + } + ShowMenuBar(); + } + CheckMenuItem(GetMenuHandle(IDM_SCREEN), LoWord(IDM_FULLSCREEN), scrnmode & SCRNMODE_FULLSCREEN); + soundmng_play(); } +void recieveCommand(long param) { + HandleMenuChoice(param); +}