Diff for /np2/macosx/np2.cpp between versions 1.2 and 1.46

version 1.2, 2003/10/17 03:52:24 version 1.46, 2004/01/05 07:22:02
Line 3 Line 3
 #include        "strres.h"  #include        "strres.h"
 #include        "np2.h"  #include        "np2.h"
 #include        "dosio.h"  #include        "dosio.h"
   #include        "commng.h"
 #include        "scrnmng.h"  #include        "scrnmng.h"
 #include        "soundmng.h"  #include        "soundmng.h"
 #include        "sysmng.h"  #include        "sysmng.h"
Line 26 Line 27
 #include        "diskdrv.h"  #include        "diskdrv.h"
 #include        "fddfile.h"  #include        "fddfile.h"
 #include        "statsave.h"  #include        "statsave.h"
   #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        <QuickTime/QuickTime.h>
 #define USE_RESUME  #define USE_RESUME
   #define NP2OPENING
   // #define      OPENING_WAIT    1500
   
   
                 NP2OSCFG        np2oscfg = {0, 2, 0, 0, 0};                  NP2OSCFG        np2oscfg = {"Neko Project IIx", -1, -1, 0, 0, 0, 0, 0, 0, 0, 1, 0};
   
                 WindowPtr       hWndMain;                  WindowPtr       hWndMain;
                 BOOL            np2running;                  BOOL            np2running;
 static  UINT            framecnt = 0;  static  UINT            framecnt = 0;
 static  UINT            waitcnt = 0;  static  UINT            waitcnt = 0;
 static  UINT            framemax = 1;  static  UINT            framemax = 1;
 static  BYTE            scrnmode;          BYTE            scrnmode = 0;
   
   
 #define DRAG_THRESHOLD          5  #define DRAG_THRESHOLD          5
Line 56  static const char np2resume[] = "sav"; Line 71  static const char np2resume[] = "sav";
   
 // ---- おまじない  // ---- おまじない
   
 #if TARGET_CARBON  
 #define AEProc(fn)      NewAEEventHandlerUPP((AEEventHandlerProcPtr)(fn))  #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,  static pascal OSErr handleQuitApp(const AppleEvent *event, AppleEvent *reply,
                                                                                                                         long refcon) {                                                                                                                          long refcon) {
   
Line 71  static pascal OSErr handleQuitApp(const  Line 85  static pascal OSErr handleQuitApp(const 
         (void)event, (void)reply, (void)refcon;          (void)event, (void)reply, (void)refcon;
         return(noErr);          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) {  static void InitToolBox(void) {
   
 #if !TARGET_CARBON  
         MaxApplZone();  
         InitGraf(&qd.thePort);  
         InitFonts();  
         InitWindows();  
         InitMenus();  
         TEInit();  
         InitDialogs(0);  
 #endif  
         FlushEvents(everyEvent, 0);          FlushEvents(everyEvent, 0);
         InitCursor();          InitCursor();
   
 #ifdef TARGET_API_MAC_CARBON  
         AEInstallEventHandler(kCoreEventClass, kAEQuitApplication,          AEInstallEventHandler(kCoreEventClass, kAEQuitApplication,
                                                 AEProc(handleQuitApp), 0L, false);                                                  AEProc(handleQuitApp), 0L, false);
 #endif          AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments,
                                                   AEProc(OpenAppleEventHandler), 0L, false);
 }  }
   
 static void MenuBarInit(void) {  static void MenuBarInit(void) {
   #if 1
         Handle          hMenu;          Handle          hMenu;
         MenuHandle      happlemenu;          MenuHandle      happlemenu;
   
Line 112  static void MenuBarInit(void) { Line 139  static void MenuBarInit(void) {
         InsertMenu(GetMenu(IDM_KEYBOARD), -1);          InsertMenu(GetMenu(IDM_KEYBOARD), -1);
         InsertMenu(GetMenu(IDM_SOUND), -1);          InsertMenu(GetMenu(IDM_SOUND), -1);
         InsertMenu(GetMenu(IDM_MEMORY), -1);          InsertMenu(GetMenu(IDM_MEMORY), -1);
       ChangeMenuAttributes(GetMenuRef(IDM_EDIT), kMenuAttrAutoDisable, 0);
       DisableAllMenuItems(GetMenuHandle(IDM_EDIT));
       SetMenuItemModifiers(GetMenuRef(IDM_FDD2), IDM_FDD2OPEN, kMenuOptionModifier);
       SetMenuItemModifiers(GetMenuRef(IDM_FDD2), IDM_FDD2EJECT, kMenuOptionModifier);
       SetMenuItemModifiers(GetMenuRef(IDM_SASI2), IDM_SASI2OPEN, kMenuOptionModifier);
         DrawMenuBar();          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) {  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) {  static void HandleMenuChoice(long wParam) {
   
         UINT    update;          UINT    update;
         Str255  applname;  
   
       soundmng_stop();
         update = 0;          update = 0;
         switch(wParam) {          switch(wParam) {
                 case IDM_ABOUT:                  case IDM_ABOUT:
Line 134  static void HandleMenuChoice(long wParam Line 194  static void HandleMenuChoice(long wParam
                         break;                          break;
   
                 case IDM_RESET:                  case IDM_RESET:
                         pccore_cfgupdate();              if (ResetWarningDialogProc()) {
                         pccore_reset();                  pccore_cfgupdate();
                   pccore_reset();
               }
                         break;                          break;
               
 #if 0                  case IDM_CONFIGURE:
                 case IDM_NEWFDD:                          initConfig();
                         newdisk();  
                         break;                          break;
 #endif  
 #if 0                  case IDM_NEWDISK:
                 case IDM_NEWHDD:              newdisk();
                         newhdddisk();  
                         break;                          break;
 #endif  
           case IDM_FONT:
               dialog_font();
               break;
               
                 case IDM_EXIT:                  case IDM_EXIT:
                         np2running = FALSE;                          taskmng_exit();
                         break;                          break;
   
                 case IDM_FDD1OPEN:                  case IDM_FDD1OPEN:
Line 158  static void HandleMenuChoice(long wParam Line 222  static void HandleMenuChoice(long wParam
   
                 case IDM_FDD1EJECT:                  case IDM_FDD1EJECT:
                         diskdrv_setfdd(0, NULL, 0);                          diskdrv_setfdd(0, NULL, 0);
               toolwin_setfdd(0, NULL);
                         break;                          break;
   
                 case IDM_FDD2OPEN:                  case IDM_FDD2OPEN:
Line 166  static void HandleMenuChoice(long wParam Line 231  static void HandleMenuChoice(long wParam
   
                 case IDM_FDD2EJECT:                  case IDM_FDD2EJECT:
                         diskdrv_setfdd(1, NULL, 0);                          diskdrv_setfdd(1, NULL, 0);
               toolwin_setfdd(1, NULL);
                         break;                          break;
   
                 case IDM_SASI1OPEN:                  case IDM_SASI1OPEN:
Line 184  static void HandleMenuChoice(long wParam Line 250  static void HandleMenuChoice(long wParam
                         diskdrv_sethdd(1, NULL);                          diskdrv_sethdd(1, NULL);
                         break;                          break;
   
                   case IDM_FULLSCREEN:
               toggleFullscreen();
               break;
               
                 case IDM_ROLNORMAL:                  case IDM_ROLNORMAL:
                         menu_setrotate(0);                          menu_setrotate(0);
                         changescreen(scrnmode & (~SCRNMODE_ROTATEMASK));                          changescreen(scrnmode & (~SCRNMODE_ROTATEMASK));
Line 241  static void HandleMenuChoice(long wParam Line 311  static void HandleMenuChoice(long wParam
                         update |= SYS_UPDATECFG;                          update |= SYS_UPDATECFG;
                         break;                          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:                  case IDM_KEY:
                         menu_setkey(0);                          menu_setkey(0);
                         keystat_resetjoykey();                          keystat_resetjoykey();
                           update |= SYS_UPDATECFG;
                         break;                          break;
   
                 case IDM_JOY1:                  case IDM_JOY1:
                         menu_setkey(1);                          menu_setkey(1);
                         keystat_resetjoykey();                          keystat_resetjoykey();
                           update |= SYS_UPDATECFG;
                         break;                          break;
   
                 case IDM_JOY2:                  case IDM_JOY2:
                         menu_setkey(2);                          menu_setkey(2);
                         keystat_resetjoykey();                          keystat_resetjoykey();
                           update |= SYS_UPDATECFG;
                         break;                          break;
   
                 case IDM_MOUSEKEY:                  case IDM_MOUSEKEY:
                         menu_setkey(3);                          menu_setkey(3);
                         keystat_resetjoykey();                          keystat_resetjoykey();
                           update |= SYS_UPDATECFG;
                         break;                          break;
   
                 case IDM_XSHIFT:                  case IDM_XSHIFT:
                         menu_setxshift(np2cfg.XSHIFT ^ 1);                          menu_setxshift(np2cfg.XSHIFT ^ 1);
                         keystat_forcerelease(0x70);                          keystat_forcerelease(0x70);
                           update |= SYS_UPDATECFG;
                         break;                          break;
   
                 case IDM_XCTRL:                  case IDM_XCTRL:
                         menu_setxshift(np2cfg.XSHIFT ^ 2);                          menu_setxshift(np2cfg.XSHIFT ^ 2);
                         keystat_forcerelease(0x74);                          keystat_forcerelease(0x74);
                           update |= SYS_UPDATECFG;
                         break;                          break;
   
                 case IDM_XGRPH:                  case IDM_XGRPH:
                         menu_setxshift(np2cfg.XSHIFT ^ 4);                          menu_setxshift(np2cfg.XSHIFT ^ 4);
                         keystat_forcerelease(0x73);                          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;                          break;
   
                 case IDM_F12MOUSE:                  case IDM_F12MOUSE:
                         menu_setf12copy(0);                          menu_setf12key(0);
                         keystat_resetcopyhelp();                          mackbd_resetf12();
                         update |= SYS_UPDATECFG;                          update |= SYS_UPDATEOSCFG;
                         break;                          break;
   
                 case IDM_F12COPY:                  case IDM_F12COPY:
                         menu_setf12copy(1);                          menu_setf12key(1);
                         keystat_resetcopyhelp();                          mackbd_resetf12();
                         update |= SYS_UPDATECFG;                          update |= SYS_UPDATEOSCFG;
                         break;                          break;
   
                 case IDM_F12STOP:                  case IDM_F12COMMA:
                         menu_setf12copy(2);                          menu_setf12key(2);
                         keystat_resetcopyhelp();                          mackbd_resetf12();
                         update |= SYS_UPDATECFG;                          update |= SYS_UPDATEOSCFG;
                           break;
   
                   case IDM_F12XFER:
                           menu_setf12key(3);
                           mackbd_resetf12();
                           update |= SYS_UPDATEOSCFG;
                         break;                          break;
   
                 case IDM_BEEPOFF:                  case IDM_BEEPOFF:
Line 363  static void HandleMenuChoice(long wParam Line 494  static void HandleMenuChoice(long wParam
                         update |= SYS_UPDATECFG;                          update |= SYS_UPDATECFG;
                         break;                          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:                  case IDM_SEEKSND:
                         menu_setmotorflg(np2cfg.MOTOR ^ 1);                          menu_setmotorflg(np2cfg.MOTOR ^ 1);
                         update |= SYS_UPDATECFG;                          update |= SYS_UPDATECFG;
Line 388  static void HandleMenuChoice(long wParam Line 529  static void HandleMenuChoice(long wParam
                         update |= SYS_UPDATECFG;                          update |= SYS_UPDATECFG;
                         break;                          break;
   
                   case IDM_BMPSAVE:
                           dialog_writebmp();
                           break;
   
           case IDM_S98LOGGING:
               dialog_s98();
               break;
               
                 case IDM_DISPCLOCK:                  case IDM_DISPCLOCK:
                         menu_setdispclk(np2oscfg.DISPCLK ^ 1);                          menu_setdispclk(np2oscfg.DISPCLK ^ 1);
                         update |= SYS_UPDATECFG;                          update |= SYS_UPDATECFG;
Line 408  static void HandleMenuChoice(long wParam Line 557  static void HandleMenuChoice(long wParam
                         update |= SYS_UPDATECFG;                          update |= SYS_UPDATECFG;
                         break;                          break;
   
           case IDM_MSRAPID:
               menu_setmsrapid(np2cfg.MOUSERAPID ^ 1);
               update |= SYS_UPDATECFG;
               break;
           case IDM_RECORDING:
               menu_setrecording(false);
               break;
   
   
                 case IDM_I286SAVE:                  case IDM_I286SAVE:
                         debugsub_status();                          debugsub_status();
                         break;                          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:                  default:
                         if (HiWord(wParam) == IDM_APPLE) {  
                                 GetMenuItemText(GetMenuHandle(IDM_APPLE),   
                                                                                         LoWord(wParam), applname);  
 #if !TARGET_API_MAC_CARBON  
                                 (void)OpenDeskAcc(applname);  
 #endif  
                         }  
                         break;                          break;
         }          }
         sysmng_update(update);          sysmng_update(update);
         HiliteMenu(0);          HiliteMenu(0);
 }  }
   
 static void HandleUpdateEvent(EventRecord *pevent) {  
   
         WindowPtr       hWnd;  
   
         hWnd = (WindowPtr)pevent->message;  
         BeginUpdate(hWnd);  
         scrndraw_redraw();  
         EndUpdate(hWnd);  
 }  
   
 static void HandleMouseDown(EventRecord *pevent) {  static void HandleMouseDown(EventRecord *pevent) {
   
         WindowPtr       hWnd;          WindowPtr       hWnd;
         Rect            rDrag;  
   
         switch(FindWindow(pevent->where, &hWnd)) {  
                 case inMenuBar:  
                         HandleMenuChoice(MenuSelect(pevent->where));  
                         break;  
   
                 case inDrag:          if (FindWindow(pevent->where, &hWnd) == inMenuBar) {
 #if TARGET_API_MAC_CARBON          soundmng_stop();
                 {          mousemng_disable(MOUSEPROC_MACUI);
                         BitMap  gscreenBits;          HandleMenuChoice(MenuSelect(pevent->where));
                         GetQDGlobalsScreenBits(&gscreenBits);          mousemng_enable(MOUSEPROC_MACUI);
                         rDrag = gscreenBits.bounds;      }
                         InsetRect(&rDrag, DRAG_THRESHOLD, DRAG_THRESHOLD);      else {
                         DragWindow(hWnd, pevent->where, &rDrag);          mousemng_buttonevent(MOUSEMNG_LEFTDOWN);
                 }      }
 #else  
                         rDrag = qd.screenBits.bounds;  
                         InsetRect(&rDrag, DRAG_THRESHOLD, DRAG_THRESHOLD);  
                         DragWindow(hWnd, pevent->where, &rDrag);  
 #endif  
                         break;  
   
                 case inContent:  
                         break;  
   
                 case inGoAway:  
                         if (TrackGoAway(hWnd, pevent->where)) { }  
                         np2running = FALSE;  
                         break;  
         }  
 }  }
   
 static void eventproc(EventRecord *event) {  
   
         switch(event->what) {  
                 case mouseDown:  
                         HandleMouseDown(event);  
                         break;  
   
                 case updateEvt:  // ----
                         HandleUpdateEvent(event);  
                         break;  
   
                 case keyDown:  static void framereset(UINT waitcnt) {
                 case autoKey:  
                         if (event->modifiers & cmdKey) {  
                                 if (!mackbd_down(1, ((event->message) & keyCodeMask) >> 8)) {  
                                         HandleMenuChoice(MenuKey(event->message & charCodeMask));  
                                 }  
                         }  
                         else {  
                                 mackbd_down(0, ((event->message) & keyCodeMask) >> 8);  
                         }  
                         break;  
   
                 case keyUp:          framecnt = 0;
                         mackbd_up(((event->message) & keyCodeMask) >> 8);          toolwin_draw((BYTE)waitcnt);
                         break;          if (np2oscfg.DISPCLK & 3) {
                   if (sysmng_workclockrenewal()) {
                           sysmng_updatecaption(3);
                   }
         }          }
 }  }
   
   
 static void processwait(UINT waitcnt) {  static void processwait(UINT waitcnt) {
   
         if (timing_getcount() >= waitcnt) {          if (timing_getcount() >= waitcnt) {
                 timing_setcount(0);                  timing_setcount(0);
                 framecnt = 0;                  framereset(waitcnt);
                 if (np2oscfg.DISPCLK & 2) {  
                         if (sysmng_workclockrenewal()) {  
                                 sysmng_updatecaption(2);  
                         }  
                 }  
         }          }
 }  }
   
Line 530  static void flagsave(const char *ext) { Line 643  static void flagsave(const char *ext) {
         statsave_save(path);          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) {  static void flagload(const char *ext) {
   
         char    path[MAX_PATH];          char    path[MAX_PATH];
           char    buf[1024];
           int             ret, r;
   
       ret = IDOK;
         getstatfilename(path, ext, sizeof(path));          getstatfilename(path, ext, sizeof(path));
         statsave_load(path);          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;
 }  }
   
 int main(int argc, char *argv[]) {  int main(int argc, char *argv[]) {
   
         Rect            wRect;      EventRef            theEvent;
         EventRecord     event;      EventTargetRef      theTarget;
       Rect                        bounds;
   #ifdef OPENING_WAIT
           UINT32          tick;
   #endif
     
         dosio_init();          dosio_init();
         file_setcd(target);          file_setcd(target);
   
Line 552  int main(int argc, char *argv[]) { Line 693  int main(int argc, char *argv[]) {
   
         initload();          initload();
   
         SetRect(&wRect, 100, 100, 100, 100);          TRACEINIT();
         hWndMain = NewWindow(0, &wRect, "\pNeko Project II", FALSE,      
                                                                 noGrowDocProc, (WindowPtr)-1, TRUE, 0);      toolwin_readini();
         if (!hWndMain) {      if (!(setupMainWindow())) {
                 macossub_term();          return(0);
                 dosio_term();      }
                 return(0);  
         }  #ifdef    NP2OPENING
         scrnmng_initialize();      openingNP2();
         SizeWindow(hWndMain, 640, 400, TRUE);  #endif
         ShowWindow(hWndMain);  #ifdef OPENING_WAIT
           tick = GETTICK();
   #endif
   
         menu_setrotate(0);          menu_setrotate(0);
         menu_setdispmode(np2cfg.DISPSYNC);          menu_setdispmode(np2cfg.DISPSYNC);
Line 570  int main(int argc, char *argv[]) { Line 713  int main(int argc, char *argv[]) {
         menu_setframe(np2oscfg.DRAW_SKIP);          menu_setframe(np2oscfg.DRAW_SKIP);
         menu_setkey(0);          menu_setkey(0);
         menu_setxshift(0);          menu_setxshift(0);
         menu_setf12copy(np2oscfg.F12COPY);          menu_setf11key(np2oscfg.F11KEY);
           menu_setf12key(np2oscfg.F12KEY);
         menu_setbeepvol(np2cfg.BEEP_VOL);          menu_setbeepvol(np2cfg.BEEP_VOL);
         menu_setsound(np2cfg.SOUND_SW);          menu_setsound(np2cfg.SOUND_SW);
           menu_setjastsound(np2oscfg.jastsnd);
         menu_setmotorflg(np2cfg.MOTOR);          menu_setmotorflg(np2cfg.MOTOR);
         menu_setextmem(np2cfg.EXTMEM);          menu_setextmem(np2cfg.EXTMEM);
         menu_setdispclk(np2oscfg.DISPCLK);          menu_setdispclk(np2oscfg.DISPCLK);
         menu_setbtnrapid(np2cfg.BTN_RAPID);          menu_setbtnrapid(np2cfg.BTN_RAPID);
         menu_setbtnmode(np2cfg.BTN_MODE);          menu_setbtnmode(np2cfg.BTN_MODE);
       if (np2oscfg.I286SAVE) {
           AppendMenuItemTextWithCFString(GetMenuRef(IDM_OTHER), CFCopyLocalizedString(CFSTR("i286 save"),"i286"), kMenuItemAttrIconDisabled, NULL,NULL);
       }
   
         scrnmode = 0;          scrnmng_initialize();
         if (scrnmng_create(scrnmode) != SUCCESS) {          if (scrnmng_create(scrnmode) != SUCCESS) {
                   TRACETERM();
                 macossub_term();                  macossub_term();
                 dosio_term();                  dosio_term();
                 DisposeWindow(hWndMain);                  DisposeWindow(hWndMain);
                 return(0);                  return(0);
         }          }
   
           commng_initialize();
         sysmng_initialize();          sysmng_initialize();
           mackbd_initialize();
         pccore_init();          pccore_init();
         S98_init();          S98_init();
   
         scrndraw_redraw();      hid_init();
           if (soundmng_initialize() == SUCCESS) {
                   soundmng_pcmvolume(SOUND_PCMSEEK, np2cfg.MOTORVOL);
                   soundmng_pcmvolume(SOUND_PCMSEEK1, np2cfg.MOTORVOL);
           }
   
   #if defined(NP2GCC)
           mousemng_initialize();
           if (np2oscfg.MOUSE_SW) {                                                                                // ver0.30
                   mousemng_enable(MOUSEPROC_SYSTEM);
           }
   #endif
   #ifdef OPENING_WAIT
           while((GETTICK() - tick) < OPENING_WAIT);
   #endif
         pccore_reset();          pccore_reset();
   
 #if defined(USE_RESUME)  #if defined(USE_RESUME)
         flagload(np2resume);      if (np2oscfg.resume) {
           flagload(np2resume);
       }
 #endif  #endif
   
         SetEventMask(everyEvent);      theTarget = GetEventDispatcherTarget();
       
         np2running = TRUE;          np2running = TRUE;
         while(np2running) {          while(np2running) {
                 if (WaitNextEvent(everyEvent, &event, 0, 0)) {          if (ReceiveNextEvent(0, NULL,kEventDurationNoWait,true, &theEvent)== noErr)
                         eventproc(&event);          {
                 }              SendEventToEventTarget (theEvent, theTarget);
               ReleaseEvent(theEvent);
           }
                 else {                  else {
               soundmng_play();
                         if (np2oscfg.NOWAIT) {                          if (np2oscfg.NOWAIT) {
                                 mackbd_callback();  
                                 pccore_exec(framecnt == 0);                                  pccore_exec(framecnt == 0);
                                 if (np2oscfg.DRAW_SKIP) {                       // nowait frame skip                                  if (np2oscfg.DRAW_SKIP) {                       // nowait frame skip
                                         framecnt++;                                          framecnt++;
Line 624  int main(int argc, char *argv[]) { Line 793  int main(int argc, char *argv[]) {
                         }                          }
                         else if (np2oscfg.DRAW_SKIP) {                  // frame skip                          else if (np2oscfg.DRAW_SKIP) {                  // frame skip
                                 if (framecnt < np2oscfg.DRAW_SKIP) {                                  if (framecnt < np2oscfg.DRAW_SKIP) {
                                         mackbd_callback();  
                                         pccore_exec(framecnt == 0);                                          pccore_exec(framecnt == 0);
                                         framecnt++;                                          framecnt++;
                                 }                                  }
Line 634  int main(int argc, char *argv[]) { Line 802  int main(int argc, char *argv[]) {
                         }                          }
                         else {                                                          // auto skip                          else {                                                          // auto skip
                                 if (!waitcnt) {                                  if (!waitcnt) {
                                         mackbd_callback();                                          UINT cnt;
                                         pccore_exec(framecnt == 0);                                          pccore_exec(framecnt == 0);
                                         framecnt++;                                          framecnt++;
                                         if (timing_getcount() < framecnt) {                                          cnt = timing_getcount();
                                           if (framecnt > cnt) {
                                                 waitcnt = framecnt;                                                  waitcnt = framecnt;
                                                 if (framemax > 1) {                                                  if (framemax > 1) {
                                                         framemax--;                                                          framemax--;
                                                 }                                                  }
                                         }                                          }
                                         else if (framecnt >= framemax) {                                          else if (framecnt >= framemax) {
                                                 waitcnt = framecnt;  
                                                 if (framemax < 12) {                                                  if (framemax < 12) {
                                                         framemax++;                                                          framemax++;
                                                 }                                                  }
                                                   if (cnt >= 12) {
                                                           timing_reset();
                                                   }
                                                   else {
                                                           timing_setcount(cnt - framecnt);
                                                   }
                                                   framereset(0);
                                         }                                          }
                                 }                                  }
                                 else {                                  else {
Line 657  int main(int argc, char *argv[]) { Line 832  int main(int argc, char *argv[]) {
                         }                          }
                 }                  }
         }          }
       
         np2running = FALSE;          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();          pccore_cfgupdate();
   
 #if defined(USE_RESUME)  #if defined(USE_RESUME)
         flagsave(np2resume);      if (np2oscfg.resume) {
           flagsave(np2resume);
       }
           else {
                   flagdelete(np2resume);
           }
 #endif  #endif
   
         pccore_term();          pccore_term();
         S98_trash();          S98_trash();
   
       hid_clear();
   #if defined(NP2GCC)
           mousemng_disable(MOUSEPROC_SYSTEM);
   #endif
   
           soundmng_deinitialize();
         scrnmng_destroy();          scrnmng_destroy();
   
         if (sys_updates & (SYS_UPDATECFG | SYS_UPDATEOSCFG)) {          if (sys_updates & (SYS_UPDATECFG | SYS_UPDATEOSCFG)) {
                 initsave();                  initsave();                                             // np2.cfg create
               toolwin_writeini();                         // np2.cfg append
         }          }
         TRACETERM();          TRACETERM();
         macossub_term();          macossub_term();
         dosio_term();          dosio_term();
   
         DisposeWindow(hWndMain);          DisposeWindow(hWndMain);
       toolwin_close();
   
         (void)argc;          (void)argc;
         (void)argv;          (void)argv;
         return(0);          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:
                       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;
           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);
           
       static UInt32 backup = 0;
       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;
                   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) != (backup & alphaLock)) {
                           keystat_senddata(0x71);
                           backup = modif;
                       }
                       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,              kEventMouseUp},
   #endif
                           };
   
   static const EventTypeSpec windEventList[] = {
                                   {kEventClassWindow,             kEventWindowClose},
                                   {kEventClassWindow,             kEventWindowActivated},
                                   {kEventClassWindow,             kEventWindowToolbarSwitchMode},
                                   {kEventClassWindow,             kEventWindowDragStarted},
                                   {kEventClassWindow,             kEventWindowDragCompleted},
                                   {kEventClassWindow,             kEventWindowShown},
                                   {kEventClassKeyboard,   kEventRawKeyDown},
                                   {kEventClassKeyboard,   kEventRawKeyUp},
                                   {kEventClassKeyboard,   kEventRawKeyRepeat},
                                   {kEventClassKeyboard,   kEventRawKeyModifiersChanged},
                           };
   
   
   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);
       SetWindowTitleWithCFString(hWndMain, CFStringCreateWithCString(NULL, np2oscfg.titles, kCFStringEncodingUTF8));
           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 = 640, h = 480;
   
       soundmng_stop();
       if (!(scrnmode & SCRNMODE_FULLSCREEN)) {
           HandleMenuChoice(IDM_ROLNORMAL);
           GetWindowBounds(hWndMain, kWindowContentRgn, &bounds);
           backupwidth = bounds.right - bounds.left;
           backupheight = bounds.bottom - bounds.top;
           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();
   }
   
   void recieveCommand(long param) {
       HandleMenuChoice(param);
   }

Removed from v.1.2  
changed lines
  Added in v.1.46


RetroPC.NET-CVS <cvs@retropc.net>