|
|
1.1 ! root 1: /* ! 2: * UAE - The Un*x Amiga Emulator ! 3: * ! 4: * Mac port specific stuff ! 5: * ! 6: * (c) 1996 Ernesto Corvi ! 7: */ ! 8: ! 9: #include <stdio.h> ! 10: #include <stdlib.h> ! 11: #include <string.h> ! 12: #include <QDOffscreen.h> ! 13: #include <Palettes.h> ! 14: #include <Profiler.h> ! 15: #include <Sound.h> ! 16: #include <errno.h> ! 17: ! 18: #include "mackbd.h" ! 19: #include "config.h" ! 20: #include "amiga.h" ! 21: #include "options.h" ! 22: #include "memory.h" ! 23: #include "custom.h" ! 24: #include "newcpu.h" ! 25: #include "xwin.h" ! 26: #include "keyboard.h" ! 27: #include "keybuf.h" ! 28: ! 29: #define kAppleMenuID 128 ! 30: #define kFileMenuID 129 ! 31: #define kEditMenuID 130 ! 32: #define kDrivesMenuID 131 ! 33: #define kMemoryMenuID 132 ! 34: #define kResMenuID 135 ! 35: #define kRateMenuID 134 ! 36: #define kVideoMenuID 133 ! 37: ! 38: #define kAboutDialogID 128 ! 39: #define kHardfileDialogID 129 ! 40: #define kQuitError 130 ! 41: ! 42: #define mTopLeft(r) (((Point *)&(r))[0]) ! 43: #define mBotRight(r) (((Point *)&(r))[1]) ! 44: ! 45: #define qd_CenterScreen 144 ! 46: ! 47: extern int quit_program; ! 48: ! 49: static GDHandle curDevice; ! 50: static int oldDepth=0; ! 51: static Boolean macCursorState=true; ! 52: int use_quickdraw=true; ! 53: short filesys_vRefNum=0; ! 54: static KeyMap keys; ! 55: static Boolean redraw=true,diskInit=true; ! 56: static int mBarState=1; ! 57: static int RM=0; ! 58: static int my_use_gfxlib=0; ! 59: static int my_automount_uaedev=1; ! 60: static int my_screen_res=3; ! 61: static int my_use_quickdraw=1; ! 62: static WindowPtr mywin; ! 63: static RgnHandle gOldVisRgn; ! 64: static short gOldMBarHeight; ! 65: static Boolean macDiskStatus[4]; ! 66: static GWorldPtr gOffscreenBuffer; ! 67: static PixMapHandle gOffscreenPixels; ! 68: static Rect gOffscreenRect,gDrawRect; ! 69: static unsigned char *gOffscreenBaseAddr; ! 70: static unsigned long gOffscreenRowBytes; ! 71: static PaletteHandle mypal; ! 72: static int CenterScreen=0; ! 73: static CTabHandle myCTAB; ! 74: static long screenH=0,screenV=0; ! 75: static GrafPtr dummyPort; ! 76: extern SndChannelPtr newChannel; ! 77: static unsigned long refresh; ! 78: extern char *xlinebuffer; ! 79: long int xcolors[4096]; ! 80: ! 81: struct vidbuf_description gfxvidinfo; ! 82: ! 83: /* Keyboard and mouse */ ! 84: ! 85: static int keystate[256]; ! 86: ! 87: int buttonstate[3]; ! 88: int lastmx, lastmy; ! 89: int newmousecounters; ! 90: ! 91: static int colors_allocated; ! 92: ! 93: // Prototypes ! 94: static void HandleMenu (long mSelect); ! 95: static void macHandleCursors(void); ! 96: static Boolean CheckForSetup (void); ! 97: static void ParamAString( ConstStr255Param theStr); ! 98: static void printStatusLine (void); ! 99: static void Share_main(void); ! 100: static void Share_ResolvePath (FSSpec *fSpec, char *path); ! 101: // end Prototypes ! 102: ! 103: static void my_setpalette(int count, int r, int g, int b) ! 104: { RGBColor mycolor; ! 105: ! 106: mycolor.red=r*1024; ! 107: mycolor.green=g*1024; ! 108: mycolor.blue=b*1024; ! 109: ! 110: if (count == 0 || count == 255) SetEntryColor(mypal, count, &mycolor); ! 111: else SetEntryColor(mypal, (~count & 0x000000ff), &mycolor); ! 112: } ! 113: ! 114: static int get_color(int r, int g, int b, xcolnr *cnp) ! 115: { ! 116: if (colors_allocated == 256) return -1; ! 117: *cnp = colors_allocated; ! 118: my_setpalette(colors_allocated, doMask(r, 6, 0), doMask(g, 6, 0), doMask(b, 6, 0)); ! 119: colors_allocated++; ! 120: return 1; ! 121: } ! 122: ! 123: static void init_colors(void) ! 124: { ! 125: int rw = 5, gw = 5, bw = 5; ! 126: colors_allocated = 0; ! 127: ! 128: if (gfxvidinfo.pixbytes == 1) ! 129: alloc_colors256(get_color); ! 130: else ! 131: { if (gfxvidinfo.pixbytes == 4) rw=gw=bw=8; ! 132: alloc_colors64k(rw, gw, bw, gw+bw, bw, 0); ! 133: } ! 134: } ! 135: ! 136: static void HideMenuBar(GrafPtr grafPort) ! 137: { Rect menuRect={0,0,20,640}; ! 138: RgnHandle newVisRgn; ! 139: GrafPtr savePort; ! 140: ! 141: GetPort(&savePort); ! 142: SetPort(grafPort); ! 143: ! 144: // save off vis region ! 145: gOldVisRgn = NewRgn(); ! 146: CopyRgn(grafPort->visRgn, gOldVisRgn); ! 147: ! 148: // expand the vis region to the port rect ! 149: newVisRgn = NewRgn(); ! 150: RectRgn(newVisRgn, &grafPort->portRect); ! 151: CopyRgn(newVisRgn, grafPort->visRgn); ! 152: DisposeRgn(newVisRgn); ! 153: ! 154: PaintRect(&menuRect); ! 155: ! 156: gOldMBarHeight = GetMBarHeight(); ! 157: LMSetMBarHeight(0); ! 158: ! 159: SetPort(savePort); ! 160: } ! 161: ! 162: static void ShowMenuBar(GrafPtr grafPort) ! 163: { ! 164: GrafPtr savePort; ! 165: RgnHandle junkRgn; ! 166: ! 167: GetPort(&savePort); ! 168: SetPort(grafPort); ! 169: ! 170: // fill the rounded corners of the screen with black again ! 171: junkRgn = NewRgn(); ! 172: CopyRgn(gOldVisRgn, junkRgn); ! 173: DiffRgn(grafPort->visRgn, junkRgn, junkRgn); ! 174: ! 175: #ifdef dangerousPattern ! 176: FillRgn(junkRgn, qd.black); ! 177: #else ! 178: FillRgn(junkRgn, &qd.black); ! 179: #endif ! 180: ! 181: DisposeRgn(junkRgn); ! 182: ! 183: // restore the old vis region ! 184: CopyRgn(gOldVisRgn, grafPort->visRgn); ! 185: DisposeRgn(gOldVisRgn); ! 186: gOldVisRgn = NULL; ! 187: ! 188: LMSetMBarHeight(gOldMBarHeight); ! 189: ! 190: DrawMenuBar(); ! 191: } ! 192: ! 193: int graphics_init() ! 194: { ! 195: int i; ! 196: char p1; ! 197: long tmp; ! 198: long memtop=0; ! 199: Rect windowRectangle,osRect={0,0,600,800}; ! 200: char *dst; ! 201: CGrafPtr oldPort; ! 202: GDHandle oldDevice; ! 203: ! 204: my_use_gfxlib=use_gfxlib; ! 205: my_automount_uaedev=automount_uaedev; ! 206: my_screen_res=screen_res; ! 207: my_use_quickdraw=use_quickdraw; ! 208: ! 209: if (CheckForSetup()) ExitToShell(); ! 210: ! 211: gfxvidinfo.maxblocklines=600; // Whatever... ! 212: ! 213: if (gfxvidinfo.pixbytes == 1) ! 214: { myCTAB=GetCTable(128); ! 215: mypal=NewPalette(256, myCTAB, pmTolerant + pmExplicit, 0x0000); ! 216: } ! 217: ! 218: windowRectangle.left=0; ! 219: if (screen_res > 4 || screen_res < 0) screen_res=3; ! 220: if (screen_res == 4 || screen_res == 2) dont_want_aspect = 0; ! 221: else dont_want_aspect = 1; ! 222: switch (screen_res) ! 223: { case 0: ! 224: case 1: ! 225: case 2: ! 226: CenterScreen=(36*gfxvidinfo.pixbytes)/2; ! 227: windowRectangle.right=320; ! 228: use_lores = 1; ! 229: windowRectangle.top=40; ! 230: if (screen_res == 0) windowRectangle.bottom=200+windowRectangle.top+38; ! 231: else if (screen_res == 1) windowRectangle.bottom=256+windowRectangle.top+38; ! 232: else windowRectangle.bottom=400+windowRectangle.top+38; ! 233: break; ! 234: ! 235: case 3: ! 236: case 4: ! 237: CenterScreen=36*gfxvidinfo.pixbytes; ! 238: use_lores = 0; ! 239: windowRectangle.right=640; ! 240: if (dont_want_aspect == 0) ! 241: { windowRectangle.top=0; ! 242: windowRectangle.bottom=480; ! 243: } ! 244: else ! 245: { windowRectangle.top=40; ! 246: windowRectangle.bottom=256+windowRectangle.top+38; ! 247: } ! 248: break; ! 249: } ! 250: ! 251: screenV=windowRectangle.bottom-windowRectangle.top; ! 252: if (dont_want_aspect == 1 || screen_res == 2) screenV -= 12; ! 253: screenH=windowRectangle.right-windowRectangle.left; ! 254: ! 255: mywin = NewCWindow(nil, &windowRectangle, "\pThe Un*x Amiga Emulator", 1, 4, (WindowPtr)-1L, 0, 0); ! 256: SetPort(mywin); ! 257: ! 258: gui_prepare_leds(screenV); ! 259: ! 260: init_colors(); ! 261: ! 262: if (use_quickdraw) ! 263: { GetGWorld(&oldPort, &oldDevice); ! 264: NewGWorld( &gOffscreenBuffer, (gfxvidinfo.pixbytes*8), &osRect, 0L, oldDevice, 0); ! 265: SetGWorld(oldPort, oldDevice); ! 266: gOffscreenPixels = GetGWorldPixMap( gOffscreenBuffer ); ! 267: LockPixels(gOffscreenPixels); ! 268: gDrawRect.top=(mywin->portRect).top; ! 269: gDrawRect.left=(mywin->portRect).left; ! 270: gDrawRect.right=(mywin->portRect).right; ! 271: gDrawRect.bottom=(mywin->portRect).bottom; ! 272: gDrawRect.bottom -= 12; ! 273: gOffscreenRect.top=(mywin->portRect).top; ! 274: gOffscreenRect.left=(mywin->portRect).left; ! 275: gOffscreenRect.right=(mywin->portRect).right; ! 276: gOffscreenRect.bottom=(mywin->portRect).bottom; ! 277: gOffscreenRect.bottom -= 12; ! 278: OffsetRect(&gOffscreenRect,(use_lores == 1) ? qd_CenterScreen/2 : qd_CenterScreen,0); ! 279: gOffscreenBaseAddr = (unsigned char *)GetPixBaseAddr(gOffscreenPixels); ! 280: gOffscreenRowBytes = (*gOffscreenPixels)->rowBytes & 0x3fff; ! 281: gfxvidinfo.bufmem=(char *)gOffscreenBaseAddr; ! 282: gfxvidinfo.rowbytes=gOffscreenRowBytes; ! 283: SetGWorld(gOffscreenBuffer, NULL); ! 284: PaintRect(&gOffscreenRect); ! 285: SetGWorld(oldPort, oldDevice); ! 286: } ! 287: else ! 288: { gfxvidinfo.bufmem=NewPtrClear(600*(800*gfxvidinfo.pixbytes)); ! 289: if (gfxvidinfo.bufmem == 0) SysBeep(0); ! 290: gfxvidinfo.rowbytes=800*gfxvidinfo.pixbytes; ! 291: } ! 292: ! 293: if (dont_want_aspect || screen_res == 2) printStatusLine(); ! 294: ! 295: if (gfxvidinfo.pixbytes == 1) ! 296: { SetPalette((WindowPtr) -1L, mypal, false); ! 297: } ! 298: ! 299: buttonstate[0] = buttonstate[1] = buttonstate[2] = 0; ! 300: for(i=0; i<256; i++) keystate[i] = 0; ! 301: ! 302: lastmx = lastmy = 0; newmousecounters=0; ! 303: ! 304: refresh=TickCount(); ! 305: ! 306: // tmp=ProfilerInit(collectDetailed,bestTimeBase,200,10); ! 307: return 1; ! 308: } ! 309: ! 310: void graphics_leave() ! 311: { ! 312: // ProfilerDump((unsigned char *)"\pmyProf"); ! 313: // ProfilerTerm(); ! 314: ! 315: ShowCursor(); ! 316: if (dont_want_aspect == 0) if (!mBarState) ShowMenuBar(mywin); ! 317: if (oldDepth != 0) SetDepth(curDevice,oldDepth,0,0); ! 318: FlushEvents (everyEvent,0); ! 319: SndDisposeChannel(newChannel,true); ! 320: if (gfxvidinfo.pixbytes == 1) ! 321: { DisposePalette(mypal); ! 322: DisposeCTable(myCTAB); ! 323: } ! 324: DisposeWindow(mywin); ! 325: if (use_quickdraw) ! 326: { DisposeGWorld(gOffscreenBuffer); ! 327: } ! 328: else DisposePtr((Ptr)(gfxvidinfo.bufmem)); ! 329: } ! 330: ! 331: static int next_line_double; ! 332: static int next_line_pos = 0; ! 333: ! 334: void flush_screen () ! 335: { short y,x,y1=0; ! 336: unsigned char *winbaseaddr; ! 337: long *src,*dest; ! 338: unsigned long winrowbytes; ! 339: PixMapHandle ph; ! 340: CGrafPtr oldPort; ! 341: GDHandle oldDevice; ! 342: ! 343: if (TickCount() < refresh + 4) return; ! 344: if (!redraw) return; ! 345: if (FrontWindow() != mywin) return; ! 346: if (inhibit_frame) return; ! 347: ! 348: GetGWorld(&oldPort,&oldDevice); ! 349: SetGWorld((CWindowPtr) mywin, oldDevice); ! 350: if (use_quickdraw) ! 351: { ForeColor(blackColor); /* Prevents colorizing mode */ ! 352: BackColor(whiteColor); /* Prevents colorizing mode */ ! 353: (*((*gOffscreenPixels)->pmTable))->ctSeed = (*((*((*(GetGDevice()))->gdPMap))->pmTable))->ctSeed; ! 354: CopyBits((BitMap *)(*gOffscreenPixels), &(mywin->portBits), &gOffscreenRect, &gDrawRect, srcCopy, (RgnHandle) 0L); ! 355: } ! 356: else ! 357: { ph=GetGWorldPixMap((CGrafPort *) mywin); ! 358: winbaseaddr=( unsigned char *) GetPixBaseAddr(ph); ! 359: winrowbytes=(*ph)->rowBytes & 0x3FFF; ! 360: winbaseaddr-=((**ph).bounds.left); ! 361: winbaseaddr-=(((**ph).bounds.top)*winrowbytes); ! 362: dest=(long *)winbaseaddr; ! 363: src=(long *)(gfxvidinfo.bufmem)+CenterScreen; ! 364: ! 365: y=0; ! 366: if ((dont_want_aspect == 0 && mBarState == true && y < 20)) y=20; ! 367: dest=(long *)(winbaseaddr+(y*winrowbytes)); ! 368: src=(long *)(gfxvidinfo.bufmem+(y*gfxvidinfo.rowbytes))+CenterScreen; ! 369: for (; y< screenV; y++) ! 370: { for (x=0;x < ((screenH*gfxvidinfo.pixbytes)/sizeof(long));x++) *dest++ = *src++; ! 371: dest=(long *)(winbaseaddr+(y*winrowbytes)); ! 372: src=(long *)(gfxvidinfo.bufmem+(y*gfxvidinfo.rowbytes))+CenterScreen; ! 373: } ! 374: } ! 375: SetGWorld(oldPort, oldDevice); ! 376: } ! 377: ! 378: void flush_block (int start_y, int end_y) ! 379: { short y,x,y1=0; ! 380: unsigned char *winbaseaddr; ! 381: long *src,*dest; ! 382: unsigned long winrowbytes; ! 383: PixMapHandle ph; ! 384: Rect srcRect,dstRect; ! 385: CGrafPtr oldPort; ! 386: GDHandle oldDevice; ! 387: ! 388: if (TickCount() < refresh + 4) return; ! 389: if (!redraw) return; ! 390: if (FrontWindow() != mywin) return; ! 391: if (inhibit_frame) return; ! 392: ! 393: if (end_y > screenV) end_y=screenV; ! 394: GetGWorld(&oldPort,&oldDevice); ! 395: SetGWorld((CWindowPtr) mywin, oldDevice); ! 396: if (use_quickdraw) ! 397: { ! 398: srcRect.top=start_y; ! 399: srcRect.bottom=end_y; ! 400: srcRect.left=gOffscreenRect.left; ! 401: srcRect.right=gOffscreenRect.right; ! 402: dstRect.top=start_y; ! 403: dstRect.bottom=end_y; ! 404: dstRect.left=gDrawRect.left; ! 405: dstRect.right=gDrawRect.right; ! 406: ! 407: /* Taken from my favorite book: ! 408: "It is significant, if not surprising, that the Mac and PC cannot come ! 409: to an agreement over the most fundamental issue in the universe: the ! 410: distinction between black and white. On the PC, the pixel value 0 ! 411: indicates a pixel of zero intensity, or black. On the Mac, 0 indicates ! 412: a page wich has not been written on, wich leaves it white." ! 413: ! 414: Eric Johnston. ! 415: Tricks of the Mac Game Programming Gurus. ! 416: ! 417: Check set_palette and line_to_scr8() on how i fixed that. ! 418: If you know a better way let me know. ! 419: */ ! 420: ! 421: ForeColor(blackColor); /* Prevents colorizing mode */ ! 422: BackColor(whiteColor); /* Prevents colorizing mode */ ! 423: (*((*gOffscreenPixels)->pmTable))->ctSeed = (*((*((*(GetGDevice()))->gdPMap))->pmTable))->ctSeed; ! 424: CopyBits((BitMap *)(*gOffscreenPixels), &(mywin->portBits), &srcRect, &dstRect, srcCopy, (RgnHandle) 0L); ! 425: } ! 426: else ! 427: { ph=GetGWorldPixMap((CGrafPort *) mywin); ! 428: winbaseaddr=( unsigned char *) GetPixBaseAddr(ph); ! 429: winrowbytes=(*ph)->rowBytes & 0x3FFF; ! 430: winbaseaddr-=((**ph).bounds.left); ! 431: winbaseaddr-=(((**ph).bounds.top)*winrowbytes); ! 432: dest=(long *)winbaseaddr; ! 433: src=(long *)(gfxvidinfo.bufmem)+CenterScreen; ! 434: ! 435: y=start_y; ! 436: if ((dont_want_aspect == 0 && mBarState == true && y < 20)) y=20; ! 437: dest=(long *)(winbaseaddr+(y*winrowbytes)); ! 438: src=(long *)(gfxvidinfo.bufmem+(y*gfxvidinfo.rowbytes))+CenterScreen; ! 439: for (; y <= end_y; y++) ! 440: { for (x=0;x < ((screenH*gfxvidinfo.pixbytes)/sizeof(long));x++) *dest++ = *src++; ! 441: dest=(long *)(winbaseaddr+(y*winrowbytes)); ! 442: src=(long *)(gfxvidinfo.bufmem+(y*gfxvidinfo.rowbytes))+CenterScreen; ! 443: } ! 444: } ! 445: SetGWorld(oldPort, oldDevice); ! 446: } ! 447: ! 448: void flush_line(int line_num) ! 449: { ! 450: long i; ! 451: char *dst,*src; ! 452: CGrafPtr oldPort; ! 453: GDHandle oldDevice; ! 454: ! 455: if (use_quickdraw) ! 456: { GetGWorld(&oldPort, &oldDevice); ! 457: SetGWorld(gOffscreenBuffer, NULL); ! 458: dst=(char *)gOffscreenBaseAddr; ! 459: dst+=(char *)((line_num)*gOffscreenRowBytes); ! 460: src=(char *)xlinebuffer; ! 461: BlockMove(src,dst,gOffscreenRowBytes); ! 462: if (next_line_double) ! 463: { dst=(char *)gOffscreenBaseAddr; ! 464: dst+=(char *)((line_num+1)*gOffscreenRowBytes); ! 465: src=(char *)xlinebuffer; ! 466: BlockMove(src,dst,gOffscreenRowBytes); ! 467: } ! 468: SetGWorld(oldPort, oldDevice); ! 469: } ! 470: else ! 471: { if (line_num < 481) ! 472: { dst=(char *)gfxvidinfo.bufmem+((line_num)*gfxvidinfo.rowbytes); ! 473: src=(char *)xlinebuffer; ! 474: BlockMove(src,dst,gfxvidinfo.rowbytes); ! 475: } ! 476: if (next_line_double) ! 477: { ! 478: if (line_num < 481) ! 479: { dst=(char *)gfxvidinfo.bufmem+((line_num+1)*gfxvidinfo.rowbytes); ! 480: src=(char *)xlinebuffer; ! 481: BlockMove(src,dst,gfxvidinfo.rowbytes); ! 482: } ! 483: } ! 484: } ! 485: } ! 486: ! 487: /* Decode KeySyms. This function knows about all keys that are common ! 488: * between different keyboard languages. ! 489: */ ! 490: static int kc_decode (long ks) ! 491: { ! 492: switch (ks) ! 493: { ! 494: case kAKeyMap: return AK_A; ! 495: case kBKeyMap: return AK_B; ! 496: case kCKeyMap: return AK_C; ! 497: case kDKeyMap: return AK_D; ! 498: case kEKeyMap: return AK_E; ! 499: case kFKeyMap: return AK_F; ! 500: case kGKeyMap: return AK_G; ! 501: case kHKeyMap: return AK_H; ! 502: case kIKeyMap: return AK_I; ! 503: case kJKeyMap: return AK_J; ! 504: case kKKeyMap: return AK_K; ! 505: case kLKeyMap: return AK_L; ! 506: case kMKeyMap: return AK_M; ! 507: case kNKeyMap: return AK_N; ! 508: case kOKeyMap: return AK_O; ! 509: case kPKeyMap: return AK_P; ! 510: case kQKeyMap: return AK_Q; ! 511: case kRKeyMap: return AK_R; ! 512: case kSKeyMap: return AK_S; ! 513: case kTKeyMap: return AK_T; ! 514: case kUKeyMap: return AK_U; ! 515: case kVKeyMap: return AK_V; ! 516: case kWKeyMap: return AK_W; ! 517: case kXKeyMap: return AK_X; ! 518: ! 519: case k0KeyMap: return AK_0; ! 520: case k1KeyMap: return AK_1; ! 521: case k2KeyMap: return AK_2; ! 522: case k3KeyMap: return AK_3; ! 523: case k4KeyMap: return AK_4; ! 524: case k5KeyMap: return AK_5; ! 525: case k6KeyMap: return AK_6; ! 526: case k7KeyMap: return AK_7; ! 527: case k8KeyMap: return AK_8; ! 528: case k9KeyMap: return AK_9; ! 529: ! 530: case kKP0KeyMap: return AK_NP0; ! 531: case kKP1KeyMap: return AK_NP1; ! 532: case kKP2KeyMap: return AK_NP2; ! 533: case kKP3KeyMap: return AK_NP3; ! 534: case kKP4KeyMap: return AK_NP4; ! 535: case kKP5KeyMap: return AK_NP5; ! 536: case kKP6KeyMap: return AK_NP6; ! 537: case kKP7KeyMap: return AK_NP7; ! 538: case kKP8KeyMap: return AK_NP8; ! 539: case kKP9KeyMap: return AK_NP9; ! 540: ! 541: case kF1KeyMap: return AK_F1; ! 542: case kF2KeyMap: return AK_F2; ! 543: case kF3KeyMap: return AK_F3; ! 544: case kF4KeyMap: return AK_F4; ! 545: case kF5KeyMap: return AK_F5; ! 546: case kF6KeyMap: return AK_F6; ! 547: case kF7KeyMap: return AK_F7; ! 548: case kF8KeyMap: return AK_F8; ! 549: case kF9KeyMap: return AK_F9; ! 550: case kF10KeyMap: return AK_F10; ! 551: ! 552: case kBackSpaceKeyMap: return AK_BS; ! 553: case kTabKeyMap: return AK_TAB; ! 554: case kReturnKeyMap: return AK_RET; ! 555: case kEscapeKeyMap: return AK_ESC; ! 556: ! 557: case kSpaceBarMap: return AK_SPC; ! 558: ! 559: case kUpArrowKeyMap: return AK_UP; ! 560: case kDownArrowKeyMap: return AK_DN; ! 561: case kLeftArrowKeyMap: return AK_LF; ! 562: case kRightArrowKeyMap: return AK_RT; ! 563: ! 564: case kF11KeyMap: return AK_inhibit; ! 565: ! 566: case kF12KeyMap: return AK_mousestuff; ! 567: ! 568: case kPgUpKeyMap: return AK_RAMI; ! 569: case kPgDnKeyMap: return AK_LAMI; ! 570: case kBackSlash: return AK_BACKSLASH; ! 571: } ! 572: return -1; ! 573: } ! 574: ! 575: static int decode_us(long ks) ! 576: { ! 577: switch(ks) { ! 578: /* US specific */ ! 579: ! 580: case kYKeyMap: return AK_Y; ! 581: case kZKeyMap: return AK_Z; ! 582: case kLBracketKeyMap: return AK_LBRACKET; ! 583: case kRBracketKeyMap: return AK_RBRACKET; ! 584: case kCommaKeyMap: return AK_COMMA; ! 585: case kPeriodKeyMap: return AK_PERIOD; ! 586: case kSlashKeyMap: return AK_SLASH; ! 587: case kSemiColonKeyMap: return AK_SEMICOLON; ! 588: case kMinusKeyMap: return AK_MINUS; ! 589: case kEqualKeyMap: return AK_EQUAL; ! 590: case kQuoteKeyMap: return AK_QUOTE; ! 591: } ! 592: ! 593: return -1; ! 594: } ! 595: ! 596: static int decode_de(long ks) ! 597: { ! 598: switch(ks) { ! 599: /* DE specific ! 600: case XK_Y: case XK_y: return AK_Z; ! 601: case XK_Z: case XK_z: return AK_Y; ! 602: case XK_Odiaeresis: case XK_odiaeresis: return AK_SEMICOLON; ! 603: case XK_Adiaeresis: case XK_adiaeresis: return AK_QUOTE; ! 604: case XK_Udiaeresis: case XK_udiaeresis: return AK_LBRACKET; ! 605: case XK_plus: case XK_asterisk: return AK_RBRACKET; ! 606: case XK_comma: return AK_COMMA; ! 607: case XK_period: return AK_PERIOD; ! 608: case XK_less: case XK_greater: return AK_LTGT; ! 609: case XK_numbersign: return AK_NUMBERSIGN; ! 610: case XK_ssharp: return AK_MINUS; ! 611: case XK_apostrophe: return AK_EQUAL; ! 612: case XK_asciicircum: return AK_00; ! 613: case XK_minus: return AK_SLASH; ! 614: */ ! 615: } ! 616: ! 617: return -1; ! 618: } ! 619: ! 620: static int keycode2amiga(long code) ! 621: { ! 622: long ks; ! 623: int as; ! 624: ! 625: ks = (code & keyCodeMask) >> 8; ! 626: as = kc_decode (ks); ! 627: ! 628: if (as == -1) { ! 629: switch(keyboard_lang) { ! 630: case KBD_LANG_US: ! 631: as = decode_us(ks); ! 632: break; ! 633: ! 634: case KBD_LANG_DE: ! 635: as = decode_de(ks); ! 636: break; ! 637: ! 638: default: ! 639: as = -1; ! 640: break; ! 641: } ! 642: } ! 643: if(-1 != as) ! 644: return as; ! 645: return -1; ! 646: } ! 647: ! 648: void handle_events() ! 649: { WindowPeek wp; ! 650: short windowPart; ! 651: Boolean repeat; ! 652: Boolean itHappened; ! 653: Point mpos; ! 654: EventRecord event; ! 655: int kc,i,count; ! 656: char osKind; ! 657: GrafPtr oldSave; ! 658: ! 659: GetPort(&oldSave); ! 660: if ((redraw) && mywin != FrontWindow()) SelectWindow(mywin); ! 661: ! 662: SetEventMask(-1); ! 663: ! 664: if (diskInit) ! 665: { macDiskStatus[0]=!disk_empty(0); ! 666: SetMenuItemText(GetMenuHandle(kDrivesMenuID), 1, macDiskStatus[0] ? "\pEject Disk in DF0:" : "\pInsert Disk in DF0:"); ! 667: macDiskStatus[1]=!disk_empty(1); ! 668: SetMenuItemText(GetMenuHandle(kDrivesMenuID), 2, macDiskStatus[1] ? "\pEject Disk in DF1:" : "\pInsert Disk in DF1:"); ! 669: macDiskStatus[2]=!disk_empty(2); ! 670: SetMenuItemText(GetMenuHandle(kDrivesMenuID), 3, macDiskStatus[2] ? "\pEject Disk in DF2:" : "\pInsert Disk in DF2:"); ! 671: macDiskStatus[3]=!disk_empty(3); ! 672: SetMenuItemText(GetMenuHandle(kDrivesMenuID), 4, macDiskStatus[3] ? "\pEject Disk in DF3:" : "\pInsert Disk in DF3:"); ! 673: diskInit=false; ! 674: } ! 675: ! 676: if (redraw) ! 677: { gui_update_leds(); ! 678: macHandleCursors(); ! 679: } ! 680: ! 681: GetKeys(keys); ! 682: if (BitTst(&keys, kCommandRawKey)) ! 683: buttonstate[2] = 1; ! 684: else ! 685: buttonstate[2] = 0; ! 686: ! 687: if (BitTst(&keys, kShiftRawKey)) ! 688: { ! 689: if (!keystate[AK_LSH]) { ! 690: keystate[AK_LSH] = 1; ! 691: record_key (AK_LSH << 1); ! 692: goto label1; ! 693: } ! 694: } else { ! 695: if (keystate[AK_LSH]) { ! 696: keystate[AK_LSH] = 0; ! 697: record_key ((AK_LSH << 1) | 1); ! 698: goto label1; ! 699: } ! 700: } ! 701: if (BitTst(&keys, kControlRawKey)) ! 702: { ! 703: if (!keystate[AK_CTRL]) { ! 704: keystate[AK_CTRL] = 1; ! 705: record_key (AK_CTRL << 1); ! 706: goto label1; ! 707: } ! 708: } else { ! 709: if (keystate[AK_CTRL]) { ! 710: keystate[AK_CTRL] = 0; ! 711: record_key ((AK_CTRL << 1) | 1); ! 712: goto label1; ! 713: } ! 714: } ! 715: if (BitTst(&keys, kCapsRawKey)) ! 716: { ! 717: if (!keystate[AK_CAPSLOCK]) { ! 718: keystate[AK_CAPSLOCK] = 1; ! 719: record_key (AK_CAPSLOCK << 1); ! 720: goto label1; ! 721: } ! 722: } else { ! 723: if (keystate[AK_CAPSLOCK]) { ! 724: keystate[AK_CAPSLOCK] = 0; ! 725: record_key ((AK_CAPSLOCK << 1) | 1); ! 726: goto label1; ! 727: } ! 728: } ! 729: if (BitTst(&keys, kOptionRawKey)) ! 730: { ! 731: if (!keystate[AK_LALT]) { ! 732: keystate[AK_LALT] = 1; ! 733: record_key (AK_LALT << 1); ! 734: goto label1; ! 735: } ! 736: } else { ! 737: if (keystate[AK_LALT]) { ! 738: keystate[AK_LALT] = 0; ! 739: record_key ((AK_LALT << 1) | 1); ! 740: goto label1; ! 741: } ! 742: } ! 743: do { ! 744: repeat = 0; ! 745: newmousecounters=0; ! 746: itHappened=WaitNextEvent(-1,&event,0L,(*mywin).visRgn); ! 747: ! 748: switch(event.what) { ! 749: case keyDown: ! 750: case autoKey: { ! 751: if ((event.modifiers & cmdKey) != 0) ! 752: { HandleMenu(MenuKey((char) (event.message & charCodeMask))); ! 753: } ! 754: else ! 755: { int kc = keycode2amiga(event.message); ! 756: if (kc == -1) break; ! 757: switch (kc) ! 758: { case AK_mousestuff: ! 759: togglemouse(); ! 760: break; ! 761: ! 762: case AK_inhibit: ! 763: inhibit_frame ^= 1; ! 764: break; ! 765: ! 766: default: ! 767: if (!keystate[kc]) ! 768: { keystate[kc] = 1; ! 769: record_key (kc << 1); ! 770: } ! 771: break; ! 772: } ! 773: } ! 774: break; ! 775: } ! 776: case keyUp: { ! 777: kc = keycode2amiga(event.message); ! 778: if (kc == -1) break; ! 779: keystate[kc] = 0; ! 780: record_key ((kc << 1) | 1); ! 781: break; ! 782: } ! 783: case mouseDown: ! 784: windowPart = FindWindow (event.where, (WindowPtr*) &wp); ! 785: if (windowPart == inMenuBar) HandleMenu(MenuSelect(event.where)); ! 786: else ! 787: if (windowPart == inSysWindow) SystemClick (&event, (WindowPtr) wp); ! 788: else buttonstate[0] = 1; ! 789: break; ! 790: ! 791: case osEvt: ! 792: osKind=(event.message) >> 24; ! 793: if (osKind == suspendResumeMessage) ! 794: { osKind=(event.message)&1; ! 795: if (osKind) ! 796: { redraw=true; // Resume ! 797: flush_screen(); ! 798: if (dont_want_aspect || screen_res == 2) ! 799: { SelectWindow(mywin); ! 800: printStatusLine(); ! 801: } ! 802: } ! 803: else redraw=false; // Suspend ! 804: } ! 805: break; ! 806: case mouseUp: ! 807: buttonstate[0] = 0; ! 808: buttonstate[2] = 0; ! 809: break; ! 810: } ! 811: if (redraw) ! 812: { GetMouse(&mpos); ! 813: if (mpos.h != lastmx) { lastmx=mpos.h; /* repeat = 1;*/ } ! 814: if (mpos.v != lastmy) { lastmy=mpos.v; /*repeat = 1;*/ } ! 815: } ! 816: } while (repeat); ! 817: ! 818: label1: ! 819: /* "Affengriff" */ ! 820: if(keystate[AK_CTRL] && keystate[AK_LAMI] && keystate[AK_RAMI]) ! 821: m68k_reset(); ! 822: SetPort(oldSave); ! 823: } ! 824: ! 825: int debuggable() ! 826: { ! 827: return 1; ! 828: } ! 829: ! 830: int needmousehack() ! 831: { ! 832: return 1; ! 833: } ! 834: ! 835: void LED(int on) ! 836: { ! 837: } ! 838: ! 839: void parse_cmdline () ! 840: { ! 841: /* No commandline on the Mac. */ ! 842: } ! 843: ! 844: static void PStrCat ( StringPtr p1, StringPtr p2) ! 845: { ! 846: register int len; ! 847: register int total; ! 848: StringPtr p3; ! 849: ! 850: len = *p1++; ! 851: total = len +*p2; ! 852: ! 853: p3=p2; ! 854: p2=p2+ (*p2 + 1); ! 855: ! 856: while (--len>=0) *p2++=*p1++; ! 857: *p3=total; ! 858: } ! 859: ! 860: static void PStrCopy ( StringPtr p1, StringPtr p2) ! 861: { ! 862: register int len; ! 863: ! 864: len = *p2++ = *p1++; ! 865: while (--len>=0) *p2++=*p1++; ! 866: } ! 867: ! 868: short vRefNum=0; ! 869: long dirID=0; ! 870: ! 871: static void HandleMenu (long mSelect) ! 872: { short menuID; ! 873: short menuItem; ! 874: Str32 name; ! 875: GrafPtr savePort; ! 876: WindowPtr batchWin; ! 877: Str255 batchStr,batchStr2; ! 878: StandardFileReply inputReply; ! 879: char strSize,i; ! 880: long count; ! 881: FILE *outFile; ! 882: char fileBuf[512]; ! 883: int backup=0; ! 884: ! 885: menuID = HiWord(mSelect); ! 886: menuItem = LoWord(mSelect); ! 887: ! 888: if (menuID == 0) return; ! 889: switch (menuID) ! 890: { case kAppleMenuID: ! 891: if (menuItem == 1) ! 892: { if (!macCursorState) ShowCursor(); ! 893: macCursorState=true; ! 894: Alert(kAboutDialogID,0); // About Box ! 895: if (dont_want_aspect || screen_res == 2) printStatusLine(); ! 896: } ! 897: else ! 898: { GetPort(&savePort); ! 899: GetItem(GetMenuHandle(kAppleMenuID), menuItem, name); ! 900: OpenDeskAcc(name); ! 901: SystemTask(); ! 902: SetPort(savePort); ! 903: } ! 904: break; ! 905: ! 906: case kFileMenuID: ! 907: switch (menuItem) ! 908: { case 1: ! 909: m68k_reset(); ! 910: break; ! 911: ! 912: case 3: ! 913: if (dont_want_aspect == 0) ! 914: { if (mBarState) HideMenuBar(mywin); ! 915: else ShowMenuBar(mywin); ! 916: mBarState=!mBarState; ! 917: } ! 918: break; ! 919: ! 920: case 5: ! 921: activate_debugger(); ! 922: break; ! 923: ! 924: case 7: ! 925: inhibit_frame ^= 1; ! 926: if (inhibit_frame) SetMenuItemText(GetMenuHandle(kFileMenuID), 7, "\pTurn Screen Update On"); ! 927: else SetMenuItemText(GetMenuHandle(kFileMenuID), 7, "\pTurn Screen Update Off"); ! 928: break; ! 929: ! 930: case 9: ! 931: produce_sound= !produce_sound; ! 932: if (produce_sound) SetMenuItemText(GetMenuHandle(kFileMenuID), 9, "\pTurn Sound Off"); ! 933: else SetMenuItemText(GetMenuHandle(kFileMenuID), 9, "\pTurn Sound On"); ! 934: WritePrefs(0); ! 935: break; ! 936: ! 937: case 11: ! 938: fake_joystick= !fake_joystick; ! 939: if (fake_joystick) SetMenuItemText(GetMenuHandle(kFileMenuID), 11, "\pTurn Joystick Off"); ! 940: else SetMenuItemText(GetMenuHandle(kFileMenuID), 11, "\pTurn Joystick On"); ! 941: WritePrefs(0); ! 942: break; ! 943: ! 944: case 13: ! 945: broken_in = 1; ! 946: regs.spcflags |= SPCFLAG_BRK; ! 947: quit_program=1; ! 948: break; ! 949: } ! 950: break; ! 951: ! 952: case kDrivesMenuID: ! 953: if (menuItem >= 1 && menuItem <= 4) ! 954: { if (macDiskStatus[menuItem-1]) disk_eject(menuItem-1); ! 955: else ! 956: { if (!macCursorState) ShowCursor(); ! 957: if (!mBarState) ShowMenuBar(mywin); ! 958: macCursorState=true; ! 959: StandardGetFile(nil,-1L,nil,&inputReply); ! 960: if (inputReply.sfGood) ! 961: { vRefNum=inputReply.sfFile.vRefNum; ! 962: dirID=inputReply.sfFile.parID; ! 963: disk_insert (menuItem-1, p2cstr(inputReply.sfFile.name)); ! 964: } ! 965: else macDiskStatus[menuItem-1] = !macDiskStatus[menuItem-1]; ! 966: if (!mBarState) HideMenuBar(mywin); ! 967: } ! 968: macDiskStatus[menuItem-1] = !macDiskStatus[menuItem-1]; ! 969: if (macDiskStatus[menuItem-1]) PStrCopy("\pEject Disk in DF",batchStr); ! 970: else PStrCopy("\pInsert Disk in DF",batchStr); ! 971: NumToString((long)(menuItem-1),batchStr2); ! 972: PStrCat(batchStr2,batchStr); ! 973: PStrCat("\p:",batchStr); ! 974: SetMenuItemText(GetMenuHandle(kDrivesMenuID), menuItem, batchStr); ! 975: ! 976: } ! 977: if (menuItem == 6) ! 978: { if (!macCursorState) ShowCursor(); ! 979: macCursorState=true; ! 980: for (count=0;count<512;count++) fileBuf[count]=0; ! 981: errno=0; ! 982: outFile=fopen("hardfile","wb"); ! 983: if (outFile != 0) ! 984: { for (count=0;count<16384;count++) ! 985: { fwrite(fileBuf, sizeof(char), 512, outFile); ! 986: if (errno != 0) ! 987: { ParamAString("\pError generating the hardfile!.\n Make sure you have at least 8Mb of free storage on your Harddrive."); ! 988: DisplayError(kQuitError); ! 989: } ! 990: } ! 991: fclose(outFile); ! 992: Alert(kHardfileDialogID,0); ! 993: } ! 994: else ! 995: { ParamAString("\pCan't create the hardfile!.\n Make sure your Harddrive isnt either software or hardware locked."); ! 996: DisplayError(kQuitError); ! 997: } ! 998: } ! 999: if (menuItem == 7) ! 1000: { my_automount_uaedev=!my_automount_uaedev; ! 1001: WritePrefs(0); ! 1002: ParamAString("\pChanges will take effect the next time you run UAE."); ! 1003: DisplayError(kQuitError); ! 1004: CheckItem(GetMenuHandle(kDrivesMenuID),7,my_automount_uaedev ? false : true); ! 1005: } ! 1006: if (menuItem == 9) ! 1007: { if (!macCursorState) ShowCursor(); ! 1008: macCursorState=true; ! 1009: Share_main(); ! 1010: } ! 1011: break; ! 1012: ! 1013: case kMemoryMenuID: ! 1014: if (menuItem == 1) use_slow_mem = !use_slow_mem; ! 1015: WritePrefs(0); ! 1016: ParamAString("\pChanges will take effect the next time you run UAE."); ! 1017: DisplayError(kQuitError); ! 1018: if (use_slow_mem) SetMenuItemText(GetMenuHandle(kMemoryMenuID), 1, "\pDisable 1 Mb (SlowMem)"); ! 1019: else SetMenuItemText(GetMenuHandle(kMemoryMenuID), 1, "\pEnable 1 Mb (SlowMem)"); ! 1020: break; ! 1021: ! 1022: case kResMenuID: ! 1023: my_screen_res=(int)menuItem-1; ! 1024: WritePrefs(0); ! 1025: CheckItem(GetMenuHandle(kResMenuID),screen_res+1,false); ! 1026: CheckItem(GetMenuHandle(kResMenuID),my_screen_res+1,true); ! 1027: ParamAString("\pChanges will take effect the next time you run UAE."); ! 1028: DisplayError(kQuitError); ! 1029: break; ! 1030: ! 1031: case kRateMenuID: ! 1032: for (count=1;count<5;count++) CheckItem(GetMenuHandle(kRateMenuID),count,false); ! 1033: if (menuItem == 1) framerate=1; ! 1034: if (menuItem == 2) framerate=3; ! 1035: if (menuItem == 3) framerate=5; ! 1036: if (menuItem == 4) framerate=7; ! 1037: CheckItem(GetMenuHandle(kRateMenuID),menuItem,true); ! 1038: WritePrefs(0); ! 1039: break; ! 1040: ! 1041: case kVideoMenuID: ! 1042: if (menuItem == 5) ! 1043: { my_use_quickdraw = !my_use_quickdraw; ! 1044: WritePrefs(0); ! 1045: CheckItem(GetMenuHandle(kVideoMenuID),5,my_use_quickdraw ? true : false); ! 1046: ParamAString("\pChanges will take effect the next time you run UAE."); ! 1047: DisplayError(kQuitError); ! 1048: } ! 1049: if (menuItem == 7) ! 1050: { my_use_gfxlib = !my_use_gfxlib; ! 1051: WritePrefs(0); ! 1052: CheckItem(GetMenuHandle(kVideoMenuID),7,my_use_gfxlib ? true : false); ! 1053: ParamAString("\pChanges will take effect the next time you run UAE."); ! 1054: DisplayError(kQuitError); ! 1055: } ! 1056: break; ! 1057: ! 1058: default: ! 1059: break; ! 1060: } ! 1061: HiliteMenu(0); ! 1062: flush_screen(); ! 1063: if (dont_want_aspect || screen_res == 2) printStatusLine(); ! 1064: } ! 1065: ! 1066: static void macHandleCursors(void) ! 1067: { Point mpos; ! 1068: ! 1069: if (redraw) ! 1070: { GetMouse(&mpos); ! 1071: if (!dont_want_aspect && mBarState && screen_res == 4) ! 1072: { if (mpos.v < 20) ! 1073: { ShowCursor(); ! 1074: macCursorState=true; ! 1075: } ! 1076: else ! 1077: { if (macCursorState) ! 1078: { HideCursor(); ! 1079: macCursorState=false; ! 1080: } ! 1081: } ! 1082: } ! 1083: else ! 1084: if (PtInRect(mpos,&(mywin->portRect))) ! 1085: { if (macCursorState) ! 1086: { HideCursor(); ! 1087: macCursorState=false; ! 1088: } ! 1089: } ! 1090: else ! 1091: { if (!macCursorState) ! 1092: { ShowCursor(); ! 1093: macCursorState=true; ! 1094: } ! 1095: } ! 1096: } ! 1097: } ! 1098: ! 1099: // Check Minimal System Configuration and Setup ! 1100: static Boolean CheckForSetup (void) ! 1101: { Boolean retvalue=false; ! 1102: SysEnvRec env; ! 1103: ! 1104: oldDepth=0; ! 1105: SysEnvirons( 2, &env ); ! 1106: ! 1107: if ( env.systemVersion < 0x0700 ) ! 1108: { ParamAString("\pUAE requires System 7 or later!\n Press Ok to Quit..."); ! 1109: DisplayError(kQuitError); ! 1110: retvalue=true; ! 1111: } ! 1112: if ( !env.hasColorQD) ! 1113: { ParamAString("\pUAE requires Color QuickDraw!\n Press Ok to Quit..."); ! 1114: DisplayError(kQuitError); ! 1115: retvalue=true; ! 1116: } ! 1117: curDevice = GetMainDevice(); ! 1118: gfxvidinfo.pixbytes=((*(*curDevice)->gdPMap)->pixelSize)/8; ! 1119: return(retvalue); ! 1120: } ! 1121: ! 1122: // Shows up the standard error alert; ! 1123: static int DisplayError(int ID) ! 1124: { int ret=0; ! 1125: ! 1126: InitCursor(); ! 1127: ret=Alert(ID,0); ! 1128: ! 1129: return (ret); ! 1130: } ! 1131: ! 1132: // Parses a Pascal string for error display ! 1133: static void ParamAString( ConstStr255Param theStr ) ! 1134: { ! 1135: ParamText(theStr, "\p", "\p", "\p"); ! 1136: } ! 1137: ! 1138: static void printStatusLine (void) ! 1139: { GrafPtr savePort; ! 1140: Rect updateRect; ! 1141: ! 1142: updateRect.top=screenV; ! 1143: updateRect.bottom=screenV+38; ! 1144: updateRect.left=0; ! 1145: updateRect.right=screenH; ! 1146: GetPort(&savePort); ! 1147: SetPort(mywin); ! 1148: EraseRect(&updateRect); ! 1149: MoveTo(10,screenV+10); ! 1150: TextFont(monaco); ! 1151: TextSize(9); ! 1152: if (screen_res >= 3) ! 1153: DrawString("\pPower LED: Drive LEDs: DF0: DF1: DF2: DF3:"); ! 1154: else DrawString("\pPower: DF0: DF1: DF2: DF3:"); ! 1155: TextFont(0); ! 1156: TextSize(0); ! 1157: SetPort(savePort); ! 1158: } ! 1159: ! 1160: typedef struct { ! 1161: StandardFileReply *replyPtr; ! 1162: FSSpec oldSelection; ! 1163: } SFData, *SFDataPtr; ! 1164: ! 1165: /* constants */ ! 1166: ! 1167: #define kSelectItem 10 ! 1168: #define kSFDlg 128 ! 1169: #define kCanSelectDesktop true ! 1170: #define kSelectStrRsrc 128 ! 1171: #define kDefaultSelectString "\pSelect" ! 1172: #define kDeskStrRsrc 129 ! 1173: #define kDefaultDeskString "\pDesktop" ! 1174: #define kSelectKey 's' ! 1175: ! 1176: /* globals */ ! 1177: ! 1178: Boolean gHasFindFolder; ! 1179: FSSpec gDeskFolderSpec; ! 1180: Str255 gSelectString; ! 1181: Str255 gDesktopFName; ! 1182: ! 1183: FileFilterYDUPP Share_FilterAllFiles_UPP; ! 1184: DlgHookYDUPP Share_MyDlgHook_UPP; ! 1185: ModalFilterYDUPP Share_MyModalFilter_UPP; ! 1186: ! 1187: /* prototypes */ ! 1188: ! 1189: static void Share_Init(void); ! 1190: static Boolean Share_CustomGet(FSSpec *fSpec); ! 1191: static pascal short Share_MyDlgHook(short item,DialogPtr theDlg,Ptr userData); ! 1192: static pascal Boolean Share_MyModalFilter(DialogPtr theDlg,EventRecord *ev,short *itemHit,Ptr myData); ! 1193: static void Share_HitButton(DialogPtr theDlg,short item); ! 1194: static pascal Boolean Share_FilterAllFiles(CInfoPBPtr pb, Ptr myDataPtr); ! 1195: static void Share_SetSelectButtonName(StringPtr selName,Boolean hilited,DialogPtr theDlg); ! 1196: static Boolean Share_SameFile(FSSpec *file1,FSSpec *file2); ! 1197: static Boolean Share_GetFSSpecPartialName(FSSpec *file,StringPtr fName); ! 1198: static OSErr Share_GetDeskFolderSpec(FSSpec *fSpec,short vRefNum); ! 1199: static OSErr Share_MakeCanonFSSpec(FSSpec *fSpec); ! 1200: static Boolean Share_ShouldHiliteSelect(FSSpec *fSpec); ! 1201: ! 1202: ! 1203: static void Share_main(void) ! 1204: { FSSpec fSpec; ! 1205: Boolean good; ! 1206: GrafPtr oldPort; ! 1207: char share_path[1024]; ! 1208: Handle share_handle; ! 1209: short backup; ! 1210: ! 1211: GetPort(&oldPort); ! 1212: Share_Init(); ! 1213: ! 1214: good = Share_CustomGet(&fSpec); ! 1215: ! 1216: if (good) ! 1217: { Share_ResolvePath(&fSpec,share_path); ! 1218: backup=filesys_vRefNum; ! 1219: filesys_vRefNum=fSpec.vRefNum; ! 1220: WritePrefs(share_path); ! 1221: filesys_vRefNum=backup; ! 1222: } ! 1223: SetPort(oldPort); ! 1224: } ! 1225: ! 1226: static void Share_Init(void) ! 1227: { ! 1228: Handle strHndl; ! 1229: ! 1230: gHasFindFolder = true; ! 1231: ! 1232: Share_FilterAllFiles_UPP=NewFileFilterYDProc(Share_FilterAllFiles); ! 1233: Share_MyDlgHook_UPP=NewDlgHookYDProc(Share_MyDlgHook); ! 1234: Share_MyModalFilter_UPP=NewModalFilterYDProc(Share_MyModalFilter); ! 1235: ! 1236: strHndl = Get1Resource('STR ',kSelectStrRsrc); ! 1237: if (ResError()!=noErr || !strHndl || !*strHndl) ! 1238: BlockMove(kDefaultSelectString,gSelectString,kDefaultSelectString[0]+1); ! 1239: else { ! 1240: BlockMove(*strHndl,&gSelectString,(long)((unsigned char *)(*strHndl)[0]+1)); ! 1241: ReleaseResource(strHndl); ! 1242: } ! 1243: ! 1244: strHndl = Get1Resource('STR ',kDeskStrRsrc); ! 1245: if (ResError()!=noErr || !strHndl || !*strHndl) ! 1246: BlockMove(kDefaultDeskString,gDesktopFName,kDefaultSelectString[0]+1); ! 1247: else { ! 1248: BlockMove(*strHndl,&gDesktopFName,(long)((unsigned char *)(*strHndl)[0]+1)); ! 1249: ReleaseResource(strHndl); ! 1250: } ! 1251: } ! 1252: ! 1253: ! 1254: /* do getfile */ ! 1255: ! 1256: static Boolean Share_CustomGet(FSSpec *fSpec) ! 1257: { ! 1258: Point where = {-1,-1}; ! 1259: SFReply reply; ! 1260: DialogPtr theDialog; ! 1261: short item; ! 1262: StandardFileReply sfReply; ! 1263: SFData sfUserData; ! 1264: OSErr err; ! 1265: Boolean targetIsFolder,wasAliased; ! 1266: ! 1267: /* initialize user data area */ ! 1268: ! 1269: sfUserData.replyPtr = &sfReply; ! 1270: sfUserData.oldSelection.vRefNum = -9999; /* init to ridiculous value */ ! 1271: ! 1272: CustomGetFile(Share_FilterAllFiles_UPP,-1,nil,&sfReply,kSFDlg,where,Share_MyDlgHook_UPP, ! 1273: Share_MyModalFilter_UPP,nil,nil,&sfUserData); ! 1274: ! 1275: if (sfReply.sfGood) { ! 1276: err = ResolveAliasFile(&sfReply.sfFile,true,&targetIsFolder,&wasAliased); ! 1277: if (err!=noErr) ! 1278: return false; ! 1279: } ! 1280: ! 1281: err = FSMakeFSSpec(sfReply.sfFile.vRefNum,sfReply.sfFile.parID,sfReply.sfFile.name,fSpec); ! 1282: if (err!=noErr) ! 1283: return false; ! 1284: ! 1285: return sfReply.sfGood; ! 1286: } ! 1287: ! 1288: static pascal short Share_MyDlgHook(short item,DialogPtr theDlg,Ptr userData) ! 1289: { ! 1290: SFDataPtr sfUserData; ! 1291: Boolean hiliteButton; ! 1292: FSSpec curSpec; ! 1293: OSType refCon; ! 1294: ! 1295: refCon = GetWRefCon(theDlg); ! 1296: if (refCon!=sfMainDialogRefCon) ! 1297: return item; ! 1298: ! 1299: sfUserData = (SFDataPtr) userData; ! 1300: ! 1301: if (item==sfHookFirstCall || item==sfHookLastCall) ! 1302: return item; ! 1303: ! 1304: if (item==sfItemVolumeUser) { ! 1305: sfUserData->replyPtr->sfFile.name[0] = '\0'; ! 1306: sfUserData->replyPtr->sfFile.parID = 2; ! 1307: sfUserData->replyPtr->sfIsFolder = false; ! 1308: sfUserData->replyPtr->sfIsVolume = false; ! 1309: sfUserData->replyPtr->sfFlags = 0; ! 1310: item = sfHookChangeSelection; ! 1311: } ! 1312: ! 1313: if (!Share_SameFile(&sfUserData->replyPtr->sfFile,&sfUserData->oldSelection)) { ! 1314: BlockMove(&sfUserData->replyPtr->sfFile,&curSpec,sizeof(FSSpec)); ! 1315: Share_MakeCanonFSSpec(&curSpec); ! 1316: ! 1317: if (curSpec.vRefNum!=sfUserData->oldSelection.vRefNum) ! 1318: Share_GetDeskFolderSpec(&gDeskFolderSpec,curSpec.vRefNum); ! 1319: Share_SetSelectButtonName(curSpec.name,Share_ShouldHiliteSelect(&curSpec),theDlg); ! 1320: ! 1321: BlockMove(&sfUserData->replyPtr->sfFile,&sfUserData->oldSelection,sizeof(FSSpec)); ! 1322: } ! 1323: ! 1324: if (item==kSelectItem) ! 1325: item = sfItemOpenButton; ! 1326: ! 1327: return item; ! 1328: } ! 1329: ! 1330: ! 1331: static pascal Boolean Share_MyModalFilter(DialogPtr theDlg,EventRecord *ev,short *itemHit,Ptr myData) ! 1332: { ! 1333: Boolean evHandled; ! 1334: char keyPressed; ! 1335: OSType refCon; ! 1336: ! 1337: refCon = GetWRefCon(theDlg); ! 1338: if (refCon!=sfMainDialogRefCon) ! 1339: return false; ! 1340: ! 1341: evHandled = false; ! 1342: ! 1343: switch (ev->what) { ! 1344: case keyDown: ! 1345: case autoKey: ! 1346: keyPressed = ev->message & charCodeMask; ! 1347: if ((ev->modifiers & cmdKey) != 0) { ! 1348: switch (keyPressed) { ! 1349: case kSelectKey: ! 1350: Share_HitButton(theDlg,kSelectItem); ! 1351: *itemHit = kSelectItem; ! 1352: evHandled = true; ! 1353: break; ! 1354: } ! 1355: } ! 1356: break; ! 1357: } ! 1358: ! 1359: return evHandled; ! 1360: } ! 1361: ! 1362: ! 1363: static void Share_HitButton(DialogPtr theDlg,short item) ! 1364: { ! 1365: short iType; ! 1366: Handle iHndl; ! 1367: Rect iRect; ! 1368: long fTicks; ! 1369: ! 1370: GetDItem(theDlg,item,&iType,&iHndl,&iRect); ! 1371: HiliteControl((ControlHandle)iHndl,inButton); ! 1372: Delay(5,&fTicks); ! 1373: HiliteControl((ControlHandle)iHndl,0); ! 1374: } ! 1375: ! 1376: ! 1377: static pascal Boolean Share_FilterAllFiles(CInfoPBPtr pb, Ptr myDataPtr) ! 1378: { ! 1379: if (pb->hFileInfo.ioFlAttrib & (1<<4)) /* file is a directory */ ! 1380: return false; ! 1381: ! 1382: return true; ! 1383: } ! 1384: ! 1385: ! 1386: static void Share_SetSelectButtonName(StringPtr selName,Boolean hilited,DialogPtr theDlg) ! 1387: { ! 1388: ControlHandle selectButton; ! 1389: short iType; ! 1390: Handle iHndl; ! 1391: Rect iRect; ! 1392: Str255 storeName,tempLenStr,tempSelName; ! 1393: short btnWidth; ! 1394: ! 1395: BlockMove(selName,tempSelName,selName[0]+1); ! 1396: GetDItem(theDlg,kSelectItem,&iType,&iHndl,&iRect); ! 1397: ! 1398: /* truncate select name to fit in button */ ! 1399: ! 1400: btnWidth = iRect.right - iRect.left; ! 1401: BlockMove(gSelectString,tempLenStr,gSelectString[0]+1); ! 1402: p2cstr(tempLenStr); ! 1403: strcat((char *)tempLenStr," �� "); ! 1404: c2pstr((char *)tempLenStr); ! 1405: btnWidth -= StringWidth(tempLenStr); ! 1406: TruncString(btnWidth,tempSelName,smTruncMiddle); ! 1407: ! 1408: BlockMove(gSelectString,storeName,gSelectString[0]+1); ! 1409: p2cstr(storeName); ! 1410: p2cstr(tempSelName); ! 1411: strcat((char *)storeName," �"); ! 1412: strcat((char *)storeName,(char *)tempSelName); ! 1413: strcat((char *)storeName,"�"); ! 1414: ! 1415: c2pstr((char *)storeName); ! 1416: c2pstr((char *)tempSelName); ! 1417: SetCTitle((ControlHandle)iHndl,storeName); ! 1418: ! 1419: SetDItem(theDlg,kSelectItem,iType,iHndl,&iRect); ! 1420: ! 1421: if (hilited) ! 1422: HiliteControl((ControlHandle)iHndl,0); ! 1423: else ! 1424: HiliteControl((ControlHandle)iHndl,255); ! 1425: } ! 1426: ! 1427: ! 1428: static Boolean Share_SameFile(FSSpec *file1,FSSpec *file2) ! 1429: { ! 1430: if (file1->vRefNum != file2->vRefNum) ! 1431: return false; ! 1432: if (file1->parID != file2->parID) ! 1433: return false; ! 1434: if (!EqualString(file1->name,file2->name,false,true)) ! 1435: return false; ! 1436: ! 1437: return true; ! 1438: } ! 1439: ! 1440: ! 1441: static OSErr Share_GetDeskFolderSpec(FSSpec *fSpec,short vRefNum) ! 1442: { ! 1443: DirInfo infoPB; ! 1444: OSErr err; ! 1445: ! 1446: if (!gHasFindFolder) { ! 1447: fSpec->vRefNum = -9999; ! 1448: return -1; ! 1449: } ! 1450: ! 1451: fSpec->name[0] = '\0'; ! 1452: err = FindFolder(vRefNum,kDesktopFolderType,kDontCreateFolder, ! 1453: &fSpec->vRefNum,&fSpec->parID); ! 1454: if (err!=noErr) ! 1455: return err; ! 1456: ! 1457: return Share_MakeCanonFSSpec(fSpec); ! 1458: } ! 1459: ! 1460: ! 1461: static Boolean Share_ShouldHiliteSelect(FSSpec *fSpec) ! 1462: { ! 1463: if (Share_SameFile(fSpec,&gDeskFolderSpec)) { ! 1464: BlockMove(gDesktopFName,fSpec->name,gDesktopFName[0]+1); ! 1465: return kCanSelectDesktop; ! 1466: } ! 1467: else ! 1468: return true; ! 1469: } ! 1470: ! 1471: static OSErr Share_MakeCanonFSSpec(FSSpec *fSpec) ! 1472: { ! 1473: CInfoPBRec infoPB; ! 1474: OSErr err; ! 1475: ! 1476: if (fSpec->name[0] != '\0') ! 1477: return; ! 1478: ! 1479: infoPB.dirInfo.ioNamePtr = fSpec->name; ! 1480: infoPB.dirInfo.ioVRefNum = fSpec->vRefNum; ! 1481: infoPB.dirInfo.ioDrDirID = fSpec->parID; ! 1482: infoPB.dirInfo.ioFDirIndex = -1; ! 1483: err = PBGetCatInfo(&infoPB,false); ! 1484: fSpec->parID = infoPB.dirInfo.ioDrParID; ! 1485: ! 1486: return err; ! 1487: } ! 1488: ! 1489: static void Share_ResolvePath (FSSpec *fSpec, char *path) ! 1490: { char volname[128]; ! 1491: char dirname[128]; ! 1492: char path_copy[1024]; ! 1493: short the_vRefNum; ! 1494: long the_parID; ! 1495: CInfoPBRec infoPB; ! 1496: ! 1497: volname[0]=0; ! 1498: strcpy(dirname,(char *)fSpec->name); ! 1499: p2cstr((unsigned char *)dirname); ! 1500: ! 1501: strcpy(path,dirname); ! 1502: ! 1503: the_vRefNum=(fSpec->vRefNum); ! 1504: the_parID=(fSpec->parID); ! 1505: ! 1506: infoPB.dirInfo.ioNamePtr = (unsigned char *)volname; ! 1507: infoPB.dirInfo.ioVRefNum = the_vRefNum; ! 1508: infoPB.dirInfo.ioDrDirID = fsRtDirID; ! 1509: infoPB.dirInfo.ioFDirIndex = -1; ! 1510: PBGetCatInfo(&infoPB,false); ! 1511: ! 1512: p2cstr((unsigned char *)volname); ! 1513: ! 1514: while (strcmp(volname,dirname) != 0) ! 1515: { ! 1516: infoPB.dirInfo.ioNamePtr = (unsigned char *)dirname; ! 1517: infoPB.dirInfo.ioVRefNum = the_vRefNum; ! 1518: infoPB.dirInfo.ioDrDirID = the_parID; ! 1519: infoPB.dirInfo.ioFDirIndex = -1; ! 1520: PBGetCatInfo(&infoPB,false); ! 1521: the_parID = infoPB.dirInfo.ioDrParID; ! 1522: ! 1523: p2cstr((unsigned char *)dirname); ! 1524: strcpy(path_copy,dirname); ! 1525: strcat(path_copy,":"); ! 1526: strcat(path_copy,path); ! 1527: strcpy(path,path_copy); ! 1528: } ! 1529: } ! 1530: ! 1531: Boolean ReadPrefs (char *share_path) ! 1532: { OSErr err=noErr; ! 1533: short prefsFolder; ! 1534: Str255 prefsName="\pUAE Preferences"; ! 1535: long prefDirID; ! 1536: short prefvRefNum; ! 1537: FSSpec spec; ! 1538: short home,preffile; ! 1539: Handle share_handle; ! 1540: Handle config_handle; ! 1541: int config_sets[128],count; ! 1542: ! 1543: home = CurResFile(); ! 1544: preffile=0; ! 1545: *share_path=0; ! 1546: ! 1547: err=FindFolder(kOnSystemDisk, kPreferencesFolderType, true, &prefvRefNum, &prefDirID); ! 1548: if (err != noErr) return false; ! 1549: FSMakeFSSpec(prefvRefNum, prefDirID, prefsName, &spec); ! 1550: ! 1551: preffile=FSpOpenResFile(&spec, fsRdWrPerm); ! 1552: if (ResError() != noErr) return false; ! 1553: ! 1554: UseResFile(preffile); ! 1555: ! 1556: if (share_path != 0) ! 1557: { share_handle = Get1Resource('STR ',128); ! 1558: if (ResError() == noErr && share_handle !=0 && *share_handle !=0) ! 1559: { strcpy(share_path,*share_handle); ! 1560: ReleaseResource(share_handle); ! 1561: } ! 1562: } ! 1563: ! 1564: config_handle = Get1Resource('PREF',128); ! 1565: if (ResError() == noErr && config_handle !=0) ! 1566: { BlockMove((Ptr) *config_handle,(Ptr) config_sets,128); ! 1567: ReleaseResource(config_handle); ! 1568: ! 1569: framerate=config_sets[0]; ! 1570: use_slow_mem=config_sets[1]; ! 1571: use_gfxlib=config_sets[2]; ! 1572: automount_uaedev=config_sets[3]; ! 1573: produce_sound=config_sets[4]; ! 1574: fake_joystick=config_sets[5]; ! 1575: screen_res=config_sets[6]; ! 1576: use_quickdraw=config_sets[7]; ! 1577: filesys_vRefNum=config_sets[8]; ! 1578: } ! 1579: ! 1580: UseResFile(home); ! 1581: CloseResFile(preffile); ! 1582: return true; ! 1583: } ! 1584: ! 1585: void CreatePrefs (void) ! 1586: { OSErr err=noErr; ! 1587: short prefsFolder; ! 1588: Str255 prefsName="\pUAE Preferences"; ! 1589: long prefDirID; ! 1590: short prefvRefNum; ! 1591: FSSpec spec; ! 1592: short home,preffile; ! 1593: ! 1594: home = CurResFile(); ! 1595: preffile=0; ! 1596: ! 1597: err=FindFolder(kOnSystemDisk, kPreferencesFolderType, true, &prefvRefNum, &prefDirID); ! 1598: if (err != noErr) return; ! 1599: FSMakeFSSpec(prefvRefNum, prefDirID, prefsName, &spec); ! 1600: ! 1601: err=FSpCreate(&spec, 'mUAE', 'pref', 0); ! 1602: if (err != noErr) return; ! 1603: ! 1604: FSpCreateResFile(&spec, 'mUAE', 'pref', 0); ! 1605: } ! 1606: ! 1607: void WritePrefs (char *share_path) ! 1608: { OSErr err=noErr; ! 1609: short prefsFolder; ! 1610: Str255 prefsName="\pUAE Preferences"; ! 1611: long prefDirID; ! 1612: short prefvRefNum; ! 1613: FSSpec spec; ! 1614: short home,preffile; ! 1615: Handle share_handle; ! 1616: Handle config_handle; ! 1617: int config_sets[128],count; ! 1618: ! 1619: home = CurResFile(); ! 1620: preffile=0; ! 1621: ! 1622: err=FindFolder(kOnSystemDisk, kPreferencesFolderType, true, &prefvRefNum, &prefDirID); ! 1623: if (err != noErr) return; ! 1624: FSMakeFSSpec(prefvRefNum, prefDirID, prefsName, &spec); ! 1625: ! 1626: preffile=FSpOpenResFile(&spec, fsRdWrPerm); ! 1627: if (ResError() != noErr) return; ! 1628: ! 1629: for (count=0;count < 64;count++) config_sets[count]=0; ! 1630: ! 1631: config_sets[0]=framerate; ! 1632: config_sets[1]=use_slow_mem; ! 1633: config_sets[2]=my_use_gfxlib; ! 1634: config_sets[3]=my_automount_uaedev; ! 1635: config_sets[4]=produce_sound; ! 1636: config_sets[5]=fake_joystick; ! 1637: config_sets[6]=my_screen_res; ! 1638: config_sets[7]=my_use_quickdraw; ! 1639: config_sets[8]=filesys_vRefNum; ! 1640: ! 1641: UseResFile(preffile); ! 1642: ! 1643: ! 1644: if (share_path != 0) ! 1645: { share_handle=Get1Resource('STR ',128); ! 1646: if (ResError() != noErr || share_handle == 0) ! 1647: { share_handle=NewHandleClear(1024); ! 1648: strcpy(*share_handle,share_path); ! 1649: AddResource(share_handle,'STR ',128, "\pMac/Amiga sharing path"); ! 1650: WriteResource(share_handle); ! 1651: DetachResource(share_handle); ! 1652: } ! 1653: else ! 1654: { strcpy(*share_handle,share_path); ! 1655: ChangedResource(share_handle); ! 1656: WriteResource(share_handle); ! 1657: ReleaseResource(share_handle); ! 1658: } ! 1659: } ! 1660: ! 1661: config_handle=Get1Resource('PREF',128); ! 1662: if (ResError() != noErr || config_handle == 0) ! 1663: { config_handle=NewHandleClear(1024); ! 1664: BlockMove((Ptr) config_sets,(Ptr) *config_handle,128); ! 1665: AddResource(config_handle,'PREF',128, "\pUAE Preferences"); ! 1666: WriteResource(config_handle); ! 1667: DetachResource(config_handle); ! 1668: } ! 1669: else ! 1670: { BlockMove((Ptr) config_sets,(Ptr) *config_handle,128); ! 1671: ChangedResource(config_handle); ! 1672: WriteResource(config_handle); ! 1673: ReleaseResource(config_handle); ! 1674: } ! 1675: ! 1676: UseResFile(home); ! 1677: CloseResFile(preffile); ! 1678: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.