char shortcuts[MAX_SHORTCUTS_PER_CTRL];
int nshortcuts;
char *escaped;
- int i, base_id, num_ids;
+ int i, actual_base_id, base_id, num_ids;
void *data;
base_id = *id;
memset(shortcuts, NO_SHORTCUT, lenof(shortcuts));
nshortcuts = 0;
+ /* Almost all controls start at base_id. */
+ actual_base_id = base_id;
+
/*
* Now we're ready to actually create the control, by
* switching on its type.
escaped = shortcut_escape(ctrl->button.label,
ctrl->button.shortcut);
shortcuts[nshortcuts++] = ctrl->button.shortcut;
+ if (ctrl->button.iscancel)
+ actual_base_id = IDCANCEL;
num_ids = 1;
- button(&pos, escaped, base_id, ctrl->button.isdefault);
+ button(&pos, escaped, actual_base_id, ctrl->button.isdefault);
sfree(escaped);
break;
case CTRL_LISTBOX:
struct winctrl *c = smalloc(sizeof(struct winctrl));
c->ctrl = ctrl;
- c->base_id = base_id;
+ c->base_id = actual_base_id;
c->num_ids = num_ids;
c->data = data;
memcpy(c->shortcuts, shortcuts, sizeof(shortcuts));
winctrl_add(wc, c);
winctrl_add_shortcuts(dp, c);
- base_id += num_ids;
+ if (actual_base_id == base_id)
+ base_id += num_ids;
}
if (colstart >= 0) {
}
}
-union control *dlg_last_focused(void *dlg)
+union control *dlg_last_focused(union control *ctrl, void *dlg)
{
struct dlgparam *dp = (struct dlgparam *)dlg;
- return dp->lastfocused;
+ return dp->focused == ctrl ? dp->lastfocused : dp->focused;
}
/*