From 06c24bc0efd10e5d329d871be9112fb6ae0309e0 Mon Sep 17 00:00:00 2001 From: ben Date: Wed, 12 Feb 2003 23:53:15 +0000 Subject: [PATCH] Minimal shell of PuTTYgen for Mac. No actual PuTTYgen-specific code there yet, but an absence of PuTTY-specific code. git-svn-id: svn://svn.tartarus.org/sgt/putty@2842 cda61777-01e9-0310-a592-d414129be87e --- Recipe | 4 + mac/mac.c | 119 +---------- mac/mac_res.r | 56 +---- mac/macmisc.c | 160 ++++++++++++++ mac/macpgen.c | 661 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ mac/macpgen.r | 437 ++++++++++++++++++++++++++++++++++++++ mac/macpgrid.h | 44 ++++ 7 files changed, 1309 insertions(+), 172 deletions(-) create mode 100644 mac/macmisc.c create mode 100644 mac/macpgen.c create mode 100644 mac/macpgen.r create mode 100644 mac/macpgrid.h diff --git a/Recipe b/Recipe index e5589445..cb8a8cc7 100644 --- a/Recipe +++ b/Recipe @@ -117,6 +117,7 @@ WINMISC = misc version winstore settings tree234 winnet proxy cmdline + windefs winmisc UXMISC = misc version uxstore settings tree234 uxnet proxy cmdline uxmisc MACMISC = misc version macstore settings tree234 macnet mtcpnet otnet proxy + + macmisc # Character set library, for use in pterm. CHARSET = sbcsdat slookup sbcs utf8 toucs fromucs xenc mimeenc macenc @@ -158,3 +159,6 @@ PuTTY : [M] terminal wcwidth ldiscucs logging be_all mac macdlg macevlog PuTTYtel : [M] terminal wcwidth ldiscucs logging be_nossh mac macdlg macevlog + macterm macucs mac_res.rsrc testback NONSSH MACMISC CHARSET + stricmp vsnprint +PuTTYgen : [M] macpgen sshrsag sshdssg sshprime sshdes sshbn sshmd5 version + + sshrand macnoise sshsha macstore misc sshrsa sshdss macmisc sshpubk + + sshaes sshsh512 import macpgen.rsrc \ No newline at end of file diff --git a/mac/mac.c b/mac/mac.c index c11566d0..78e2803c 100644 --- a/mac/mac.c +++ b/mac/mac.c @@ -1,4 +1,4 @@ -/* $Id: mac.c,v 1.47 2003/02/07 01:38:12 ben Exp $ */ +/* $Id: mac.c,v 1.48 2003/02/12 23:53:15 ben Exp $ */ /* * Copyright (c) 1999 Ben Harris * All rights reserved. @@ -63,18 +63,6 @@ #include "ssh.h" #include "mac.h" -#if TARGET_API_MAC_CARBON -/* - * This is used by (I think) CarbonStdCLib, but only exists in - * CarbonLib 1.1 and later. Muppets. Happily, it's documented to be - * a synonym for NULL. - */ -#include -const CFAllocatorRef kCFAllocatorDefault = NULL; -#else -QDGlobals qd; -#endif - Session *sesslist; static int cold = 1; @@ -773,32 +761,6 @@ void cleanup_exit(int status) exit(status); } -void fatalbox(char *fmt, ...) { - va_list ap; - Str255 stuff; - - va_start(ap, fmt); - /* We'd like stuff to be a Pascal string */ - stuff[0] = vsprintf((char *)(&stuff[1]), fmt, ap); - va_end(ap); - ParamText(stuff, NULL, NULL, NULL); - StopAlert(128, NULL); - cleanup_exit(1); -} - -void modalfatalbox(char *fmt, ...) { - va_list ap; - Str255 stuff; - - va_start(ap, fmt); - /* We'd like stuff to be a Pascal string */ - stuff[0] = vsprintf((char *)(&stuff[1]), fmt, ap); - va_end(ap); - ParamText(stuff, NULL, NULL, NULL); - StopAlert(128, NULL); - cleanup_exit(1); -} - /* This should only kill the current session, not the whole application. */ void connection_fatal(void *fontend, char *fmt, ...) { va_list ap; @@ -906,85 +868,6 @@ 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" diff --git a/mac/mac_res.r b/mac/mac_res.r index cefcfbeb..cdb21437 100644 --- a/mac/mac_res.r +++ b/mac/mac_res.r @@ -1,4 +1,4 @@ -/* $Id: mac_res.r,v 1.26 2003/02/07 01:38:12 ben Exp $ */ +/* $Id: mac_res.r,v 1.27 2003/02/12 23:53:15 ben Exp $ */ /* * Copyright (c) 1999, 2002 Ben Harris * All rights reserved. @@ -41,11 +41,7 @@ /* Get resource IDs we share with C code */ #include "macresid.h" -/* - * Current PuTTY version number. Minor is in BCD - */ -#define VERSION_MAJOR 0x00 -#define VERSION_MINOR 0x53 +#include "version.r" /* * Finder-related resources @@ -814,54 +810,6 @@ resource 'ics8' (FREF_Seed) { $"00FFFFFFFFFFFFFFFFFFFFFFFFFF" }; -resource 'vers' (1, purgeable) { -#ifdef RELEASE - VERSION_MAJOR, VERSION_MINOR, - beta, -#else - VERSION_MAJOR, VERSION_MINOR + 1, - development, -#endif - 0, /* No prerelease version */ - verBritain, -#ifdef RELEASESTR - RELEASESTR, - "Release " RELEASESTR, -#else -#ifdef SNAPSHOTSTR - SNAPSHOTSTR, - "Development snapshot " SNAPSHOTSTR, -#else - "unknown", - "Unidentified build, " $$Date " " $$Time, -#endif -#endif -}; - -resource 'vers' (2, purgeable) { -#ifdef RELEASE - VERSION_MAJOR, VERSION_MINOR, - beta, -#else - VERSION_MAJOR, VERSION_MINOR + 1, - development, -#endif - 0, /* No prerelease version */ - verBritain, -#ifdef RELEASESTR - RELEASESTR, - "PuTTY " RELEASESTR, -#else -#ifdef SNAPSHOTSTR - SNAPSHOTSTR, - "PuTTY snapshot " SNAPSHOTSTR, -#else - "unknown", - "PuTTY", -#endif -#endif -}; - /* * Resources to copy into created files */ diff --git a/mac/macmisc.c b/mac/macmisc.c new file mode 100644 index 00000000..a5cb1f5f --- /dev/null +++ b/mac/macmisc.c @@ -0,0 +1,160 @@ +/* $Id: macmisc.c,v 1.1 2003/02/12 23:53:15 ben Exp $ */ +/* + * Copyright (c) 1999, 2003 Ben Harris + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include +#include +#include +#include +#include + +#include +#include + +#include "putty.h" + +#if TARGET_API_MAC_CARBON +/* + * This is used by (I think) CarbonStdCLib, but only exists in + * CarbonLib 1.1 and later. Muppets. Happily, it's documented to be + * a synonym for NULL. + */ +#include +const CFAllocatorRef kCFAllocatorDefault = NULL; +#else +QDGlobals qd; +#endif + +void fatalbox(char *fmt, ...) { + va_list ap; + Str255 stuff; + + va_start(ap, fmt); + /* We'd like stuff to be a Pascal string */ + stuff[0] = vsprintf((char *)(&stuff[1]), fmt, ap); + va_end(ap); + ParamText(stuff, NULL, NULL, NULL); + StopAlert(128, NULL); + cleanup_exit(1); +} + +void modalfatalbox(char *fmt, ...) { + va_list ap; + Str255 stuff; + + va_start(ap, fmt); + /* We'd like stuff to be a Pascal string */ + stuff[0] = vsprintf((char *)(&stuff[1]), fmt, ap); + va_end(ap); + ParamText(stuff, NULL, NULL, NULL); + StopAlert(128, NULL); + cleanup_exit(1); +} + +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" + * End: + */ diff --git a/mac/macpgen.c b/mac/macpgen.c new file mode 100644 index 00000000..8c6aa2a8 --- /dev/null +++ b/mac/macpgen.c @@ -0,0 +1,661 @@ +/* $Id: macpgen.c,v 1.1 2003/02/12 23:53:15 ben Exp $ */ +/* + * Copyright (c) 1999, 2003 Ben Harris + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* + * macpgen.c - PuTTYgen for Mac OS + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include /* putty.h needs size_t */ +#include /* for vsprintf */ + +#define PUTTY_DO_GLOBALS + +#include "macpgrid.h" +#include "putty.h" +#include "ssh.h" +#include "mac.h" + +static void mac_startup(void); +static void mac_eventloop(void); +#pragma noreturn (mac_eventloop) +static void mac_event(EventRecord *); +static void mac_contentclick(WindowPtr, EventRecord *); +static void mac_growwindow(WindowPtr, EventRecord *); +static void mac_activatewindow(WindowPtr, EventRecord *); +static void mac_activateabout(WindowPtr, EventRecord *); +static void mac_updatewindow(WindowPtr); +static void mac_updatelicence(WindowPtr); +static void mac_keypress(EventRecord *); +static int mac_windowtype(WindowPtr); +static void mac_menucommand(long); +static void mac_openabout(void); +static void mac_openlicence(void); +static void mac_adjustcursor(RgnHandle); +static void mac_adjustmenus(void); +static void mac_closewindow(WindowPtr); +static void mac_zoomwindow(WindowPtr, short); +#pragma noreturn (cleanup_exit) + +struct mac_windows { + WindowPtr about; + WindowPtr licence; +}; + +struct mac_windows windows; +int borednow; +struct mac_gestalts mac_gestalts; + +int main (int argc, char **argv) { + + mac_startup(); + mac_eventloop(); +} + +#pragma noreturn (main) + +static void mac_startup(void) { + Handle menuBar; + TECInfoHandle ti; + +#if !TARGET_API_MAC_CARBON + /* Init Memory Manager */ + MaxApplZone(); + /* Init QuickDraw */ + InitGraf(&qd.thePort); + /* Init Font Manager */ + InitFonts(); + /* Init Window Manager */ + InitWindows(); + /* Init Menu Manager */ + InitMenus(); + /* Init TextEdit */ + TEInit(); + /* Init Dialog Manager */ + InitDialogs(NULL); +#endif + + /* Get base system version (only used if there's no better selector) */ + if (Gestalt(gestaltSystemVersion, &mac_gestalts.sysvers) != noErr || + (mac_gestalts.sysvers &= 0xffff) < 0x700) + fatalbox("PuTTY requires System 7 or newer"); + /* Find out if we've got Color Quickdraw */ + if (Gestalt(gestaltQuickdrawVersion, &mac_gestalts.qdvers) != noErr) + mac_gestalts.qdvers = gestaltOriginalQD; + /* ... and the Appearance Manager? */ + if (Gestalt(gestaltAppearanceVersion, &mac_gestalts.apprvers) != noErr) + if (Gestalt(gestaltAppearanceAttr, NULL) == noErr) + mac_gestalts.apprvers = 0x0100; + else + mac_gestalts.apprvers = 0; +#if TARGET_RT_MAC_CFM + /* Paranoia: Did we manage to pull in AppearanceLib? */ + if (&RegisterAppearanceClient == kUnresolvedCFragSymbolAddress) + mac_gestalts.apprvers = 0; +#endif +#if TARGET_CPU_68K + mac_gestalts.cntlattr = 0; + mac_gestalts.windattr = 0; +#else + /* Mac OS 8.5 Control Manager (proportional scrollbars)? */ + if (Gestalt(gestaltControlMgrAttr, &mac_gestalts.cntlattr) != noErr || + &SetControlViewSize == kUnresolvedCFragSymbolAddress) + mac_gestalts.cntlattr = 0; + /* Mac OS 8.5 Window Manager? */ + if (Gestalt(gestaltWindowMgrAttr, &mac_gestalts.windattr) != noErr || + &SetWindowContentColor == kUnresolvedCFragSymbolAddress) + mac_gestalts.windattr = 0; +#endif + /* Text Encoding Conversion Manager? */ + if ( +#if TARGET_RT_MAC_CFM + &TECGetInfo == kUnresolvedCFragSymbolAddress || +#else + InitializeUnicodeConverter(NULL) != noErr || +#endif + TECGetInfo(&ti) != noErr) + mac_gestalts.encvvers = 0; + else { + mac_gestalts.encvvers = (*ti)->tecVersion; + mac_gestalts.uncvattr = (*ti)->tecUnicodeConverterFeatures; + DisposeHandle((Handle)ti); + } + /* Navigation Services? */ + if (NavServicesAvailable()) + mac_gestalts.navsvers = NavLibraryVersion(); + else + mac_gestalts.navsvers = 0; + + /* We've been tested with the Appearance Manager */ + if (mac_gestalts.apprvers != 0) + RegisterAppearanceClient(); + + menuBar = GetNewMBar(128); + if (menuBar == NULL) + fatalbox("Unable to create menu bar."); + SetMenuBar(menuBar); + AppendResMenu(GetMenuHandle(mApple), 'DRVR'); + mac_adjustmenus(); + DrawMenuBar(); + InitCursor(); + windows.about = NULL; + windows.licence = NULL; + + flags = FLAG_INTERACTIVE; + + /* Install Apple Event handlers. */ +#if 0 + 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); +#endif + AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, + NewAEEventHandlerUPP(&mac_aevt_quit), 0, FALSE); +} + +static void mac_eventloop(void) { + Boolean gotevent; + EventRecord event; + RgnHandle cursrgn; + + cursrgn = NewRgn(); + for (;;) { + mac_adjustcursor(cursrgn); + gotevent = WaitNextEvent(everyEvent, &event, LONG_MAX, cursrgn); + mac_adjustcursor(cursrgn); + if (gotevent) + mac_event(&event); + if (borednow) + cleanup_exit(0); + } + DisposeRgn(cursrgn); +} + +static void mac_event(EventRecord *event) { + short part; + WindowPtr window; + + switch (event->what) { + case mouseDown: + part = FindWindow(event->where, &window); + switch (part) { + case inMenuBar: + mac_adjustmenus(); + mac_menucommand(MenuSelect(event->where)); + break; +#if !TARGET_API_MAC_CARBON + case inSysWindow: + SystemClick(event, window); + break; +#endif + case inContent: + if (window != FrontWindow()) + /* XXX: check for movable modal dboxes? */ + SelectWindow(window); + else + mac_contentclick(window, event); + break; + case inGoAway: + if (TrackGoAway(window, event->where)) + mac_closewindow(window); + break; + case inDrag: + /* XXX: moveable modal check? */ +#if TARGET_API_MAC_CARBON + { + BitMap screenBits; + + GetQDGlobalsScreenBits(&screenBits); + DragWindow(window, event->where, &screenBits.bounds); + } +#else + DragWindow(window, event->where, &qd.screenBits.bounds); +#endif + break; + case inGrow: + mac_growwindow(window, event); + break; + case inZoomIn: + case inZoomOut: + if (TrackBox(window, event->where, part)) + mac_zoomwindow(window, part); + break; + } + break; + case keyDown: + case autoKey: + mac_keypress(event); + break; + case activateEvt: + mac_activatewindow((WindowPtr)event->message, event); + break; + case updateEvt: + mac_updatewindow((WindowPtr)event->message); + break; +#if !TARGET_API_MAC_CARBON + case diskEvt: + if (HiWord(event->message) != noErr) { + Point pt; + + SetPt(&pt, 120, 120); + DIBadMount(pt, event->message); + } + break; +#endif + case kHighLevelEvent: + AEProcessAppleEvent(event); /* errors? */ + break; + } +} + +static void mac_contentclick(WindowPtr window, EventRecord *event) { + short item; + DialogRef dialog; + + switch (mac_windowtype(window)) { + case wAbout: + dialog = GetDialogFromWindow(window); + if (DialogSelect(event, &dialog, &item)) + switch (item) { + case wiAboutLicence: + mac_openlicence(); + break; + } + break; + } +} + +static void mac_growwindow(WindowPtr window, EventRecord *event) { + + switch (mac_windowtype(window)) { + } +} + +static void mac_activatewindow(WindowPtr window, EventRecord *event) { + int active; + + active = (event->modifiers & activeFlag) != 0; + mac_adjustmenus(); + switch (mac_windowtype(window)) { + case wAbout: + mac_activateabout(window, event); + break; + } +} + +static void mac_activateabout(WindowPtr window, EventRecord *event) { + DialogRef dialog; + DialogItemType itemtype; + Handle itemhandle; + short item; + Rect itemrect; + int active; + + dialog = GetDialogFromWindow(window); + active = (event->modifiers & activeFlag) != 0; + GetDialogItem(dialog, wiAboutLicence, &itemtype, &itemhandle, &itemrect); + HiliteControl((ControlHandle)itemhandle, active ? 0 : 255); + DialogSelect(event, &dialog, &item); +} + +static void mac_updatewindow(WindowPtr window) +{ +#if TARGET_API_MAC_CARBON + RgnHandle rgn; +#endif + + switch (mac_windowtype(window)) { + case wAbout: + BeginUpdate(window); +#if TARGET_API_MAC_CARBON + rgn = NewRgn(); + GetPortVisibleRegion(GetWindowPort(window), rgn); + UpdateDialog(GetDialogFromWindow(window), rgn); + DisposeRgn(rgn); +#else + UpdateDialog(window, window->visRgn); +#endif + EndUpdate(window); + break; + case wLicence: + mac_updatelicence(window); + break; + } +} + +static void mac_updatelicence(WindowPtr window) +{ + Handle h; + int len; + long fondsize; + Rect textrect; + + SetPort((GrafPtr)GetWindowPort(window)); + BeginUpdate(window); + fondsize = GetScriptVariable(smRoman, smScriptSmallFondSize); + TextFont(HiWord(fondsize)); + TextSize(LoWord(fondsize)); + h = Get1Resource('TEXT', wLicence); + len = GetResourceSizeOnDisk(h); +#if TARGET_API_MAC_CARBON + GetPortBounds(GetWindowPort(window), &textrect); +#else + textrect = window->portRect; +#endif + if (h != NULL) { + HLock(h); + TETextBox(*h, len, &textrect, teFlushDefault); + HUnlock(h); + } + EndUpdate(window); +} + +/* + * Work out what kind of window we're dealing with. + */ +static int mac_windowtype(WindowPtr window) +{ + +#if !TARGET_API_MAC_CARBON + if (GetWindowKind(window) < 0) + return wDA; +#endif + return ((WinInfo *)GetWRefCon(window))->wtype; +} + +/* + * Handle a key press + */ +static void mac_keypress(EventRecord *event) { + WindowPtr window; + + window = FrontWindow(); + if (event->what == keyDown && (event->modifiers & cmdKey)) { + mac_adjustmenus(); + mac_menucommand(MenuKey(event->message & charCodeMask)); + } else { + switch (mac_windowtype(window)) { + } + } +} + +static void mac_menucommand(long result) { + short menu, item; + WindowPtr window; +#if !TARGET_API_MAC_CARBON + Str255 da; +#endif + + menu = HiWord(result); + item = LoWord(result); + window = FrontWindow(); + /* Things which do the same whatever window we're in. */ + switch (menu) { + case mApple: + switch (item) { + case iAbout: + mac_openabout(); + goto done; +#if !TARGET_API_MAC_CARBON + default: + GetMenuItemText(GetMenuHandle(mApple), item, da); + OpenDeskAcc(da); + goto done; +#endif + } + break; + case mFile: + switch (item) { + case iClose: + mac_closewindow(window); + goto done; + case iQuit: + cleanup_exit(0); + goto done; + } + break; + } + /* If we get here, handling is up to window-specific code. */ + switch (mac_windowtype(window)) { + } + done: + HiliteMenu(0); +} + +static void mac_openabout(void) { + DialogItemType itemtype; + Handle item; + VersRecHndl vers; + Rect box; + StringPtr longvers; + WinInfo *wi; + + if (windows.about) + SelectWindow(windows.about); + else { + windows.about = + GetDialogWindow(GetNewDialog(wAbout, NULL, (WindowPtr)-1)); + wi = smalloc(sizeof(*wi)); + wi->s = NULL; + wi->wtype = wAbout; + SetWRefCon(windows.about, (long)wi); + vers = (VersRecHndl)Get1Resource('vers', 1); + if (vers != NULL && *vers != NULL) { + longvers = (*vers)->shortVersion + (*vers)->shortVersion[0] + 1; + GetDialogItem(GetDialogFromWindow(windows.about), wiAboutVersion, + &itemtype, &item, &box); + assert(itemtype & kStaticTextDialogItem); + SetDialogItemText(item, longvers); + } + ShowWindow(windows.about); + } +} + +static void mac_openlicence(void) { + WinInfo *wi; + + if (windows.licence) + SelectWindow(windows.licence); + else { + windows.licence = GetNewWindow(wLicence, NULL, (WindowPtr)-1); + wi = smalloc(sizeof(*wi)); + wi->s = NULL; + wi->wtype = wLicence; + SetWRefCon(windows.licence, (long)wi); + ShowWindow(windows.licence); + } +} + +static void mac_closewindow(WindowPtr window) { + + switch (mac_windowtype(window)) { +#if !TARGET_API_MAC_CARBON + case wDA: + CloseDeskAcc(GetWindowKind(window)); + break; +#endif + case wAbout: + windows.about = NULL; + DisposeDialog(GetDialogFromWindow(window)); + break; + case wLicence: + windows.licence = NULL; + DisposeWindow(window); + break; + } +} + +static void mac_zoomwindow(WindowPtr window, short part) { + + /* FIXME: do something */ +} + +/* + * Make the menus look right before the user gets to see them. + */ +#if TARGET_API_MAC_CARBON +#define EnableItem EnableMenuItem +#define DisableItem DisableMenuItem +#endif +static void mac_adjustmenus(void) { + WindowPtr window; + MenuHandle menu; + + window = FrontWindow(); + menu = GetMenuHandle(mApple); + EnableItem(menu, 0); + EnableItem(menu, iAbout); + + menu = GetMenuHandle(mFile); + EnableItem(menu, 0); + EnableItem(menu, iNew); + if (window != NULL) + EnableItem(menu, iClose); + else + DisableItem(menu, iClose); + EnableItem(menu, iQuit); + + switch (mac_windowtype(window)) { + default: + DisableItem(menu, iSave); + DisableItem(menu, iSaveAs); + menu = GetMenuHandle(mEdit); + DisableItem(menu, 0); + menu = GetMenuHandle(mWindow); + DisableItem(menu, 0); /* Until we get more than 1 item on it. */ + break; + } + DrawMenuBar(); +} + +/* + * Make sure the right cursor's being displayed. + */ +static void mac_adjustcursor(RgnHandle cursrgn) { + Point mouse; + WindowPtr window, front; + short part; +#if TARGET_API_MAC_CARBON + Cursor arrow; + RgnHandle visrgn; +#endif + + GetMouse(&mouse); + LocalToGlobal(&mouse); + part = FindWindow(mouse, &window); + front = FrontWindow(); + if (part != inContent || window == NULL || window != front) { + /* Cursor isn't in the front window, so switch to arrow */ +#if TARGET_API_MAC_CARBON + GetQDGlobalsArrow(&arrow); + SetCursor(&arrow); +#else + SetCursor(&qd.arrow); +#endif + SetRectRgn(cursrgn, SHRT_MIN, SHRT_MIN, SHRT_MAX, SHRT_MAX); + if (front != NULL) { +#if TARGET_API_MAC_CARBON + visrgn = NewRgn(); + GetPortVisibleRegion(GetWindowPort(front), visrgn); + DiffRgn(cursrgn, visrgn, cursrgn); + DisposeRgn(visrgn); +#else + DiffRgn(cursrgn, front->visRgn, cursrgn); +#endif + } + } else { + switch (mac_windowtype(window)) { + default: +#if TARGET_API_MAC_CARBON + GetQDGlobalsArrow(&arrow); + SetCursor(&arrow); + GetPortVisibleRegion(GetWindowPort(window), cursrgn); +#else + SetCursor(&qd.arrow); + CopyRgn(window->visRgn, cursrgn); +#endif + break; + } + } +} + +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; +} + +void cleanup_exit(int status) +{ + +#if !TARGET_RT_MAC_CFM + if (mac_gestalts.encvvers != 0) + TerminateUnicodeConverter(); +#endif + exit(status); +} + +/* + * Local Variables: + * c-file-style: "simon" + * End: + */ diff --git a/mac/macpgen.r b/mac/macpgen.r new file mode 100644 index 00000000..6d3107ba --- /dev/null +++ b/mac/macpgen.r @@ -0,0 +1,437 @@ +/* $Id: macpgen.r,v 1.1 2003/02/12 23:53:15 ben Exp $ */ +/* + * Copyright (c) 1999, 2002 Ben Harris + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* PuTTYgen resources */ + +/* + * The space after the # for system includes is to stop mkfiles.pl + * trying to chase them (Rez doesn't support the angle-bracket + * syntax). + */ + +# include "Types.r" +# include "Dialogs.r" +# include "Palettes.r" +# include "Script.r" + + +/* Get resource IDs we share with C code */ +#include "macpgrid.h" + +#include "version.r" + +/* + * Finder-related resources + */ + +/* 'pGen' is now registered with Apple as PuTTYgen's signature */ + +type 'pGen' as 'STR '; + +resource 'pGen' (0, purgeable) { + "PuTTYgen experimental Mac port" +}; + +resource 'SIZE' (-1) { + reserved, + ignoreSuspendResumeEvents, + reserved, + canBackground, + needsActivateOnFGSwitch, + backgroundAndForeground, + dontGetFrontClicks, + ignoreAppDiedEvents, + is32BitCompatible, + isHighLevelEventAware, + localandRemoteHLEvents, + isStationeryAware, + dontUseTextEditServices, + reserved, + reserved, + reserved, + 1024 * 1024, /* Minimum size */ + 1024 * 1024, /* Preferred size */ +}; + +#define FREF_APPL 128 +#define FREF_Seed 132 + +resource 'FREF' (FREF_APPL, purgeable) { + /* The application itself */ + 'APPL', FREF_APPL, "" +}; + +resource 'FREF' (FREF_Seed, purgeable) { + /* Random seed */ + 'Seed', FREF_Seed, "" +}; + +/* "Internal" file types, which can't be opened */ +resource 'BNDL' (129, purgeable) { + 'pTTI', 0, + { + 'ICN#', { + FREF_Seed, FREF_Seed, + }, + 'FREF', { + FREF_Seed, FREF_Seed, + }; + }; +}; + +resource 'kind' (129) { + 'pTTI', + verBritain, + { + 'Seed', "PuTTY random number seed", + } +}; + +/* Icons, courtesy of DeRez */ + +/* Random seed icon */ + +resource 'ICN#' (FREF_Seed, purgeable) { + { /* array: 2 elements */ + /* [1] */ + $"1FFFFC00 18F36600 161EF500 1CC92C80" + $"1CF2EC40 10662C20 108E07F0 151F0490" + $"1E00C4F0 1803BBD0 1FC5BE10 108B5A90" + $"1B3C4F50 1267AC90 14B60470 1BB791B0" + $"17F4D2B0 1DC1F830 1B029450 1B753DD0" + $"145A8170 11390DD0 1E15A8B0 1CC4CD90" + $"154ECED0 15C9CF30 172CDB50 12617970" + $"15E45C90 1D4B9890 15CE4430 1FFFFFF0", + /* [2] */ + $"1FFFFC00 1FFFFE00 1FFFFF00 1FFFFF80" + $"1FFFFFC0 1FFFFFE0 1FFFFFF0 1FFFFFF0" + $"1FFFFFF0 1FFFFFF0 1FFFFFF0 1FFFFFF0" + $"1FFFFFF0 1FFFFFF0 1FFFFFF0 1FFFFFF0" + $"1FFFFFF0 1FFFFFF0 1FFFFFF0 1FFFFFF0" + $"1FFFFFF0 1FFFFFF0 1FFFFFF0 1FFFFFF0" + $"1FFFFFF0 1FFFFFF0 1FFFFFF0 1FFFFFF0" + $"1FFFFFF0 1FFFFFF0 1FFFFFF0 1FFFFFF0" + } +}; +resource 'icl4' (FREF_Seed) { + $"000FFFFFFFFFFFFFFFFFFF0000000000" + $"000FFC0CFFFF0CFF1FFC0FF000000000" + $"000F0FF0C0CFFFF1FFFFCFCF00000000" + $"000FFF0CFF0CF11F0CFCFFCCF0000000" + $"000FFFC0FFFF11F0FFF0FFCCCF000000" + $"000F0C0C0FF11FFC0CFCFFCCCCF00000" + $"000FC0C0F111FFF0C0C0CFFFFFFF0000" + $"000F0F0F111FFFFF0C0C0F0CFC0F0000" + $"000FFFF111111111FFC0CFC0FFFF0000" + $"000FF111111111FFFCFFF0FFFF0F0000" + $"000FFFFFFF111FCFF0FFFFF0C0CF0000" + $"000F0C0CF111FCFF0F0FFCFCFC0F0000" + $"000FF0FF11FFFFC0CFC0FFFFCFCF0000" + $"000F0CF11FFC0FFFFCFCFF0CFC0F0000" + $"000FCF11F0FFCFF0C0C0CFC0CFFF0000" + $"000FF1FFFCFF0FFFFC0F0C0FFCFF0000" + $"000F1FFFFFFFCFC0FFCFC0F0F0FF0000" + $"000FFF0FFF0C0C0FFFFFFC0C0CFF0000" + $"000FF0FFC0C0C0F0F0CF0FC0CFCF0000" + $"000FFCFF0FFF0F0F0CFFFF0FFF0F0000" + $"000FCFC0CF0FF0F0F0C0C0CFCFFF0000" + $"000F0C0F0CFFFC0F0C0CFF0FFF0F0000" + $"000FFFF0C0CFCFCFF0F0F0C0F0FF0000" + $"000FFF0CFF0C0F0CFF0CFF0FFC0F0000" + $"000FCFCF0FC0FFF0FFC0FFF0FFCF0000" + $"000F0F0FFF0CFC0FFF0CFFFF0CFF0000" + $"000FCFFFC0F0FFC0FFCFF0FFCFCF0000" + $"000F0CFC0FFC0C0F0FFFFC0F0FFF0000" + $"000FCFCFFFF0CFC0CFCFFFC0F0CF0000" + $"000FFF0F0F0CF0FFFC0FFC0CFC0F0000" + $"000FCFCFFFC0FFF0CFC0CFC0C0FF0000" + $"000FFFFFFFFFFFFFFFFFFFFFFFFF" +}; +resource 'icl8' (FREF_Seed) { + $"000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000" + $"000000FFFFF5F5F5FFFFFFFFF5F5FFFF05FFFFF5F5FFFF000000000000000000" + $"000000FFF5FFFFF5F5F5F5FFFFFFFF05FFFFFFFFF5FF2BFF0000000000000000" + $"000000FFFFFFF5F5FFFFF5F5FF0505FF0000FFF5FFFF2B2BFF00000000000000" + $"000000FFFFFFF5F5FFFFFFFF0505FFF5FFFFFFF5FFFF2B2B2BFF000000000000" + $"000000FFF5F5F5F5F5FFFF0505FFFFF5F5F5FFF5FFFF2B2B2B2BFF0000000000" + $"000000FFF5F5F5F5FF050505FFFFFFF5F5F5F5F5F5FFFFFFFFFFFFFF00000000" + $"000000FFF5FFF5FF050505FFFFFFFFFFF5F5F5F5F5FFF5F5FFF5F5FF00000000" + $"000000FFFFFFFF050505050505050505FFFFF5F5F5FFF5F5FFFFFFFF00000000" + $"000000FFFF050505050505050505FFFFFFF5FFFFFFF5FFFFFFFFF5FF00000000" + $"000000FFFFFFFFFFFFFF050505FFF5FFFFF5FFFFFFFFFFF5F5F5F5FF00000000" + $"000000FFF5F5F5F5FF050505FFF5FFFFF5FFF5FFFFF5FFF5FFF5F5FF00000000" + $"000000FFFFF5FFFF0505FFFFFFFFF5F5F5FFF5F5FFFFFFFFF5FFF5FF00000000" + $"000000FFF5F5FF0505FFFFF5F5FFFFFFFFF5FFF5FFFFF5F5FFF5F5FF00000000" + $"000000FFF5FF0505FFF5FFFFF5FFFFF5F5F5F5F5F5FFF5F5F5FFFFFF00000000" + $"000000FFFF05FFFFFFF5FFFFF5FFFFFFFFF5F5FFF5F5F5FFFFF5FFFF00000000" + $"000000FF05FFFFFFFFFFFFFFF5FFF5F5FFFFF5FFF5F5FFF5FFF5FFFF00000000" + $"000000FFFFFFF5FFFFFFF5F5F5F5F5FFFFFFFFFFFFF5F5F5F5F5FFFF00000000" + $"000000FFFFF5FFFFF5F5F5F5F5F5FF00FFF5F5FFF5FFF5F5F5FFF5FF00000000" + $"000000FFFFF5FFFFF5FFFFFFF5FF00FFF5F5FFFFFFFFF5FFFFFFF5FF00000000" + $"000000FFF5FFF5F5F5FFF5FFFF00FF00FFF5F5F5F5F5F5FFF5FFFFFF00000000" + $"000000FFF5F5F5FFF5F5FFFFFF0000FFF5F5F5F5FFFFF5FFFFFF00FF00000000" + $"000000FFFFFFFFF5F5F5F5FFF5FF00FFFFF5FFF5FFF5F5F5FF00FFFF00000000" + $"000000FFFFFFF5F5FFFFF5F5F5FF0000FFFFF5F5FFFFF5FFFF0000FF00000000" + $"000000FFF5FFF5FFF5FFF5F5FFFFFF00FFFFF5F5FFFFFFF5FFFF00FF00000000" + $"000000FFF5FFF5FFFFFFF5F5FFF5F5FFFFFFF5F5FFFFFFFFF5F5FFFF00000000" + $"000000FFF5FFFFFFF5F5FFF5FFFFF5F5FFFFF5FFFFF5FFFFF5FFF5FF00000000" + $"000000FFF5F5FFF5F5FFFFF5F5F5F5FFF5FFFFFFFFF5F5FFF5FFFFFF00000000" + $"000000FFF5FFF5FFFFFFFFF5F5FFF5F5F5FFF5FFFFFFF5F5FFF5F5FF00000000" + $"000000FFFFFFF5FFF5FFF5F5FFF5FFFFFFF5F5FFFFF5F5F5FFF5F5FF00000000" + $"000000FFF5FFF5FFFFFFF5F5FFFFFFF5F5FFF5F5F5FFF5F5F5F5FFFF00000000" + $"000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" +}; +resource 'ics#' (FREF_Seed) { + { /* array: 2 elements */ + /* [1] */ + $"7FE0 56B0 59A8 637C 51DC 6794 59AC 76EC" + $"7224 7C6C 743C 71AC 505C 459C 4424 7FFC", + /* [2] */ + $"7FE0 7FF0 7FF8 7FFC 7FFC 7FFC 7FFC 7FFC" + $"7FFC 7FFC 7FFC 7FFC 7FFC 7FFC 7FFC 7FFC" + } +}; +resource 'ics4' (FREF_Seed) { + $"0FFFFFFFFFF00000" + $"0F0F0FF1FCFF0000" + $"0FCFF11FF0FCF000" + $"0FF111FF0FFFFF00" + $"0FCF111FFFCFFF00" + $"0FF11FFFFC0F0F00" + $"0F1FF0CFF0F0FF00" + $"0FFF0FFCFFFCFF00" + $"0FFFC0F0C0F0CF00" + $"0FFFFF0C0FFCFF00" + $"0FFFCFC0C0FFFF00" + $"0FFF0C0FFCFCFF00" + $"0FCFC0C0CFCFFF00" + $"0F0C0F0FFC0FFF00" + $"0FC0CFC0C0F0CF00" + $"0FFFFFFFFFFFFF" +}; +resource 'ics8' (FREF_Seed) { + $"00FFFFFFFFFFFFFFFFFFFF0000000000" + $"00FFF5FFF5FFFF05FFF5FFFF00000000" + $"00FFF5FFFF0505FFFFF5FF2BFF000000" + $"00FFFF050505FFFFF5FFFFFFFFFF0000" + $"00FFF5FF050505FFFFFFF5FFFFFF0000" + $"00FFFF0505FFFFFFFFF5F5FFF5FF0000" + $"00FF05FFFFF5F5FFFFF5FFF5FFFF0000" + $"00FFFFFFF5FFFFF5FFFFFFF5FFFF0000" + $"00FFFFFFF5F5FFF5F5F5FFF5F5FF0000" + $"00FFFFFFFFFFF5F5F5FFFFF5FFFF0000" + $"00FFFFFFF5FFF5F5F5F5FFFFFFFF0000" + $"00FFFFFFF5F5F5FFFFF5FFF5FFFF0000" + $"00FFF5FFF5F5F5F5F5FFF5FFFFFF0000" + $"00FFF5F5F5FFF5FFFFF5F5FFFFFF0000" + $"00FFF5F5F5FFF5F5F5F5FFF5F5FF0000" + $"00FFFFFFFFFFFFFFFFFFFFFFFFFF" +}; + +/* + * Application-missing message string, for random seed and host key database + * files. + */ +resource 'STR ' (-16397, purgeable) { + "This file is used internally by PuTTY. It cannot be opened." +}; + + +/* + * Internal resources + */ + +/* Menu bar */ + +resource 'MBAR' (MBAR_Main, preload) { + { mApple, mFile, mEdit, mWindow } +}; + +resource 'MENU' (mApple, preload) { + mApple, + textMenuProc, + 0b11111111111111111111111111111101, + enabled, + apple, + { + "About PuTTYgen\0xc9", noicon, nokey, nomark, plain, + "-", noicon, nokey, nomark, plain, + } +}; + +resource 'MENU' (mFile, preload) { + mFile, + textMenuProc, + 0b11111111111111111111111101111011, + enabled, + "File", + { + "New", noicon, "N", nomark, plain, + "Open\0xc9", noicon, "O", nomark, plain, + "-", noicon, nokey, nomark, plain, + "Close", noicon, "W", nomark, plain, + "Save", noicon, "S", nomark, plain, + "Save As\0xc9", noicon, nokey, nomark, plain, + "-", noicon, nokey, nomark, plain, + "Quit", noicon, "Q", nomark, plain, + } +}; + +resource 'MENU' (mEdit, preload) { + mEdit, + textMenuProc, + 0b11111111111111111111111111111101, + enabled, + "Edit", + { + "Undo", noicon, "Z", nomark, plain, + "-", noicon, nokey, nomark, plain, + "Cut", noicon, "X", nomark, plain, + "Copy", noicon, "C", nomark, plain, + "Paste", noicon, "V", nomark, plain, + "Clear", noicon, nokey, nomark, plain, + "Select All", noicon, "A", nomark, plain, + } +}; + +resource 'MENU' (mWindow, preload) { + mWindow, + textMenuProc, + 0b11111111111111111111111111111111, + enabled, + "Window", + { + } +}; + +/* Fatal error box. Stolen from the Finder. */ + +resource 'ALRT' (wFatal, "fatalbox", purgeable) { + {54, 67, 152, 435}, + wFatal, + beepStages, + alertPositionMainScreen +}; + +resource 'DITL' (wFatal, "fatalbox", purgeable) { + { /* array DITLarray: 3 elements */ + /* [1] */ + {68, 299, 88, 358}, + Button { + enabled, + "OK" + }, + /* [2] */ + {68, 227, 88, 286}, + StaticText { + disabled, + "" + }, + /* [3] */ + {7, 74, 55, 358}, + StaticText { + disabled, + "^0" + } + } +}; + +/* "About" box */ + +resource 'DLOG' (wAbout, "about", purgeable) { + { 0, 0, 120, 240 }, + noGrowDocProc, + invisible, + goAway, + wAbout, /* RefCon -- identifies the window to PuTTY */ + wAbout, /* DITL ID */ + "About PuTTYgen", + alertPositionMainScreen +}; + +resource 'dlgx' (wAbout, "about", purgeable) { + versionZero { + kDialogFlagsUseThemeBackground | kDialogFlagsUseThemeControls + } +}; + +resource 'DITL' (wAbout, "about", purgeable) { + { + { 87, 13, 107, 227 }, + Button { enabled, "View Licence" }, + { 13, 13, 29, 227 }, + StaticText { disabled, "PuTTYgen"}, + { 42, 13, 74, 227 }, + StaticText { disabled, "Some version or other\n" + "Copyright © 1997-9 Simon Tatham"}, + } +}; + +/* Licence box */ + +resource 'WIND' (wLicence, "licence", purgeable) { + { 0, 0, 250, 400 }, + noGrowDocProc, + visible, + goAway, + wLicence, + "PuTTYgen Licence", + alertPositionParentWindowScreen +}; + +type 'TEXT' { + string; +}; + +resource 'TEXT' (wLicence, "licence", purgeable) { + "Copyright 1997-2003 Simon Tatham.\n" + "\n" + "Portions copyright Robert de Bath, Joris van Rantwijk, Delian" + "Delchev, Andreas Schultz, Jeroen Massar, Wez Furlong, Nicolas Barry," + "Justin Bradford, Ben Harris, and CORE SDI S.A.\n" + "\n" + "Permission is hereby granted, free of charge, to any person " + "obtaining a copy of this software and associated documentation " + "files (the \"Software\"), to deal in the Software without " + "restriction, including without limitation the rights to use, " + "copy, modify, merge, publish, distribute, sublicense, and/or " + "sell copies of the Software, and to permit persons to whom the " + "Software is furnished to do so, subject to the following " + "conditions:\n\n" + + "The above copyright notice and this permission notice shall be " + "included in all copies or substantial portions of the Software.\n\n" + + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, " + "EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF " + "MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND " + "NONINFRINGEMENT. IN NO EVENT SHALL SIMON TATHAM BE LIABLE FOR " + "ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF " + "CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN " + "CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE " + "SOFTWARE." +}; diff --git a/mac/macpgrid.h b/mac/macpgrid.h new file mode 100644 index 00000000..edf6d530 --- /dev/null +++ b/mac/macpgrid.h @@ -0,0 +1,44 @@ +/* $Id: macpgrid.h,v 1.1 2003/02/12 23:53:15 ben Exp $ */ + +/* + * macpgrid.h -- Mac resource IDs for PuTTYgen + * + * This file is shared by C and Rez source files + */ + +/* Menu bar IDs */ +#define MBAR_Main 128 + +/* Menu IDs */ +#define mApple 128 +#define mFile 129 +#define mEdit 130 +#define mWindow 131 + +/* Menu Items */ +/* Apple menu */ +#define iAbout 1 +/* File menu */ +#define iNew 1 +#define iOpen 2 +#define iClose 4 +#define iSave 5 +#define iSaveAs 6 +#define iQuit 8 +/* Edit menu */ +#define iUndo 1 +#define iCut 3 +#define iCopy 4 +#define iPaste 5 +#define iClear 6 +#define iSelectAll 7 +/* Window menu */ + +/* Window types (and resource IDs) */ +#define wNone 0 /* Dummy value for no window */ +#define wDA 1 /* Dummy value for desk accessory */ +#define wFatal 128 +#define wAbout 129 +#define wiAboutLicence 1 +#define wiAboutVersion 3 +#define wLicence 131 -- 2.11.0