-/* $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.
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;
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;
#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;
/* 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 */
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 */
-/* $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.
#include <MacTypes.h>
#include <Dialogs.h>
+#include <Resources.h>
#include <StandardFile.h>
#include <Windows.h>
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;
-/* $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
#include <Resources.h>
#include <TextUtils.h>
+#include <stdio.h>
#include <string.h>
#include "putty.h"
#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);
};
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);
-/* $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
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);
* 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);
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) {
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)