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