--- np2/macosx/np2.cpp 2003/10/19 14:48:07 1.5 +++ np2/macosx/np2.cpp 2004/04/20 17:28:24 1.61 @@ -3,6 +3,7 @@ #include "strres.h" #include "np2.h" #include "dosio.h" +#include "commng.h" #include "scrnmng.h" #include "soundmng.h" #include "sysmng.h" @@ -25,27 +26,52 @@ #include "s98.h" #include "diskdrv.h" #include "fddfile.h" -#include "statsave.h" - -#if defined(NP2GCC) #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 "aboutdlg.h" +#include "keystat.h" +#include "subwind.h" + +#define NP2OPENING +// #define OPENING_WAIT 1500 + + + NP2OSCFG np2oscfg = {"Neko Project IIx", //titles + -1, //winx + -1, //winy + 0, //NOWAIT + 0, //DRAW_SKIP + 0, //DISPCLK + 0, //F11KEY + 0, //F12KEY + 0, //MOUSE_SW + 0, //JOYPAD1 + {5, 0, 0x3e, 19200, "", "", "GM", ""}, //mpu + 0, //confirm + 0, //resume + 1, //toolwin + 0, //jastsnd + 0, //I286SAVE +#ifdef SUPPORT_KEYDISP + 1, //keydisp #endif - -#define USE_RESUME - - -#if defined(NP2GCC) - NP2OSCFG np2oscfg = {0, 2, 0, 0, 0, 0}; -#else - NP2OSCFG np2oscfg = {0, 2, 0, 0, 0}; -#endif + }; WindowPtr hWndMain; BOOL np2running; static UINT framecnt = 0; static UINT waitcnt = 0; static UINT framemax = 1; -static BYTE scrnmode; + BYTE scrnmode = 0; #define DRAG_THRESHOLD 5 @@ -63,13 +89,12 @@ static const char np2resume[] = "sav"; // ---- おまじない -#if TARGET_CARBON #define AEProc(fn) NewAEEventHandlerUPP((AEEventHandlerProcPtr)(fn)) -#else -#define AEProc(fn) NewAEEventHandlerProc(fn) -#endif -#ifdef TARGET_API_MAC_CARBON +static void setUpCarbonEvent(void); +static bool setupMainWindow(void); +static void toggleFullscreen(void); + static pascal OSErr handleQuitApp(const AppleEvent *event, AppleEvent *reply, long refcon) { @@ -78,62 +103,146 @@ 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; + OSErr err = noErr; + + 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)) { + err = setDropFile(fsc, i-1); + } + } + AEDisposeDesc( &dlist ); + } + return(err); +} + 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 1 Handle hMenu; - MenuHandle happlemenu; hMenu = GetNewMBar(IDM_MAINMENU); if (!hMenu) { ExitToShell(); } SetMenuBar(hMenu); - happlemenu = GetMenuHandle(IDM_APPLE); - if (happlemenu) { - AppendResMenu(happlemenu, 'DRVR'); +#if !defined(SUPPORT_SCSI) + hmenu = GetMenuHandle(IDM_HDD); + if (hmenu) { + DeleteMenuItem(hmenu, 7); + DeleteMenuItem(hmenu, 6); + DeleteMenuItem(hmenu, 5); + DeleteMenuItem(hmenu, 4); + DeleteMenuItem(hmenu, 3); } +#endif InsertMenu(GetMenu(IDM_SASI1), -1); InsertMenu(GetMenu(IDM_SASI2), -1); +#if defined(SUPPORT_SCSI) + InsertMenu(GetMenu(IDM_SCSI0), -1); + InsertMenu(GetMenu(IDM_SCSI1), -1); + InsertMenu(GetMenu(IDM_SCSI2), -1); + InsertMenu(GetMenu(IDM_SCSI3), -1); +#endif InsertMenu(GetMenu(IDM_KEYBOARD), -1); InsertMenu(GetMenu(IDM_SOUND), -1); InsertMenu(GetMenu(IDM_MEMORY), -1); + ChangeMenuAttributes(GetMenuRef(IDM_EDIT), kMenuAttrAutoDisable, 0); + DisableAllMenuItems(GetMenuHandle(IDM_EDIT)); + SetMenuItemModifiers(GetMenuRef(IDM_FDD2), IDM_FDD2OPEN, kMenuShiftModifier); + SetMenuItemModifiers(GetMenuRef(IDM_FDD2), IDM_FDD2EJECT, kMenuShiftModifier); + SetMenuItemModifiers(GetMenuRef(IDM_SASI2), IDM_SASI2OPEN, kMenuShiftModifier); +#ifndef SUPPORT_KEYDISP + DisableMenuItem(GetMenuRef(IDM_OTHER), IDM_KEYDISP); +#endif +#ifndef SUPPORT_SOFTKBD + SetMenuItemTextWithCFString(GetMenuRef(IDM_OTHER), IDM_SOFTKBD, CFSTR("please wait for 0.80")); + DisableMenuItem(GetMenuRef(IDM_OTHER), IDM_SOFTKBD); +#endif + if (np2oscfg.I286SAVE) { + AppendMenuItemTextWithCFString(GetMenuRef(IDM_OTHER), CFCopyLocalizedString(CFSTR("i286 save"),"i286"), kMenuItemAttrIconDisabled, NULL,NULL); + } + + if (!(np2cfg.fddequip & 1)) { + DisableAllMenuItems(GetMenuRef(IDM_FDD1)); + } + if (!(np2cfg.fddequip & 2)) { + DisableAllMenuItems(GetMenuRef(IDM_FDD2)); + } +#if 0 +//Later... + if (!(np2cfg.fddequip & 4)) { + DisableAllMenuItems(GetMenuRef(IDM_FDD3)); + } + if (!(np2cfg.fddequip & 8)) { + DisableAllMenuItems(GetMenuRef(IDM_FDD4)); + } +#endif + DrawMenuBar(); +#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(); + scrnmng_destroy(); + if (scrnmng_create(mode) == SUCCESS) { + scrnmode = mode; + } + scrndraw_redraw(); + soundmng_play(); + } + else { + scrnmode = mode; + } +} -static void HandleMenuChoice(long wParam) { +void HandleMenuChoice(long wParam) { UINT update; - Str255 applname; + soundmng_stop(); update = 0; switch(wParam) { case IDM_ABOUT: @@ -141,22 +250,26 @@ static void HandleMenuChoice(long wParam break; case IDM_RESET: - pccore_cfgupdate(); - pccore_reset(); + if (ResetWarningDialogProc()) { + pccore_cfgupdate(); + pccore_reset(); + } break; - -#if 0 - case IDM_NEWFDD: - newdisk(); + + case IDM_CONFIGURE: + initConfig(); break; -#endif -#if 0 - case IDM_NEWHDD: - newhdddisk(); + + case IDM_NEWDISK: + newdisk(); break; -#endif + + case IDM_FONT: + dialog_font(); + break; + case IDM_EXIT: - np2running = FALSE; + taskmng_exit(); break; case IDM_FDD1OPEN: @@ -165,6 +278,7 @@ static void HandleMenuChoice(long wParam case IDM_FDD1EJECT: diskdrv_setfdd(0, NULL, 0); + toolwin_setfdd(0, NULL); break; case IDM_FDD2OPEN: @@ -173,6 +287,7 @@ static void HandleMenuChoice(long wParam case IDM_FDD2EJECT: diskdrv_setfdd(1, NULL, 0); + toolwin_setfdd(1, NULL); break; case IDM_SASI1OPEN: @@ -191,6 +306,44 @@ static void HandleMenuChoice(long wParam diskdrv_sethdd(1, NULL); break; +#if defined(SUPPORT_SCSI) + case IDM_SCSI0OPEN: + dialog_changehdd(0x20); + break; + + case IDM_SCSI0REMOVE: + diskdrv_sethdd(0x20, NULL); + break; + + case IDM_SCSI1OPEN: + dialog_changehdd(0x21); + break; + + case IDM_SCSI1REMOVE: + diskdrv_sethdd(0x21, NULL); + break; + + case IDM_SCSI2OPEN: + dialog_changehdd(0x22); + break; + + case IDM_SCSI2REMOVE: + diskdrv_sethdd(0x22, NULL); + break; + + case IDM_SCSI3OPEN: + dialog_changehdd(0x23); + break; + + case IDM_SCSI3REMOVE: + diskdrv_sethdd(0x23, NULL); + break; +#endif + + case IDM_FULLSCREEN: + toggleFullscreen(); + break; + case IDM_ROLNORMAL: menu_setrotate(0); changescreen(scrnmode & (~SCRNMODE_ROTATEMASK)); @@ -248,57 +401,130 @@ static void HandleMenuChoice(long wParam update |= SYS_UPDATECFG; break; + case IDM_SCREENOPT: + initScreenOpt(); + break; + + case IDM_MOUSE: + mousemng_toggle(MOUSEPROC_SYSTEM); + menu_setmouse(np2oscfg.MOUSE_SW ^ 1); + sysmng_update(SYS_UPDATECFG); + break; + + 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); keystat_resetjoykey(); + update |= SYS_UPDATECFG; break; case IDM_JOY1: menu_setkey(1); keystat_resetjoykey(); + update |= SYS_UPDATECFG; break; case IDM_JOY2: menu_setkey(2); keystat_resetjoykey(); + update |= SYS_UPDATECFG; break; case IDM_MOUSEKEY: menu_setkey(3); keystat_resetjoykey(); + update |= SYS_UPDATECFG; break; case IDM_XSHIFT: menu_setxshift(np2cfg.XSHIFT ^ 1); keystat_forcerelease(0x70); + update |= SYS_UPDATECFG; break; case IDM_XCTRL: menu_setxshift(np2cfg.XSHIFT ^ 2); keystat_forcerelease(0x74); + update |= SYS_UPDATECFG; break; case IDM_XGRPH: menu_setxshift(np2cfg.XSHIFT ^ 4); keystat_forcerelease(0x73); + update |= SYS_UPDATECFG; + break; + + case IDM_F11KANA: + menu_setf11key(0); + mackbd_resetf11(); + update |= SYS_UPDATEOSCFG; + break; + + case IDM_F11STOP: + menu_setf11key(1); + mackbd_resetf11(); + update |= SYS_UPDATEOSCFG; + break; + + case IDM_F11EQU: + menu_setf11key(2); + mackbd_resetf11(); + update |= SYS_UPDATEOSCFG; + break; + + case IDM_F11NFER: + menu_setf11key(3); + mackbd_resetf11(); + update |= SYS_UPDATEOSCFG; + break; + + case IDM_F11USER: + menu_setf11key(4); + mackbd_resetf11(); + update |= SYS_UPDATEOSCFG; break; case IDM_F12MOUSE: - menu_setf12copy(0); - keystat_resetcopyhelp(); - update |= SYS_UPDATECFG; + menu_setf12key(0); + mackbd_resetf12(); + update |= SYS_UPDATEOSCFG; break; case IDM_F12COPY: - menu_setf12copy(1); - keystat_resetcopyhelp(); - update |= SYS_UPDATECFG; + menu_setf12key(1); + mackbd_resetf12(); + update |= SYS_UPDATEOSCFG; break; - case IDM_F12STOP: - menu_setf12copy(2); - keystat_resetcopyhelp(); - update |= SYS_UPDATECFG; + case IDM_F12COMMA: + menu_setf12key(2); + mackbd_resetf12(); + update |= SYS_UPDATEOSCFG; + break; + + case IDM_F12XFER: + menu_setf12key(3); + mackbd_resetf12(); + update |= SYS_UPDATEOSCFG; + break; + + case IDM_F12USER: + menu_setf12key(4); + mackbd_resetf12(); + update |= SYS_UPDATEOSCFG; break; case IDM_BEEPOFF: @@ -370,6 +596,16 @@ static void HandleMenuChoice(long wParam update |= SYS_UPDATECFG; break; + case IDM_AMD98: + menu_setsound(0x80); + update |= SYS_UPDATECFG; + break; + + case IDM_JASTSOUND: + menu_setjastsound(np2oscfg.jastsnd ^ 1); + update |= SYS_UPDATEOSCFG; + break; + case IDM_SEEKSND: menu_setmotorflg(np2cfg.MOTOR ^ 1); update |= SYS_UPDATECFG; @@ -395,6 +631,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; @@ -415,140 +659,101 @@ static void HandleMenuChoice(long wParam update |= SYS_UPDATECFG; break; + case IDM_MSRAPID: + menu_setmsrapid(np2cfg.MOUSERAPID ^ 1); + update |= SYS_UPDATECFG; + break; + + case IDM_RECORDING: + menu_setrecording(false); + break; + +#if defined(SUPPORT_KEYDISP) + case IDM_KEYDISP: + menu_setkeydisp(np2oscfg.keydisp ^ 1); + if (np2oscfg.keydisp) { + kdispwin_create(); + } + else { + kdispwin_destroy(); + } + break; +#endif +#if defined(SUPPORT_SOFTKBD) + case IDM_SOFTKBD: + menu_setsoftwarekeyboard(np2oscfg.softkey ^ 1); + if (np2oscfg.softkey) { + skbdwin_create(); + } + else { + skbdwin_destroy(); + } + break; +#endif + case IDM_I286SAVE: debugsub_status(); break; + + case IDM_NP2HELP: + { + ICInstance inst; + long start, fin; + const char urlStr[] = "http://retropc.net/tk800/np2x/help/help.html"; + + ICStart(&inst, 'SMil'); + start = 0; + fin = strlen(urlStr); + ICLaunchURL(inst, "\p", urlStr, strlen(urlStr), &start, &fin); + ICStop(inst); + } + 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); } -static void HandleUpdateEvent(EventRecord *pevent) { - - WindowPtr hWnd; - - hWnd = (WindowPtr)pevent->message; - BeginUpdate(hWnd); - scrndraw_redraw(); - EndUpdate(hWnd); -} - static void HandleMouseDown(EventRecord *pevent) { WindowPtr hWnd; - Rect rDrag; - 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; - - case inGoAway: - if (TrackGoAway(hWnd, pevent->where)) { } - np2running = FALSE; - break; - } + if (FindWindow(pevent->where, &hWnd) == inMenuBar) { + soundmng_stop(); + mousemng_disable(MOUSEPROC_MACUI); + HandleMenuChoice(MenuSelect(pevent->where)); + mousemng_enable(MOUSEPROC_MACUI); + } + else { + mousemng_buttonevent(MOUSEMNG_LEFTDOWN); + } } -static void eventproc(EventRecord *event) { - - switch(event->what) { - case mouseDown: - HandleMouseDown(event); - break; - case updateEvt: - HandleUpdateEvent(event); - break; +// ---- - case keyDown: - case autoKey: - if (event->modifiers & cmdKey) { - if (!mackbd_down(1, ((event->message) & keyCodeMask) >> 8)) { - HandleMenuChoice(MenuKey(event->message & charCodeMask)); - } - } - else { -#if defined(NP2GCC) - if ((((event->message) & keyCodeMask) >> 8 == 0x6f) && (!np2oscfg.F12COPY)) { - mouse_running(MOUSE_XOR); - menu_setmouse(np2oscfg.MOUSE_SW ^ 1); - sysmng_update(SYS_UPDATECFG); - } - else { - mackbd_down(0, ((event->message) & keyCodeMask) >> 8); - } -#else - mackbd_down(0, ((event->message) & keyCodeMask) >> 8); -#endif - } - break; +static void framereset(UINT waitcnt) { - case keyUp: - mackbd_up(((event->message) & keyCodeMask) >> 8); - break; -#if defined(NP2GCC) - case mouseUp: - if (controlKey & GetCurrentKeyModifiers()) { - mouse_btn(MOUSE_RIGHTUP); - } - else { - mouse_btn(MOUSE_LEFTUP); - } - break; -#endif + framecnt = 0; + kdispwin_draw((BYTE)waitcnt); + toolwin_draw((BYTE)waitcnt); + skbdwin_process(); + if (np2oscfg.DISPCLK & 3) { + if (sysmng_workclockrenewal()) { + sysmng_updatecaption(3); + } } } - static void processwait(UINT waitcnt) { if (timing_getcount() >= waitcnt) { timing_setcount(0); - framecnt = 0; - if (np2oscfg.DISPCLK & 3) { - if (sysmng_workclockrenewal()) { - sysmng_updatecaption(3); - } - } + framereset(waitcnt); } + soundmng_sync(); } static void getstatfilename(char *path, const char *ext, int size) { @@ -566,44 +771,75 @@ 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 & (~STATFLAG_DISKCHG)) { + ResumeErrorDialogProc(); + ret = IDCANCEL; + } + else if (r & STATFLAG_DISKCHG) { + ret = ResumeWarningDialogProc(buf); + } + if (ret == IDOK) { statsave_load(path); + toolwin_setfdd(0, fdd_diskname(0)); + toolwin_setfdd(1, fdd_diskname(1)); } + return; } int main(int argc, char *argv[]) { - Rect wRect; - EventRecord event; - + EventRef theEvent; + EventTargetRef theTarget; + Rect bounds; +#ifdef OPENING_WAIT + UINT32 tick; +#endif + dosio_init(); file_setcd(target); InitToolBox(); macossub_init(); + initload(); + MenuBarInit(); - initload(); + TRACEINIT(); + + keystat_initialize(); + kdispwin_initialize(); + skbdwin_readini(); + + toolwin_readini(); + kdispwin_readini(); + if (!(setupMainWindow())) { + return(0); + } + skbdwin_initialize(); - SetRect(&wRect, 100, 100, 100, 100); - hWndMain = NewWindow(0, &wRect, "\pNeko Project II", FALSE, - noGrowDocProc, (WindowPtr)-1, TRUE, 0); - if (!hWndMain) { - macossub_term(); - dosio_term(); - return(0); - } - scrnmng_initialize(); - SizeWindow(hWndMain, 640, 400, TRUE); - ShowWindow(hWndMain); +#ifdef NP2OPENING + openingNP2(); +#endif +#ifdef OPENING_WAIT + tick = GETTICK(); +#endif menu_setrotate(0); menu_setdispmode(np2cfg.DISPSYNC); @@ -611,52 +847,86 @@ int main(int argc, char *argv[]) { menu_setframe(np2oscfg.DRAW_SKIP); menu_setkey(0); menu_setxshift(0); - menu_setf12copy(np2oscfg.F12COPY); + menu_setf11key(np2oscfg.F11KEY); + menu_setf12key(np2oscfg.F12KEY); menu_setbeepvol(np2cfg.BEEP_VOL); menu_setsound(np2cfg.SOUND_SW); + menu_setjastsound(np2oscfg.jastsnd); menu_setmotorflg(np2cfg.MOTOR); menu_setextmem(np2cfg.EXTMEM); menu_setdispclk(np2oscfg.DISPCLK); menu_setbtnrapid(np2cfg.BTN_RAPID); menu_setbtnmode(np2cfg.BTN_MODE); +#if defined(SUPPORT_KEYDISP) + menu_setkeydisp(np2oscfg.keydisp); +#endif +#if defined(SUPPORT_SOFTKBD) + menu_setsoftwarekeyboard(np2oscfg.softkey); +#endif - scrnmode = 0; + scrnmng_initialize(); if (scrnmng_create(scrnmode) != SUCCESS) { + TRACETERM(); macossub_term(); dosio_term(); DisposeWindow(hWndMain); return(0); } + commng_initialize(); sysmng_initialize(); + mackbd_initialize(); pccore_init(); S98_init(); + hid_init(); +#ifndef SUPPORT_SWSEEKSND + if (soundmng_initialize() == SUCCESS) { + soundmng_pcmvolume(SOUND_PCMSEEK, np2cfg.MOTORVOL); + soundmng_pcmvolume(SOUND_PCMSEEK1, np2cfg.MOTORVOL); + } +#endif + #if defined(NP2GCC) + mousemng_initialize(); if (np2oscfg.MOUSE_SW) { // ver0.30 - mouse_running(MOUSE_ON); + mousemng_enable(MOUSEPROC_SYSTEM); } #endif - scrndraw_redraw(); + +#ifdef OPENING_WAIT + while((GETTICK() - tick) < OPENING_WAIT); +#endif pccore_reset(); #if defined(USE_RESUME) - flagload(np2resume); + if (np2oscfg.resume) { + flagload(np2resume); + } +#endif +#if defined(SUPPORT_KEYDISP) + if (np2oscfg.keydisp) { + kdispwin_create(); + } +#endif +#if defined(SUPPORT_SOFTKBD) + if (np2oscfg.softkey) { + skbdwin_create(); + } #endif - SetEventMask(everyEvent); + theTarget = GetEventDispatcherTarget(); np2running = TRUE; while(np2running) { - if (WaitNextEvent(everyEvent, &event, 0, 0)) { - eventproc(&event); - } + if (ReceiveNextEvent(0, NULL,kEventDurationNoWait,true, &theEvent)== noErr) + { + SendEventToEventTarget (theEvent, theTarget); + ReleaseEvent(theEvent); + } else { + soundmng_play(); if (np2oscfg.NOWAIT) { -#if defined(NP2GCC) - mouse_callback(); -#endif - mackbd_callback(); pccore_exec(framecnt == 0); if (np2oscfg.DRAW_SKIP) { // nowait frame skip framecnt++; @@ -673,10 +943,6 @@ int main(int argc, char *argv[]) { } else if (np2oscfg.DRAW_SKIP) { // frame skip if (framecnt < np2oscfg.DRAW_SKIP) { -#if defined(NP2GCC) - mouse_callback(); -#endif - mackbd_callback(); pccore_exec(framecnt == 0); framecnt++; } @@ -686,23 +952,27 @@ int main(int argc, char *argv[]) { } else { // auto skip if (!waitcnt) { -#if defined(NP2GCC) - mouse_callback(); -#endif - mackbd_callback(); + UINT cnt; pccore_exec(framecnt == 0); framecnt++; - if (timing_getcount() < framecnt) { + cnt = timing_getcount(); + if (framecnt > cnt) { waitcnt = framecnt; if (framemax > 1) { framemax--; } } else if (framecnt >= framemax) { - waitcnt = framecnt; if (framemax < 12) { framemax++; } + if (cnt >= 12) { + timing_reset(); + } + else { + timing_setcount(cnt - framecnt); + } + framereset(0); } } else { @@ -712,30 +982,58 @@ int main(int argc, char *argv[]) { } } } + np2running = FALSE; + menu_setrecording(true); + + if (scrnmode & SCRNMODE_FULLSCREEN) { + toggleFullscreen(); + } + + GetWindowBounds(hWndMain, kWindowGlobalPortRgn, &bounds); + if ((np2oscfg.winx != bounds.left) || (np2oscfg.winy != bounds.top)) { + np2oscfg.winx = bounds.left; + np2oscfg.winy = bounds.top; + sysmng_update(SYS_UPDATEOSCFG); + } pccore_cfgupdate(); #if defined(USE_RESUME) - flagsave(np2resume); + if (np2oscfg.resume) { + flagsave(np2resume); + } + else { + flagdelete(np2resume); + } #endif pccore_term(); S98_trash(); + hid_clear(); #if defined(NP2GCC) - mouse_running(MOUSE_OFF); + mousemng_disable(MOUSEPROC_SYSTEM); +#endif +#ifndef SUPPORT_SWSEEKSND + soundmng_deinitialize(); #endif - scrnmng_destroy(); - if (sys_updates & (SYS_UPDATECFG | SYS_UPDATEOSCFG)) { - initsave(); + kdispwin_destroy(); + skbdwin_destroy(); + if (sys_updates & (SYS_UPDATECFG | SYS_UPDATEOSCFG)) { + initsave(); // np2.cfg create + toolwin_writeini(); // np2.cfg append + kdispwin_writeini(); + skbdwin_writeini(); } + skbdwin_deinitialize(); TRACETERM(); macossub_term(); dosio_term(); + toolwin_close(); DisposeWindow(hWndMain); (void)argc; @@ -743,3 +1041,339 @@ int main(int argc, char *argv[]) { return(0); } +//以下、ごっそりIIxからマージ +static pascal OSStatus np2appevent (EventHandlerCallRef myHandlerChain, EventRef event, void* userData) +{ + OSStatus result = eventNotHandledErr; + + long eventClass; + UInt32 whatHappened; + eventClass = GetEventClass(event); + whatHappened = GetEventKind(event); + + EventRecord eve; + ConvertEventRefToEventRecord( event,&eve ); + if (IsDialogEvent(&eve)) return result; + + UInt32 modif; + GetEventParameter (event, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modif); + +#if defined(NP2GCC) + HIPoint delta; + EventMouseButton buttonKind; + GetEventParameter (event, kEventParamMouseButton, typeMouseButton, NULL, sizeof(EventMouseButton), NULL, &buttonKind); +#endif + + switch (eventClass) + { + case kEventClassCommand: + if (GetEventKind(event)==kEventCommandProcess) { + HICommand cmd; + GetEventParameter(event, kEventParamDirectObject, typeHICommand, NULL, sizeof(HICommand), NULL, &cmd); + if (cmd.commandID == kHICommandAppHelp) { + ICInstance inst; + long start, fin; + const char urlStr[] = "http://retropc.net/tk800/np2x/help/help.html"; + + ICStart(&inst, 'SMil'); + start = 0; + fin = strlen(urlStr); + ICLaunchURL(inst, "\p", urlStr, strlen(urlStr), &start, &fin); + ICStop(inst); + } + } + break; + + case kEventClassAppleEvent: + if (whatHappened == kEventAppleEvent) { + AEProcessAppleEvent(&eve); + } + break; + + case kEventClassMouse: +#if defined(NP2GCC) + switch (whatHappened) + { + case kEventMouseMoved: + case kEventMouseDragged: + GetEventParameter (event, kEventParamMouseDelta, typeHIPoint, NULL, sizeof(HIPoint), NULL, &delta); + mousemng_callback(delta); + result = noErr; + break; + case kEventMouseDown: + if (buttonKind == kEventMouseButtonSecondary || modif & cmdKey) { + mousemng_buttonevent(MOUSEMNG_RIGHTDOWN); + } + else { + HandleMouseDown(&eve); + } + result=noErr; + break; + case kEventMouseUp: + if (buttonKind == kEventMouseButtonSecondary || modif & cmdKey) { + mousemng_buttonevent(MOUSEMNG_RIGHTUP); + } + else if (buttonKind == kEventMouseButtonTertiary) { + mousemng_toggle(MOUSEPROC_SYSTEM); + menu_setmouse(np2oscfg.MOUSE_SW ^ 1); + sysmng_update(SYS_UPDATECFG); + } + else { + mousemng_buttonevent(MOUSEMNG_LEFTUP); + } + result=noErr; + break; + } +#else + if (whatHappened == kEventMouseDown) { + HandleMouseDown(&eve); + } +#endif + break; + case kEventClassKeyboard: + if (GetEventKind(event)==kEventRawKeyModifiersChanged) { + static UInt32 backup = 0; + UInt32 change = backup ^ modif; + backup = modif; + if (change & shiftKey) { + if (modif & shiftKey) keystat_senddata(0x70); + else keystat_senddata(0x70 | 0x80); + } + if (change & optionKey) { + if (modif & optionKey) keystat_senddata(0x73); + else keystat_senddata(0x73 | 0x80); + } + if (change & controlKey) { + if (modif & controlKey) keystat_senddata(0x74); + else keystat_senddata(0x74 | 0x80); + } + if (change & alphaLock) { + keystat_senddata(0x71); + } + result = noErr; + } + break; + default: + break; + } + + (void)myHandlerChain; + (void)userData; + return result; +} + +static pascal OSStatus np2windowevent(EventHandlerCallRef myHandler, EventRef event, void* userData) +{ + WindowRef window; + UInt32 whatHappened; + OSStatus result = eventNotHandledErr; + long eventClass; + + GetEventParameter(event, kEventParamDirectObject, typeWindowRef, NULL, + sizeof(window), NULL, &window); + eventClass = GetEventClass(event); + whatHappened = GetEventKind(event); + + switch (eventClass) + { + case kEventClassKeyboard: + UInt32 key; + GetEventParameter (event, kEventParamKeyCode, typeUInt32, NULL, sizeof(UInt32), NULL, &key); + UInt32 modif; + GetEventParameter (event, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modif); + switch (whatHappened) + { + case kEventRawKeyUp: + mackbd_keyup(key); + result = noErr; + break; + case kEventRawKeyRepeat: + mackbd_keydown(key); + result = noErr; + break; + case kEventRawKeyDown: + if (modif & cmdKey) { + EventRecord eve; + ConvertEventRefToEventRecord( event,&eve ); + mousemng_disable(MOUSEPROC_MACUI); + HandleMenuChoice(MenuEvent(&eve)); + mousemng_enable(MOUSEPROC_MACUI); + } + else { + mackbd_keydown(key); + } + result = noErr; + break; + default: + break; + } + break; + + case kEventClassWindow: + switch (whatHappened) + { + case kEventWindowClose: + taskmng_exit(); + 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; + default: + break; + } + + (void)myHandler; + (void)userData; + return result; +} + +static const EventTypeSpec appEventList[] = { + {kEventClassCommand, kEventCommandProcess }, + {kEventClassAppleEvent, kEventAppleEvent}, + {kEventClassMouse, kEventMouseDown}, +#if defined(NP2GCC) + {kEventClassMouse, kEventMouseMoved}, + {kEventClassMouse, kEventMouseDragged}, + {kEventClassMouse, kEventMouseUp}, +#endif + {kEventClassKeyboard, kEventRawKeyModifiersChanged}, + }; + +static const EventTypeSpec windEventList[] = { + {kEventClassWindow, kEventWindowClose}, + {kEventClassWindow, kEventWindowActivated}, + {kEventClassWindow, kEventWindowToolbarSwitchMode}, + {kEventClassWindow, kEventWindowDragStarted}, + {kEventClassWindow, kEventWindowDragCompleted}, + {kEventClassWindow, kEventWindowShown}, + {kEventClassKeyboard, kEventRawKeyDown}, + {kEventClassKeyboard, kEventRawKeyUp}, + {kEventClassKeyboard, kEventRawKeyRepeat}, + }; + + +static void setUpCarbonEvent(void) { + + InstallStandardEventHandler(GetWindowEventTarget(hWndMain)); + InstallApplicationEventHandler(NewEventHandlerUPP(np2appevent), + GetEventTypeCount(appEventList), + appEventList, 0, NULL); + InstallWindowEventHandler(hWndMain, NewEventHandlerUPP(np2windowevent), + GetEventTypeCount(windEventList), + windEventList, 0, NULL); +} + +static short backupwidth=0, backupheight=0; + +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 + if (np2oscfg.winx != -1 && np2oscfg.winy != -1) { + MoveWindow(hWndMain, np2oscfg.winx, np2oscfg.winy, false); + } + setUpCarbonEvent(); + if (backupwidth) scrnmng_setwidth(0, backupwidth); + if (backupheight) scrnmng_setheight(0, backupheight); + CFStringRef title = CFStringCreateWithCString(NULL, np2oscfg.titles, kCFStringEncodingUTF8); + if (title) { + SetWindowTitleWithCFString(hWndMain, title); + CFRelease(title); + } + ShowWindow(hWndMain); + return(true); +} + +static void toggleFullscreen(void) { + static Ptr bkfullscreen; + static BYTE mouse = 0; + static bool toolwin = false; + MenuRef menu = GetMenuRef(IDM_SCREEN); + Rect bounds; + short w, h; + + soundmng_stop(); + if (!(scrnmode & SCRNMODE_FULLSCREEN)) { + HandleMenuChoice(IDM_ROLNORMAL); + GetWindowBounds(hWndMain, kWindowContentRgn, &bounds); + backupwidth = bounds.right - bounds.left; + backupheight = bounds.bottom - bounds.top; + w = backupwidth; + h = backupheight; + toolwin = np2oscfg.toolwin; + toolwin_close(); + np2oscfg.winx = bounds.left; + np2oscfg.winy = bounds.top; + DisposeWindow(hWndMain); + BeginFullScreen(&bkfullscreen, 0, &w, &h, &hWndMain, NULL, fullScreenAllowEvents); + DisableMenuItem(menu, IDM_ROLNORMAL); + DisableMenuItem(menu, IDM_ROLLEFT); + DisableMenuItem(menu, IDM_ROLRIGHT); + HideMenuBar(); + setUpCarbonEvent(); + if (!np2oscfg.MOUSE_SW) { + mouse = np2oscfg.MOUSE_SW; + mousemng_enable(MOUSEPROC_SYSTEM); + menu_setmouse(1); + } + changescreen(scrnmode | SCRNMODE_FULLSCREEN); + } + else { + scrnmng_destroy(); + EndFullScreen(bkfullscreen, 0); + setupMainWindow(); + changescreen(scrnmode & (~SCRNMODE_FULLSCREEN)); + if (!mouse) { + mousemng_disable(MOUSEPROC_SYSTEM); + menu_setmouse(0); + } + EnableMenuItem(menu, IDM_ROLNORMAL); + EnableMenuItem(menu, IDM_ROLLEFT); + EnableMenuItem(menu, IDM_ROLRIGHT); + ShowMenuBar(); + if (toolwin) { + toolwin_open(); + } + } + CheckMenuItem(GetMenuHandle(IDM_SCREEN), LoWord(IDM_FULLSCREEN), scrnmode & SCRNMODE_FULLSCREEN); + soundmng_play(); +}