1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-05-30 16:30:29 -05:00

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.

[originally from svn r2984]
This commit is contained in:
Ben Harris 2003-03-24 22:41:38 +00:00
parent 6991e3ae7d
commit c20818608e
2 changed files with 45 additions and 22 deletions

View File

@ -73,6 +73,7 @@ struct macctrls {
tree234 *byctrl; tree234 *byctrl;
void *data; /* private data for config box */ void *data; /* private data for config box */
unsigned int npanels; unsigned int npanels;
unsigned int curpanel;
union macctrl **panels; /* lists of controls by panel */ union macctrl **panels; /* lists of controls by panel */
}; };

View File

@ -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 * Copyright (c) 2003 Ben Harris
* All rights reserved. * All rights reserved.
@ -218,7 +218,7 @@ void macctrl_layoutbox(struct controlbox *cb, WindowPtr window,
} }
macctrl_layoutset(&curstate, cb->ctrlsets[i], window, mcs); macctrl_layoutset(&curstate, cb->ctrlsets[i], window, mcs);
} }
macctrl_switchtopanel(mcs, 2); macctrl_switchtopanel(mcs, 20);
} }
static void macctrl_layoutset(struct mac_layoutstate *curstate, 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; unsigned int i, j;
union macctrl *mc; 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. */ /* Panel 0 is special and always visible. */
for (i = 1; i < mcs->npanels; i++) for (i = 1; i < mcs->npanels; i++)
for (mc = mcs->panels[i]; mc != NULL; mc = mc->generic.next) for (mc = mcs->panels[i]; mc != NULL; mc = mc->generic.next)
switch (mc->generic.type) { switch (mc->generic.type) {
case MACCTRL_TEXT: case MACCTRL_TEXT:
if (i == which) hideshow(mc->text.tbctrl);
ShowControl(mc->text.tbctrl);
else
HideControl(mc->text.tbctrl);
break; break;
case MACCTRL_RADIO: case MACCTRL_RADIO:
for (j = 0; j < mc->generic.ctrl->radio.nbuttons; j++) for (j = 0; j < mc->generic.ctrl->radio.nbuttons; j++)
if (i == which) hideshow(mc->radio.tbctrls[j]);
ShowControl(mc->radio.tbctrls[j]);
else
HideControl(mc->radio.tbctrls[j]);
break; break;
case MACCTRL_CHECKBOX: case MACCTRL_CHECKBOX:
if (i == which) hideshow(mc->checkbox.tbctrl);
ShowControl(mc->checkbox.tbctrl);
else
HideControl(mc->checkbox.tbctrl);
break; break;
case MACCTRL_BUTTON: case MACCTRL_BUTTON:
if (i == which) hideshow(mc->button.tbctrl);
ShowControl(mc->button.tbctrl); break;
else case MACCTRL_POPUP:
HideControl(mc->button.tbctrl); hideshow(mc->popup.tbctrl);
break; break;
} }
} }
@ -541,7 +536,7 @@ static void macctrl_popup(struct macctrls *mcs, WindowPtr window,
Rect bounds; Rect bounds;
Str255 title; Str255 title;
unsigned int labelwidth; unsigned int labelwidth;
static int nextmenuid; static int nextmenuid = MENU_MIN;
int menuid; int menuid;
MenuRef menu; MenuRef menu;
@ -593,9 +588,15 @@ static void macctrl_popup(struct macctrls *mcs, WindowPtr window,
void macctrl_activate(WindowPtr window, EventRecord *event) void macctrl_activate(WindowPtr window, EventRecord *event)
{ {
struct macctrls *mcs = mac_winctrls(window);
Boolean active = (event->modifiers & activeFlag) != 0; Boolean active = (event->modifiers & activeFlag) != 0;
GrafPtr saveport; GrafPtr saveport;
int i, j;
ControlPartCode state;
union macctrl *mc;
#if 0
ControlRef root; ControlRef root;
#endif
GetPort(&saveport); GetPort(&saveport);
SetPort((GrafPtr)GetWindowPort(window)); SetPort((GrafPtr)GetWindowPort(window));
@ -604,14 +605,35 @@ void macctrl_activate(WindowPtr window, EventRecord *event)
kThemeBrushModelessDialogBackgroundActive : kThemeBrushModelessDialogBackgroundActive :
kThemeBrushModelessDialogBackgroundInactive, kThemeBrushModelessDialogBackgroundInactive,
TRUE); TRUE);
#if 0
GetRootControl(window, &root); GetRootControl(window, &root);
if (active) if (active)
ActivateControl(root); ActivateControl(root);
else else
DeactivateControl(root); DeactivateControl(root);
} else { #endif
/* (De)activate controls one at a time */
} }
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); SetPort(saveport);
} }