--- np2/macosx/np2.cpp 2003/10/22 16:40:45 1.10 +++ np2/macosx/np2.cpp 2003/10/24 12:35:19 1.15 @@ -26,19 +26,15 @@ #include "diskdrv.h" #include "fddfile.h" #include "statsave.h" - -#if defined(NP2GCC) #include "mousemng.h" -#endif +#include "configure.h" +#include "screenopt.h" + #define USE_RESUME -#if defined(NP2GCC) - NP2OSCFG np2oscfg = {0, 2, 0, 0, 0, 0}; -#else - NP2OSCFG np2oscfg = {0, 2, 0, 0, 0}; -#endif + NP2OSCFG np2oscfg = {0, 2, 0, 0, 0, 0, 1, 0}; WindowPtr hWndMain; BOOL np2running; @@ -69,6 +65,8 @@ static const char np2resume[] = "sav"; #define AEProc(fn) NewAEEventHandlerProc(fn) #endif +static void setUpCarbonEvent(void); + #ifdef TARGET_API_MAC_CARBON static pascal OSErr handleQuitApp(const AppleEvent *event, AppleEvent *reply, long refcon) { @@ -101,7 +99,7 @@ static void InitToolBox(void) { } static void MenuBarInit(void) { - +#if 0 Handle hMenu; MenuHandle happlemenu; @@ -120,6 +118,13 @@ static void MenuBarInit(void) { InsertMenu(GetMenu(IDM_SOUND), -1); InsertMenu(GetMenu(IDM_MEMORY), -1); DrawMenuBar(); +#endif + OSStatus err; + IBNibRef nibRef; + err = CreateNibReference(CFSTR("np2"), &nibRef); + if (err!=noErr) return; + err = SetMenuBarFromNib(nibRef, CFSTR("MainMenu")); + DisposeNibReference(nibRef); } static void changescreen(BYTE mode) { @@ -142,6 +147,10 @@ static void HandleMenuChoice(long wParam pccore_cfgupdate(); pccore_reset(); break; + + case IDM_CONFIGURE: + initConfig(); + break; #if 0 case IDM_NEWFDD: @@ -247,6 +256,10 @@ static void HandleMenuChoice(long wParam break; #if defined(NP2GCC) + case IDM_SCREENOPT: + initScreenOpt(); + break; + case IDM_MOUSE: mouse_running(MOUSE_XOR); menu_setmouse(np2oscfg.MOUSE_SW ^ 1); @@ -439,6 +452,7 @@ static void HandleMenuChoice(long wParam HiliteMenu(0); } +#if 0 static void HandleUpdateEvent(EventRecord *pevent) { WindowPtr hWnd; @@ -448,12 +462,14 @@ static void HandleUpdateEvent(EventRecor 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)); @@ -486,13 +502,17 @@ static void HandleMouseDown(EventRecord #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) { @@ -528,7 +548,7 @@ static void eventproc(EventRecord *event #endif } } - +#endif // ---- @@ -576,7 +596,11 @@ static void flagload(const char *ext) { int main(int argc, char *argv[]) { Rect wRect; +#if 0 EventRecord event; +#endif + EventRef theEvent; + EventTargetRef theTarget; dosio_init(); file_setcd(target); @@ -600,6 +624,7 @@ int main(int argc, char *argv[]) { } scrnmng_initialize(); SizeWindow(hWndMain, 640, 400, TRUE); + setUpCarbonEvent(); ShowWindow(hWndMain); menu_setrotate(0); @@ -640,22 +665,33 @@ int main(int argc, char *argv[]) { pccore_reset(); #if defined(USE_RESUME) - flagload(np2resume); + if (np2oscfg.resume) { + flagload(np2resume); + } #endif +#if 0 SetEventMask(everyEvent); - +#endif + theTarget = GetEventDispatcherTarget(); + np2running = TRUE; while(np2running) { + if (ReceiveNextEvent(0, NULL,kEventDurationNoWait,true, &theEvent)== noErr) + { + SendEventToEventTarget (theEvent, theTarget); + ReleaseEvent(theEvent); + } +#if 0 if (WaitNextEvent(everyEvent, &event, 0, 0)) { eventproc(&event); } +#endif else { if (np2oscfg.NOWAIT) { -#if defined(NP2GCC) - mouse_callback(); -#endif +#if 0 mackbd_callback(); +#endif pccore_exec(framecnt == 0); if (np2oscfg.DRAW_SKIP) { // nowait frame skip framecnt++; @@ -672,10 +708,9 @@ int main(int argc, char *argv[]) { } else if (np2oscfg.DRAW_SKIP) { // frame skip if (framecnt < np2oscfg.DRAW_SKIP) { -#if defined(NP2GCC) - mouse_callback(); +#if 0 + mackbd_callback(); #endif - mackbd_callback(); pccore_exec(framecnt == 0); framecnt++; } @@ -686,13 +721,11 @@ int main(int argc, char *argv[]) { else { // auto skip if (!waitcnt) { UINT cnt; -#if defined(NP2GCC) - mouse_callback(); +#if 0 + mackbd_callback(); #endif - mackbd_callback(); pccore_exec(framecnt == 0); framecnt++; - // テスト cnt = timing_getcount(); if (framecnt > cnt) { waitcnt = framecnt; @@ -705,7 +738,7 @@ int main(int argc, char *argv[]) { framemax++; } if (cnt >= 12) { - timing_init(); + timing_reset(); } else { timing_setcount(cnt - framecnt); @@ -725,7 +758,9 @@ int main(int argc, char *argv[]) { pccore_cfgupdate(); #if defined(USE_RESUME) - flagsave(np2resume); + if (np2oscfg.resume) { + flagsave(np2resume); + } #endif pccore_term(); @@ -737,7 +772,7 @@ int main(int argc, char *argv[]) { scrnmng_destroy(); - if (sys_updates & (SYS_UPDATECFG | SYS_UPDATEOSCFG)) { + if (sys_updates & (SYS_UPDATECFG | SYS_UPDATEOSCFG)) { initsave(); } TRACETERM(); @@ -751,3 +786,184 @@ int main(int argc, char *argv[]) { return(0); } +//以下、ごっそりIIxからマージ +static pascal OSStatus np2appevent (EventHandlerCallRef myHandlerChain, EventRef event, void* userData) +{ + UInt32 whatHappened; + OSStatus result = eventNotHandledErr; + + long eventClass; + + 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); + + BYTE ret; +#endif + + switch (eventClass) + { + case kEventClassAppleEvent: + if (whatHappened == kEventAppleEvent) { + AEProcessAppleEvent(&eve); + } + break; + + case kEventClassMouse: +#if defined(NP2GCC) + switch (whatHappened) + { + case kEventMouseMoved: + GetEventParameter (event, kEventParamMouseDelta, typeHIPoint, NULL, sizeof(HIPoint), NULL, &delta); + mouse_callback(delta); + result = noErr; + break; + case kEventMouseDown: + if (buttonKind == kEventMouseButtonSecondary | modif & controlKey) { + ret=mouse_btn(MOUSE_RIGHTDOWN); + } + else { + HandleMouseDown(&eve); + } + result=noErr; + break; + case kEventMouseUp: + if (buttonKind == kEventMouseButtonSecondary | modif & controlKey) { + ret=mouse_btn(MOUSE_RIGHTUP); + } + else if (buttonKind == kEventMouseButtonTertiary) { + mouse_running(MOUSE_XOR); + menu_setmouse(np2oscfg.MOUSE_SW ^ 1); + sysmng_update(SYS_UPDATECFG); + } + else { + ret=mouse_btn(MOUSE_LEFTUP); + } + result=noErr; + break; + } +#else + if (whatHappened == kEventMouseDown) { + HandleMouseDown(&eve); + } +#endif + 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 kEventClassWindow: + if (whatHappened == kEventWindowClose) { + np2running = FALSE; + result = noErr; + } + break; + 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_f12up(key); + result = noErr; + break; + case kEventRawKeyRepeat: + mackbd_f12down(key); + result = noErr; + break; + case kEventRawKeyDown: + if (modif & cmdKey) { + char para; + GetEventParameter (event, kEventParamKeyMacCharCodes, typeChar, NULL, sizeof(char), NULL, ¶); + HandleMenuChoice(MenuKey(para)); + } + else { + mackbd_f12down(key); + } + result = noErr; + break; + case kEventRawKeyModifiersChanged: + if (modif & shiftKey) keystat_senddata(0x70); + else keystat_senddata(0x70 | 0x80); + if (modif & optionKey) keystat_senddata(0x73); + else keystat_senddata(0x73 | 0x80); + if (modif & controlKey) keystat_senddata(0x74); + else keystat_senddata(0x74 | 0x80); + if (modif & alphaLock) keystat_senddata(0x71); + result = noErr; + break; + default: + break; + } + default: + break; + } + + (void)myHandler; + (void)userData; + return result; +} + +static const EventTypeSpec appEventList[] = { + {kEventClassAppleEvent, kEventAppleEvent}, + {kEventClassMouse, kEventMouseDown}, +#if defined(NP2GCC) + {kEventClassMouse, kEventMouseMoved}, + {kEventClassMouse, kEventMouseUp}, +#endif + }; + +static const EventTypeSpec windEventList[] = { + {kEventClassWindow, kEventWindowClose}, + {kEventClassKeyboard, kEventRawKeyDown}, + {kEventClassKeyboard, kEventRawKeyUp}, + {kEventClassKeyboard, kEventRawKeyRepeat}, + {kEventClassKeyboard, kEventRawKeyModifiersChanged}, + }; + + +static void setUpCarbonEvent(void) { + + InstallStandardEventHandler(GetWindowEventTarget(hWndMain)); + InstallApplicationEventHandler(NewEventHandlerUPP(np2appevent), + sizeof(appEventList)/sizeof(EventTypeSpec), + appEventList, 0, NULL); + InstallWindowEventHandler(hWndMain, NewEventHandlerUPP(np2windowevent), + sizeof(windEventList)/sizeof(EventTypeSpec), + windEventList, 0, NULL); +} +