X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/98f59a35ab7c529243c5dfd76af72a8d6e73729d..f89c329410c18fe1f09d843747fad77babb9f89c:/mac/macdlg.c diff --git a/mac/macdlg.c b/mac/macdlg.c index 95f634ed..544d9a19 100644 --- a/mac/macdlg.c +++ b/mac/macdlg.c @@ -1,4 +1,4 @@ -/* $Id: macdlg.c,v 1.5 2003/01/18 20:52:59 ben Exp $ */ +/* $Id$ */ /* * Copyright (c) 2002 Ben Harris * All rights reserved. @@ -30,7 +30,9 @@ */ #include -#include +#include +#include +#include #include #include #include @@ -39,75 +41,193 @@ #include #include "putty.h" +#include "dialog.h" #include "mac.h" #include "macresid.h" #include "storage.h" +static void mac_closedlg(WindowPtr); +static void mac_enddlg(WindowPtr, int); + void mac_newsession(void) { Session *s; + WinInfo *wi; + static struct sesslist sesslist; - /* This should obviously be initialised by other means */ - s = smalloc(sizeof(*s)); + s = snew(Session); memset(s, 0, sizeof(*s)); do_defaults(NULL, &s->cfg); - s->back = &loop_backend; s->hasfile = FALSE; - s->settings_window = GetNewDialog(wSettings, NULL, (WindowPtr)-1); + if (HAVE_COLOR_QD()) + s->settings_window = GetNewCWindow(wSettings, NULL, (WindowPtr)-1); + else + s->settings_window = GetNewWindow(wSettings, NULL, (WindowPtr)-1); + + get_sesslist(&sesslist, TRUE); + s->ctrlbox = ctrl_new_box(); + setup_config_box(s->ctrlbox, &sesslist, FALSE, 0, 0); - SetWRefCon(s->settings_window, (long)s); + s->settings_ctrls.data = &s->cfg; + s->settings_ctrls.end = &mac_enddlg; + macctrl_layoutbox(s->ctrlbox, s->settings_window, &s->settings_ctrls); + + wi = snew(WinInfo); + memset(wi, 0, sizeof(*wi)); + wi->s = s; + wi->mcs = &s->settings_ctrls; + wi->wtype = wSettings; + wi->update = &macctrl_update; + wi->click = &macctrl_click; + wi->key = &macctrl_key; + wi->activate = &macctrl_activate; + wi->adjustmenus = &macctrl_adjustmenus; + wi->close = &mac_closedlg; + SetWRefCon(s->settings_window, (long)wi); ShowWindow(s->settings_window); } -void mac_opensession(void) { +static void mac_closedlg(WindowPtr window) +{ + Session *s = mac_windowsession(window); + + macctrl_close(window); + DisposeWindow(window); + if (s->window == NULL) + sfree(s); +} + +static void mac_enddlg(WindowPtr window, int value) +{ + Session *s = mac_windowsession(window); + + if (value == 0) + mac_closedlg(window); + else { + mac_startsession(s); + mac_closedlg(window); + } +} + +void mac_dupsession(void) +{ + Session *s1 = mac_windowsession(FrontWindow()); + Session *s2; + + s2 = snew(Session); + memset(s2, 0, sizeof(*s2)); + s2->cfg = s1->cfg; + s2->hasfile = s1->hasfile; + s2->savefile = s1->savefile; + + mac_startsession(s2); +} + +static OSErr mac_opensessionfrom(FSSpec *fss) +{ + FInfo fi; Session *s; - StandardFileReply sfr; - static const OSType sftypes[] = { 'Sess', 0, 0, 0 }; void *sesshandle; - int i; + OSErr err; - s = smalloc(sizeof(*s)); + s = snew(Session); memset(s, 0, sizeof(*s)); - StandardGetFile(NULL, 1, sftypes, &sfr); - if (!sfr.sfGood) goto fail; - - sesshandle = open_settings_r_fsp(&sfr.sfFile); - if (sesshandle == NULL) goto fail; - load_open_settings(sesshandle, TRUE, &s->cfg); - close_settings_r(sesshandle); - if (sfr.sfFlags & kIsStationery) + err = FSpGetFInfo(fss, &fi); + if (err != noErr) return err; + if (fi.fdFlags & kIsStationery) s->hasfile = FALSE; else { s->hasfile = TRUE; - s->savefile = sfr.sfFile; + s->savefile = *fss; } - /* - * Select protocol. This is farmed out into a table in a - * separate file to enable an ssh-free variant. - */ - s->back = NULL; - for (i = 0; backends[i].backend != NULL; i++) - if (backends[i].protocol == s->cfg.protocol) { - s->back = backends[i].backend; - break; - } - if (s->back == NULL) { - fatalbox("Unsupported protocol number found"); + sesshandle = open_settings_r_fsp(fss); + if (sesshandle == NULL) { + /* XXX need a way to pass up an error number */ + err = -9999; + goto fail; } + load_open_settings(sesshandle, TRUE, &s->cfg); + close_settings_r(sesshandle); + mac_startsession(s); - return; + return noErr; fail: sfree(s); - return; + return err; +} + +static OSErr mac_openlist(AEDesc docs) +{ + OSErr err; + long ndocs, i; + FSSpec fss; + AEKeyword keywd; + DescType type; + Size size; + + err = AECountItems(&docs, &ndocs); + if (err != noErr) return err; + + for (i = 0; i < ndocs; i++) { + err = AEGetNthPtr(&docs, i + 1, typeFSS, + &keywd, &type, &fss, sizeof(fss), &size); + if (err != noErr) return err;; + err = mac_opensessionfrom(&fss); + if (err != noErr) return err; + } + return noErr; +} + +void mac_opensession(void) +{ + + if (mac_gestalts.navsvers > 0) { + NavReplyRecord navr; + NavDialogOptions navopts; + NavTypeListHandle navtypes; + AEDesc defaultloc = { 'null', NULL }; + AEDesc *navdefault = NULL; + short vol; + long dirid; + FSSpec fss; + + if (NavGetDefaultDialogOptions(&navopts) != noErr) return; + /* XXX should we create sessions dir? */ + if (get_session_dir(FALSE, &vol, &dirid) == noErr && + FSMakeFSSpec(vol, dirid, NULL, &fss) == noErr && + AECreateDesc(typeFSS, &fss, sizeof(fss), &defaultloc) == noErr) + navdefault = &defaultloc; + /* Can't meaningfully preview a saved session yet */ + navopts.dialogOptionFlags &= ~kNavAllowPreviews; + navtypes = (NavTypeListHandle)GetResource('open', open_pTTY); + if (NavGetFile(navdefault, &navr, &navopts, NULL, NULL, NULL, navtypes, + NULL) == noErr && navr.validRecord) + mac_openlist(navr.selection); + NavDisposeReply(&navr); + if (navtypes != NULL) + ReleaseResource((Handle)navtypes); + } +#if !TARGET_API_MAC_CARBON /* XXX Navigation Services */ + else { + StandardFileReply sfr; + static const OSType sftypes[] = { 'Sess', 0, 0, 0 }; + + StandardGetFile(NULL, 1, sftypes, &sfr); + if (!sfr.sfGood) return; + + mac_opensessionfrom(&sfr.sfFile); + /* XXX handle error */ + } +#endif } void mac_savesession(void) { - Session *s = (Session *)GetWRefCon(FrontWindow()); + Session *s = mac_windowsession(FrontWindow()); void *sesshandle; assert(s->hasfile); @@ -119,7 +239,8 @@ void mac_savesession(void) void mac_savesessionas(void) { - Session *s = (Session *)GetWRefCon(FrontWindow()); +#if !TARGET_API_MAC_CARBON /* XXX Navigation Services */ + Session *s = mac_windowsession(FrontWindow()); StandardFileReply sfr; void *sesshandle; @@ -137,34 +258,59 @@ void mac_savesessionas(void) close_settings_w(sesshandle); s->hasfile = TRUE; s->savefile = sfr.sfFile; +#endif } -void mac_activatedlg(WindowPtr window, EventRecord *event) +pascal OSErr mac_aevt_oapp(const AppleEvent *req, AppleEvent *reply, + long refcon) { - DialogItemType itemtype; - Handle itemhandle; - short item; - Rect itemrect; - int active; - - active = (event->modifiers & activeFlag) != 0; - GetDialogItem(window, wiSettingsOpen, &itemtype, &itemhandle, &itemrect); - HiliteControl((ControlHandle)itemhandle, active ? 0 : 255); - DialogSelect(event, &window, &item); + DescType type; + Size size; + + if (AEGetAttributePtr(req, keyMissedKeywordAttr, typeWildCard, + &type, NULL, 0, &size) == noErr) + return errAEParamMissed; + + /* XXX we should do something here. */ + return noErr; } -void mac_clickdlg(WindowPtr window, EventRecord *event) +pascal OSErr mac_aevt_odoc(const AppleEvent *req, AppleEvent *reply, + long refcon) { - short item; - Session *s = (Session *)GetWRefCon(window); - - if (DialogSelect(event, &window, &item)) - switch (item) { - case wiSettingsOpen: - CloseWindow(window); - mac_startsession(s); - break; - } + DescType type; + Size size; + AEDescList docs = { typeNull, NULL }; + OSErr err; + + err = AEGetParamDesc(req, keyDirectObject, typeAEList, &docs); + if (err != noErr) goto out; + + if (AEGetAttributePtr(req, keyMissedKeywordAttr, typeWildCard, + &type, NULL, 0, &size) == noErr) { + err = errAEParamMissed; + goto out; + } + + err = mac_openlist(docs); + + out: + AEDisposeDesc(&docs); + return err; +} + +pascal OSErr mac_aevt_pdoc(const AppleEvent *req, AppleEvent *reply, + long refcon) +{ + DescType type; + Size size; + + if (AEGetAttributePtr(req, keyMissedKeywordAttr, typeWildCard, + &type, NULL, 0, &size) == noErr) + return errAEParamMissed; + + /* We can't meaningfully do anything here. */ + return errAEEventNotHandled; } /*