From 0a33efe12a62e0bbe703bb213933c617a6b45cde Mon Sep 17 00:00:00 2001 From: ben Date: Mon, 24 Mar 2003 22:41:38 +0000 Subject: [PATCH] Initialise the "next menu ID" counter for pop-up menus. This stops crashes on Mac OS 8. Also re-do support for activate events so as not to depend on embedding hierarchies, and thus to work on System 7. git-svn-id: svn://svn.tartarus.org/sgt/putty@2984 cda61777-01e9-0310-a592-d414129be87e --- mac/mac.h | 1 + mac/macctrls.c | 66 ++++++++++++++++++++++++++++++++++++++-------------------- 2 files changed, 45 insertions(+), 22 deletions(-) diff --git a/mac/mac.h b/mac/mac.h index 9ec3ebe7..0e747817 100644 --- a/mac/mac.h +++ b/mac/mac.h @@ -73,6 +73,7 @@ struct macctrls { tree234 *byctrl; void *data; /* private data for config box */ unsigned int npanels; + unsigned int curpanel; union macctrl **panels; /* lists of controls by panel */ }; diff --git a/mac/macctrls.c b/mac/macctrls.c index f86efe6c..4300474e 100644 --- a/mac/macctrls.c +++ b/mac/macctrls.c @@ -1,4 +1,4 @@ -/* $Id: macctrls.c,v 1.10 2003/03/24 21:55:51 ben Exp $ */ +/* $Id: macctrls.c,v 1.11 2003/03/24 22:41:38 ben Exp $ */ /* * Copyright (c) 2003 Ben Harris * All rights reserved. @@ -218,7 +218,7 @@ void macctrl_layoutbox(struct controlbox *cb, WindowPtr window, } macctrl_layoutset(&curstate, cb->ctrlsets[i], window, mcs); } - macctrl_switchtopanel(mcs, 2); + macctrl_switchtopanel(mcs, 20); } static void macctrl_layoutset(struct mac_layoutstate *curstate, @@ -279,36 +279,31 @@ static void macctrl_switchtopanel(struct macctrls *mcs, unsigned int which) unsigned int i, j; union macctrl *mc; +#define hideshow(c) do { \ + if (i == which) ShowControl(c); else HideControl(c); \ +} while (0) + + mcs->curpanel = which; /* Panel 0 is special and always visible. */ for (i = 1; i < mcs->npanels; i++) for (mc = mcs->panels[i]; mc != NULL; mc = mc->generic.next) switch (mc->generic.type) { case MACCTRL_TEXT: - if (i == which) - ShowControl(mc->text.tbctrl); - else - HideControl(mc->text.tbctrl); + hideshow(mc->text.tbctrl); break; case MACCTRL_RADIO: for (j = 0; j < mc->generic.ctrl->radio.nbuttons; j++) - if (i == which) - ShowControl(mc->radio.tbctrls[j]); - else - HideControl(mc->radio.tbctrls[j]); + hideshow(mc->radio.tbctrls[j]); break; case MACCTRL_CHECKBOX: - if (i == which) - ShowControl(mc->checkbox.tbctrl); - else - HideControl(mc->checkbox.tbctrl); + hideshow(mc->checkbox.tbctrl); break; case MACCTRL_BUTTON: - if (i == which) - ShowControl(mc->button.tbctrl); - else - HideControl(mc->button.tbctrl); + hideshow(mc->button.tbctrl); + break; + case MACCTRL_POPUP: + hideshow(mc->popup.tbctrl); break; - } } @@ -541,7 +536,7 @@ static void macctrl_popup(struct macctrls *mcs, WindowPtr window, Rect bounds; Str255 title; unsigned int labelwidth; - static int nextmenuid; + static int nextmenuid = MENU_MIN; int menuid; MenuRef menu; @@ -593,9 +588,15 @@ static void macctrl_popup(struct macctrls *mcs, WindowPtr window, void macctrl_activate(WindowPtr window, EventRecord *event) { + struct macctrls *mcs = mac_winctrls(window); Boolean active = (event->modifiers & activeFlag) != 0; GrafPtr saveport; + int i, j; + ControlPartCode state; + union macctrl *mc; +#if 0 ControlRef root; +#endif GetPort(&saveport); SetPort((GrafPtr)GetWindowPort(window)); @@ -604,14 +605,35 @@ void macctrl_activate(WindowPtr window, EventRecord *event) kThemeBrushModelessDialogBackgroundActive : kThemeBrushModelessDialogBackgroundInactive, TRUE); +#if 0 GetRootControl(window, &root); if (active) ActivateControl(root); else DeactivateControl(root); - } else { - /* (De)activate controls one at a time */ +#endif } + state = active ? kControlNoPart : kControlInactivePart; + for (i = 0; i <= mcs->curpanel; i += mcs->curpanel) + for (mc = mcs->panels[i]; mc != NULL; mc = mc->generic.next) + switch (mc->generic.type) { + case MACCTRL_TEXT: + HiliteControl(mc->text.tbctrl, state); + break; + case MACCTRL_RADIO: + for (j = 0; j < mc->generic.ctrl->radio.nbuttons; j++) + HiliteControl(mc->radio.tbctrls[j], state); + break; + case MACCTRL_CHECKBOX: + HiliteControl(mc->checkbox.tbctrl, state); + break; + case MACCTRL_BUTTON: + HiliteControl(mc->button.tbctrl, state); + break; + case MACCTRL_POPUP: + HiliteControl(mc->popup.tbctrl, state); + break; + } SetPort(saveport); } -- 2.11.0