X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/f854b482e4de775e380033bbea7436732311d1ce..ee5e66d8ffb8750a588db17306acfd3193cc10a9:/mac/macdlg.c diff --git a/mac/macdlg.c b/mac/macdlg.c index ad7a1ffa..0b28cf9f 100644 --- a/mac/macdlg.c +++ b/mac/macdlg.c @@ -1,4 +1,4 @@ -/* $Id: macdlg.c,v 1.12 2003/02/15 16:22:15 ben Exp $ */ +/* $Id$ */ /* * Copyright (c) 2002 Ben Harris * All rights reserved. @@ -32,57 +32,178 @@ #include #include #include -#include #include #include #include +#include #include #include #include #include "putty.h" +#include "dialog.h" #include "mac.h" #include "macresid.h" #include "storage.h" -static void mac_clickdlg(WindowPtr, EventRecord *); -static void mac_activatedlg(WindowPtr, EventRecord *); -static void mac_updatedlg(WindowPtr); -static void mac_adjustdlgmenus(WindowPtr); +static void mac_config(int); +static void mac_closedlg(WindowPtr); +static void mac_enddlg_config(WindowPtr, int); +static void mac_enddlg_reconfig(WindowPtr, int); void mac_newsession(void) { + mac_config(FALSE); +} + +void mac_reconfig(void) +{ + mac_config(TRUE); +} + +static void mac_config(int midsession) +{ Session *s; WinInfo *wi; + Str255 mactitle; + char *str; + + if (midsession) { + s = mac_windowsession(FrontWindow()); + } else { + s = snew(Session); + memset(s, 0, sizeof(*s)); + do_defaults(NULL, &s->cfg); + s->hasfile = FALSE; + s->session_closed = FALSE; + } - /* This should obviously be initialised by other means */ - s = smalloc(sizeof(*s)); - memset(s, 0, sizeof(*s)); - do_defaults(NULL, &s->cfg); - s->hasfile = FALSE; + /* Copy the configuration somewhere else in case this is a * + * reconfiguration and the user cancels the operation */ + + s->temp_cfg = s->cfg; + + if (HAVE_COLOR_QD()) + s->settings_window = GetNewCWindow(wSettings, NULL, (WindowPtr)-1); + else + s->settings_window = GetNewWindow(wSettings, NULL, (WindowPtr)-1); + + s->ctrlbox = ctrl_new_box(); + setup_config_box(s->ctrlbox, midsession, 0, 0); - s->settings_window = - GetDialogWindow(GetNewDialog(wSettings, NULL, (WindowPtr)-1)); + s->settings_ctrls.data = &s->temp_cfg; + if (midsession) + s->settings_ctrls.end = &mac_enddlg_reconfig; + else + s->settings_ctrls.end = &mac_enddlg_config; - wi = smalloc(sizeof(*wi)); + 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 = &mac_updatedlg; - wi->click = &mac_clickdlg; - wi->activate = &mac_activatedlg; - wi->adjustmenus = &mac_adjustdlgmenus; + 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); + if (midsession) + str = dupprintf("%s Reconfiguration", appname); + else + str = dupprintf("%s Configuration", appname); + c2pstrcpy(mactitle, str); + sfree(str); + SetWTitle(s->settings_window, mactitle); ShowWindow(s->settings_window); } +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_config(WindowPtr window, int value) +{ + Session *s = mac_windowsession(window); + + if (value == 0) + mac_closedlg(window); + else { + s->cfg = s->temp_cfg; + mac_startsession(s); + mac_closedlg(window); + } +} + +static void mac_enddlg_reconfig(WindowPtr window, int value) +{ + Session *s = mac_windowsession(window); + + if (value == 0) + mac_closedlg(window); + else { + Config prev_cfg = s->cfg; + s->cfg = s->temp_cfg; + mac_closedlg(window); + + /* Pass new config data to the logging module */ + log_reconfig(s->logctx, &s->cfg); + + /* + * Flush the line discipline's edit buffer in the + * case where local editing has just been disabled. + */ + if (s->ldisc) + ldisc_send(s->ldisc, NULL, 0, 0); + + /* Change the palette */ + palette_reset(s); + + /* Reinitialise line codepage */ + init_ucs(s); + + /* Pass new config data to the terminal */ + term_reconfig(s->term, &s->cfg); + + /* Pass new config data to the back end */ + if (s->back) + s->back->reconfig(s->backhandle, &s->cfg); + + /* Screen size changed ? */ + if (s->cfg.height != prev_cfg.height || + s->cfg.width != prev_cfg.width || + s->cfg.savelines != prev_cfg.savelines) { + request_resize(s, s->cfg.width, s->cfg.height); + } + + /* Set the window title */ + if (s->cfg.wintitle[0]) + set_title(s, s->cfg.wintitle); + + /* Scroll bar */ + if (s->cfg.scrollbar != prev_cfg.scrollbar) + request_resize(s, s->cfg.width, s->cfg.height); + + /* TODO: zoom, font */ + } +} + void mac_dupsession(void) { Session *s1 = mac_windowsession(FrontWindow()); Session *s2; - s2 = smalloc(sizeof(*s2)); + s2 = snew(Session); memset(s2, 0, sizeof(*s2)); s2->cfg = s1->cfg; s2->hasfile = s1->hasfile; @@ -98,7 +219,7 @@ static OSErr mac_opensessionfrom(FSSpec *fss) void *sesshandle; OSErr err; - s = smalloc(sizeof(*s)); + s = snew(Session); memset(s, 0, sizeof(*s)); err = FSpGetFInfo(fss, &fi); @@ -116,7 +237,7 @@ static OSErr mac_opensessionfrom(FSSpec *fss) err = -9999; goto fail; } - load_open_settings(sesshandle, TRUE, &s->cfg); + load_open_settings(sesshandle, &s->cfg); close_settings_r(sesshandle); mac_startsession(s); @@ -200,7 +321,7 @@ void mac_savesession(void) assert(s->hasfile); sesshandle = open_settings_w_fsp(&s->savefile); if (sesshandle == NULL) return; /* XXX report error */ - save_open_settings(sesshandle, TRUE, &s->cfg); + save_open_settings(sesshandle, &s->cfg); close_settings_w(sesshandle); } @@ -221,7 +342,7 @@ void mac_savesessionas(void) } sesshandle = open_settings_w_fsp(&sfr.sfFile); if (sesshandle == NULL) return; /* XXX report error */ - save_open_settings(sesshandle, TRUE, &s->cfg); + save_open_settings(sesshandle, &s->cfg); close_settings_w(sesshandle); s->hasfile = TRUE; s->savefile = sfr.sfFile; @@ -280,71 +401,6 @@ pascal OSErr mac_aevt_pdoc(const AppleEvent *req, AppleEvent *reply, return errAEEventNotHandled; } -static void mac_activatedlg(WindowPtr window, EventRecord *event) -{ - DialogItemType itemtype; - Handle itemhandle; - short item; - Rect itemrect; - int active; - DialogRef dialog = GetDialogFromWindow(window); - - active = (event->modifiers & activeFlag) != 0; - GetDialogItem(dialog, wiSettingsOpen, &itemtype, &itemhandle, &itemrect); - HiliteControl((ControlHandle)itemhandle, active ? 0 : 255); - DialogSelect(event, &dialog, &item); -} - -static void mac_clickdlg(WindowPtr window, EventRecord *event) -{ - short item; - Session *s = mac_windowsession(window); - DialogRef dialog = GetDialogFromWindow(window); - - if (DialogSelect(event, &dialog, &item)) - switch (item) { - case wiSettingsOpen: - HideWindow(window); - mac_startsession(s); - break; - } -} - -static void mac_updatedlg(WindowPtr window) -{ -#if TARGET_API_MAC_CARBON - RgnHandle rgn; -#endif - - 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); -} - -#if TARGET_API_MAC_CARBON -#define EnableItem EnableMenuItem -#define DisableItem DisableMenuItem -#endif -static void mac_adjustdlgmenus(WindowPtr window) -{ - MenuHandle menu; - - menu = GetMenuHandle(mFile); - DisableItem(menu, iSave); /* XXX enable if modified */ - EnableItem(menu, iSaveAs); - EnableItem(menu, iDuplicate); - - menu = GetMenuHandle(mEdit); - DisableItem(menu, 0); -} - /* * Local Variables: * c-file-style: "simon"