X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/97cfddb2a752768e525fe56d2fa85bef97641065..02cf40019f8ae19176a73f9220603cc9e28d5224:/mac/mac.c diff --git a/mac/mac.c b/mac/mac.c index d7ac91fd..cea87fbf 100644 --- a/mac/mac.c +++ b/mac/mac.c @@ -1,4 +1,4 @@ -/* $Id: mac.c,v 1.34 2003/01/20 22:55:08 ben Exp $ */ +/* $Id: mac.c,v 1.41 2003/02/01 21:44:05 ben Exp $ */ /* * Copyright (c) 1999 Ben Harris * All rights reserved. @@ -90,7 +90,6 @@ static void mac_adjustmenus(void); static void mac_closewindow(WindowPtr); static void mac_zoomwindow(WindowPtr, short); #pragma noreturn (cleanup_exit) -static pascal OSErr mac_aevt_quit(const AppleEvent *, AppleEvent *, long); struct mac_windows { WindowPtr about; @@ -173,22 +172,7 @@ static void mac_startup(void) { DisposeHandle((Handle)ti); } -#if 0 /* OpenTransport? */ - if (Gestalt(gestaltOpenTpt, &mac_gestalts.otptattr) != noErr || - (mac_gestalts.otptattr & gestaltOpenTptTCPPresentMask) == 0 || - ot_init() != noErr) -#endif - mac_gestalts.otptattr = 0; - if (mac_gestalts.otptattr == 0) { - /* MacTCP? */ - if (Gestalt(FOUR_CHAR_CODE('mtcp'), &mac_gestalts.mtcpvers) != noErr) - mac_gestalts.mtcpvers = 0; - if (mac_gestalts.mtcpvers > 0) { - if (mactcp_init() != noErr) - mac_gestalts.mtcpvers = 0; - } - } else - mac_gestalts.mtcpvers = 0; + sk_init(); /* We've been tested with the Appearance Manager */ if (mac_gestalts.apprvers != 0) @@ -231,6 +215,12 @@ static void mac_startup(void) { } /* Install Apple Event handlers. */ + AEInstallEventHandler(kCoreEventClass, kAEOpenApplication, + NewAEEventHandlerUPP(&mac_aevt_oapp), 0, FALSE); + AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, + NewAEEventHandlerUPP(&mac_aevt_odoc), 0, FALSE); + AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments, + NewAEEventHandlerUPP(&mac_aevt_pdoc), 0, FALSE); AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, NewAEEventHandlerUPP(&mac_aevt_quit), 0, FALSE); } @@ -249,10 +239,7 @@ static void mac_eventloop(void) { mac_event(&event); if (borednow) cleanup_exit(0); - if (mac_gestalts.mtcpvers != 0) - mactcp_poll(); - if (mac_gestalts.otptattr != 0) - ot_poll(); + sk_poll(); mac_pollterm(); } DisposeRgn(cursrgn); @@ -505,6 +492,9 @@ static void mac_menucommand(long result) { case iSaveAs: mac_savesessionas(); goto done; + case iDuplicate: + mac_dupsession(); + goto done; case iQuit: cleanup_exit(0); goto done; @@ -604,6 +594,7 @@ static void mac_adjustmenus(void) { case wSettings: DisableItem(menu, iSave); /* XXX enable if modified */ EnableItem(menu, iSaveAs); + EnableItem(menu, iDuplicate); menu = GetMenuHandle(mEdit); DisableItem(menu, 0); break; @@ -613,6 +604,7 @@ static void mac_adjustmenus(void) { default: DisableItem(menu, iSave); DisableItem(menu, iSaveAs); + DisableItem(menu, iDuplicate); menu = GetMenuHandle(mEdit); DisableItem(menu, 0); break; @@ -651,9 +643,15 @@ static void mac_adjustcursor(RgnHandle cursrgn) { } } -static pascal OSErr mac_aevt_quit(const AppleEvent *req, AppleEvent *reply, +pascal OSErr mac_aevt_quit(const AppleEvent *req, AppleEvent *reply, long refcon) { + DescType type; + Size size; + + if (AEGetAttributePtr(req, keyMissedKeywordAttr, typeWildCard, + &type, NULL, 0, &size) == noErr) + return errAEParamMissed; borednow = 1; return noErr; @@ -743,41 +741,49 @@ void old_keyfile_warning(void) } -char *platform_default_s(char const *name) +FontSpec platform_default_fontspec(char const *name) { + FontSpec ret; long smfs; - Str255 pname; - static char cname[256]; if (!strcmp(name, "Font")) { smfs = GetScriptVariable(smSystemScript, smScriptMonoFondSize); if (smfs == 0) smfs = GetScriptVariable(smRoman, smScriptMonoFondSize); if (smfs != 0) { - GetFontName(HiWord(smfs), pname); - if (pname[0] == 0) - return "Monaco"; - p2cstrcpy(cname, pname); - return cname; - } else - return "Monaco"; + GetFontName(HiWord(smfs), ret.name); + if (ret.name[0] == 0) + memcpy(ret.name, "\pMonaco", 7); + ret.size = LoWord(smfs); + } else { + memcpy(ret.name, "\pMonaco", 7); + ret.size = 9; + } + ret.face = 0; + } else { + ret.name[0] = 0; } + + return ret; +} + +Filename platform_default_filename(const char *name) +{ + Filename ret; + if (!strcmp(name, "LogFileName")) + FSMakeFSSpec(0, 0, "\pputty.log", &ret.fss); + else + memset(&ret, 0, sizeof(ret)); + return ret; +} + +char *platform_default_s(char const *name) +{ return NULL; } int platform_default_i(char const *name, int def) { - long smfs; - - if (!strcmp(name, "FontHeight")) { - smfs = GetScriptVariable(smSystemScript, smScriptMonoFondSize); - if (smfs == 0) - smfs = GetScriptVariable(smRoman, smScriptMonoFondSize); - if (smfs != 0) - return LoWord(smfs); - else - return 9; - } /* Non-raw cut and paste of line-drawing chars works badly on the * current Unix stub implementation of the Unicode functions. @@ -795,6 +801,85 @@ void platform_get_x11_auth(char *display, int *proto, /* SGT: I have no idea whether Mac X servers need anything here. */ } +Filename filename_from_str(const char *str) +{ + Filename ret; + Str255 tmp; + + /* XXX This fails for filenames over 255 characters long. */ + c2pstrcpy(tmp, str); + FSMakeFSSpec(0, 0, tmp, &ret.fss); + return ret; +} + +/* + * Convert a filename to a string for display purposes. + * See pp 2-44--2-46 of IM:Files + * + * XXX static storage considered harmful + */ +const char *filename_to_str(const Filename *fn) +{ + CInfoPBRec pb; + Str255 dirname; + OSErr err; + static char *path = NULL; + char *newpath; + + if (path != NULL) sfree(path); + path = smalloc(fn->fss.name[0]); + p2cstrcpy(path, fn->fss.name); + pb.dirInfo.ioNamePtr = dirname; + pb.dirInfo.ioVRefNum = fn->fss.vRefNum; + pb.dirInfo.ioDrParID = fn->fss.parID; + pb.dirInfo.ioFDirIndex = -1; + do { + pb.dirInfo.ioDrDirID = pb.dirInfo.ioDrParID; + err = PBGetCatInfoSync(&pb); + + /* XXX Assume not A/UX */ + newpath = smalloc(strlen(path) + dirname[0] + 2); + p2cstrcpy(newpath, dirname); + strcat(newpath, ":"); + strcat(newpath, path); + sfree(path); + path = newpath; + } while (pb.dirInfo.ioDrDirID != fsRtDirID); + return path; +} + +int filename_equal(Filename f1, Filename f2) +{ + + return f1.fss.vRefNum == f2.fss.vRefNum && + f1.fss.parID == f2.fss.parID && + f1.fss.name[0] == f2.fss.name[0] && + memcmp(f1.fss.name + 1, f2.fss.name + 1, f1.fss.name[0]) == 0; +} + +int filename_is_null(Filename fn) +{ + + return fn.fss.vRefNum == 0 && fn.fss.parID == 0 && fn.fss.name[0] == 0; +} + +FILE *f_open(Filename fn, char const *mode) +{ + short savevol; + long savedir; + char tmp[256]; + FILE *ret; + + HGetVol(NULL, &savevol, &savedir); + if (HSetVol(NULL, fn.fss.vRefNum, fn.fss.parID) == noErr) { + p2cstrcpy(tmp, fn.fss.name); + ret = fopen(tmp, mode); + } else + ret = NULL; + HSetVol(NULL, savevol, savedir); + return ret; +} + /* * Local Variables: * c-file-style: "simon"