From: ben Date: Sat, 18 Jan 2003 20:09:21 +0000 (+0000) Subject: Support for saving sessions on the Mac. This is slightly useful even in the X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/commitdiff_plain/b537dd42c1da03890c832e94a4f47369ca3d99af Support for saving sessions on the Mac. This is slightly useful even in the absence of a config dialogue, since it allows me to get Default Settings out. git-svn-id: svn://svn.tartarus.org/sgt/putty@2646 cda61777-01e9-0310-a592-d414129be87e --- diff --git a/mac/mac.c b/mac/mac.c index 52258c36..5751ac8c 100644 --- a/mac/mac.c +++ b/mac/mac.c @@ -1,4 +1,4 @@ -/* $Id: mac.c,v 1.32 2003/01/15 23:30:21 ben Exp $ */ +/* $Id: mac.c,v 1.33 2003/01/18 20:09:21 ben Exp $ */ /* * Copyright (c) 1999 Ben Harris * All rights reserved. @@ -485,6 +485,12 @@ static void mac_menucommand(long result) { case iClose: mac_closewindow(window); goto done; + case iSave: + mac_savesession(); + goto done; + case iSaveAs: + mac_savesessionas(); + goto done; case iQuit: cleanup_exit(0); goto done; @@ -581,10 +587,18 @@ static void mac_adjustmenus(void) { EnableItem(menu, iQuit); switch (mac_windowtype(window)) { + case wSettings: + DisableItem(menu, iSave); /* XXX enable if modified */ + EnableItem(menu, iSaveAs); + menu = GetMenuHandle(mEdit); + DisableItem(menu, 0); + break; case wTerminal: mac_adjusttermmenus(window); break; default: + DisableItem(menu, iSave); + DisableItem(menu, iSaveAs); menu = GetMenuHandle(mEdit); DisableItem(menu, 0); break; diff --git a/mac/mac.h b/mac/mac.h index 99e2df88..b93fd03e 100644 --- a/mac/mac.h +++ b/mac/mac.h @@ -15,6 +15,11 @@ #include "charset.h" +#define PUTTY_CREATOR FOUR_CHAR_CODE('pTTY') +#define INTERNAL_CREATOR FOUR_CHAR_CODE('pTTI') +#define SESS_TYPE FOUR_CHAR_CODE('Sess') +#define SEED_TYPE FOUR_CHAR_CODE('Seed') + struct mac_gestalts { long sysvers; long qdvers; @@ -81,6 +86,8 @@ extern Session *sesslist; /* from macdlg.c */ extern void mac_newsession(void); +extern void mac_savesession(void); +extern void mac_savesessionas(void); extern void mac_clickdlg(WindowPtr, EventRecord *); extern void mac_activatedlg(WindowPtr, EventRecord *); /* from macterm.c */ @@ -100,6 +107,7 @@ extern void mac_closeterm(WindowPtr); extern OSErr get_putty_dir(Boolean makeit, short *pVRefNum, long *pDirID); extern OSErr get_session_dir(Boolean makeit, short *pVRefNum, long *pDirID); extern void *open_settings_r_fsp(FSSpec *); +extern void *open_settings_w_fsp(FSSpec *); /* from macucs.c */ extern void init_ucs(Session *); /* from mtcpnet.c */ diff --git a/mac/macdlg.c b/mac/macdlg.c index ed9b026b..bf7c1e9d 100644 --- a/mac/macdlg.c +++ b/mac/macdlg.c @@ -1,4 +1,4 @@ -/* $Id: macdlg.c,v 1.3 2003/01/18 16:54:25 ben Exp $ */ +/* $Id: macdlg.c,v 1.4 2003/01/18 20:09:21 ben Exp $ */ /* * Copyright (c) 2002 Ben Harris * All rights reserved. @@ -31,6 +31,7 @@ #include #include +#include #include #include @@ -96,6 +97,32 @@ void mac_opensession(void) { return; } +void mac_savesession(void) +{ + + /* Don't remember which file a session goes with yet, so... */ + mac_savesessionas(); +} + +void mac_savesessionas(void) +{ + Session *s = (Session *)GetWRefCon(FrontWindow()); + StandardFileReply sfr; + void *sesshandle; + + StandardPutFile("\pSave session as:", "\puntitled", &sfr); + if (!sfr.sfGood) return; + + if (!sfr.sfReplacing) { + FSpCreateResFile(&sfr.sfFile, PUTTY_CREATOR, SESS_TYPE, sfr.sfScript); + if (ResError() != noErr) return; /* XXX report error */ + } + sesshandle = open_settings_w_fsp(&sfr.sfFile); + if (sesshandle == NULL) return; /* XXX report error */ + save_open_settings(sesshandle, TRUE, &s->cfg); + close_settings_w(sesshandle); +} + void mac_activatedlg(WindowPtr window, EventRecord *event) { DialogItemType itemtype; diff --git a/mac/macstore.c b/mac/macstore.c index 66e82014..75c88763 100644 --- a/mac/macstore.c +++ b/mac/macstore.c @@ -1,4 +1,4 @@ -/* $Id: macstore.c,v 1.10 2003/01/18 16:10:21 ben Exp $ */ +/* $Id: macstore.c,v 1.11 2003/01/18 20:09:21 ben Exp $ */ /* * macstore.c: Macintosh-specific impementation of the interface @@ -11,6 +11,7 @@ #include #include +#include #include #include "putty.h" @@ -18,11 +19,6 @@ #include "mac.h" #include "macresid.h" -#define PUTTY_CREATOR FOUR_CHAR_CODE('pTTY') -#define INTERNAL_CREATOR FOUR_CHAR_CODE('pTTI') -#define SESS_TYPE FOUR_CHAR_CODE('Sess') -#define SEED_TYPE FOUR_CHAR_CODE('Seed') - OSErr FSpGetDirID(FSSpec *f, long *idp, Boolean makeit); @@ -123,30 +119,45 @@ struct write_settings { }; void *open_settings_w(char const *sessionname) { - short sessVRefNum, tmpVRefNum; - long sessDirID, tmpDirID; + short sessVRefNum; + long sessDirID; OSErr error; Str255 psessionname; - struct write_settings *ws; + FSSpec dstfile; - ws = safemalloc(sizeof *ws); error = get_session_dir(kCreateFolder, &sessVRefNum, &sessDirID); - if (error != noErr) goto out; + if (error != noErr) return NULL; c2pstrcpy(psessionname, sessionname); - error = FSMakeFSSpec(sessVRefNum, sessDirID, psessionname, &ws->dstfile); - if (error != noErr && error != fnfErr) goto out; + error = FSMakeFSSpec(sessVRefNum, sessDirID, psessionname, &dstfile); if (error == fnfErr) { - FSpCreateResFile(&ws->dstfile, PUTTY_CREATOR, SESS_TYPE, - smSystemScript); - if ((error = ResError()) != noErr) goto out; - } + FSpCreateResFile(&dstfile, PUTTY_CREATOR, SESS_TYPE, smSystemScript); + if ((error = ResError()) != noErr) return NULL; + } else if (error != noErr) return NULL; + + return open_settings_w_fsp(&dstfile); +} + +/* + * NB: Destination file must exist. + */ +void *open_settings_w_fsp(FSSpec *dstfile) +{ + short tmpVRefNum; + long tmpDirID; + struct write_settings *ws; + OSErr error; + Str255 tmpname; + + ws = smalloc(sizeof *ws); + ws->dstfile = *dstfile; /* Create a temporary file to save to first. */ - error = FindFolder(sessVRefNum, kTemporaryFolderType, kCreateFolder, - &tmpVRefNum, &tmpDirID); + error = FindFolder(ws->dstfile.vRefNum, kTemporaryFolderType, + kCreateFolder, &tmpVRefNum, &tmpDirID); if (error != noErr) goto out; - error = FSMakeFSSpec(tmpVRefNum, tmpDirID, psessionname, &ws->tmpfile); + c2pstrcpy(tmpname, tmpnam(NULL)); + error = FSMakeFSSpec(tmpVRefNum, tmpDirID, tmpname, &ws->tmpfile); if (error != noErr && error != fnfErr) goto out; if (error == noErr) { error = FSpDelete(&ws->tmpfile); diff --git a/mac/macterm.c b/mac/macterm.c index cbf54f53..b24e3d46 100644 --- a/mac/macterm.c +++ b/mac/macterm.c @@ -1,4 +1,4 @@ -/* $Id: macterm.c,v 1.51 2003/01/18 16:54:25 ben Exp $ */ +/* $Id: macterm.c,v 1.52 2003/01/18 20:09:21 ben Exp $ */ /* * Copyright (c) 1999 Simon Tatham * Copyright (c) 1999, 2002 Ben Harris @@ -400,6 +400,9 @@ void mac_adjusttermmenus(WindowPtr window) { long offset; s = (Session *)GetWRefCon(window); + menu = GetMenuHandle(mFile); + DisableItem(menu, iSave); /* XXX enable if modified */ + EnableItem(menu, iSaveAs); menu = GetMenuHandle(mEdit); EnableItem(menu, 0); DisableItem(menu, iUndo); diff --git a/putty.h b/putty.h index 39d94541..da1fb870 100644 --- a/putty.h +++ b/putty.h @@ -474,6 +474,7 @@ void random_destroy_seed(void); * Exports from settings.c. */ void save_settings(char *section, int do_host, Config * cfg); +void save_open_settings(void *sesskey, int do_host, Config *cfg); void load_settings(char *section, int do_host, Config * cfg); void load_open_settings(void *sesskey, int do_host, Config *cfg); void get_sesslist(struct sesslist *, int allocate); diff --git a/settings.c b/settings.c index ed9007da..d20c5bf4 100644 --- a/settings.c +++ b/settings.c @@ -127,13 +127,19 @@ static void wprefs(void *sesskey, char *name, void save_settings(char *section, int do_host, Config * cfg) { - int i; - char *p; void *sesskey; sesskey = open_settings_w(section); if (!sesskey) return; + save_open_settings(sesskey, do_host, cfg); + close_settings_w(sesskey); +} + +void save_open_settings(void *sesskey, int do_host, Config *cfg) +{ + int i; + char *p; write_setting_i(sesskey, "Present", 1); if (do_host) { @@ -327,7 +333,6 @@ void save_settings(char *section, int do_host, Config * cfg) write_setting_i(sesskey, "ScrollbarOnLeft", cfg->scrollbar_on_left); write_setting_s(sesskey, "BoldFont", cfg->boldfont); write_setting_i(sesskey, "ShadowBoldOffset", cfg->shadowboldoffset); - close_settings_w(sesskey); } void load_settings(char *section, int do_host, Config * cfg)