bid = va_arg(ap, int);
}
va_end(ap);
- buttons = smalloc(nbuttons * sizeof(struct radio));
+ buttons = snewn(nbuttons, struct radio);
va_start(ap, nacross);
for (i = 0; i < nbuttons; i++) {
buttons[i].text = va_arg(ap, char *);
bid = va_arg(ap, int);
}
va_end(ap);
- buttons = smalloc(nbuttons * sizeof(struct radio));
+ buttons = snewn(nbuttons, struct radio);
va_start(ap, nacross);
for (i = 0; i < nbuttons; i++) {
buttons[i].text = va_arg(ap, char *);
bid = va_arg(ap, int);
}
va_end(ap);
- buttons = smalloc(nbuttons * sizeof(struct radio));
+ buttons = snewn(nbuttons, struct radio);
va_start(ap, id);
for (i = 0; i < nbuttons; i++) {
buttons[i].text = va_arg(ap, char *);
RECT r;
HFONT oldfont, newfont;
- ret = smalloc(1+strlen(text));
+ ret = snewn(1+strlen(text), char);
p = text;
q = ret;
- pwidths = smalloc(sizeof(INT)*(1+strlen(text)));
+ pwidths = snewn(1+strlen(text), INT);
/*
* Work out the width the text will need to fit in, by doing
char *txt;
/* Get the item's data. */
tlen = SendDlgItemMessage (hwnd, listid, LB_GETTEXTLEN, src, 0);
- txt = smalloc(tlen+1);
+ txt = snewn(tlen+1, char);
SendDlgItemMessage (hwnd, listid, LB_GETTEXT, src, (LPARAM) txt);
val = SendDlgItemMessage (hwnd, listid, LB_GETITEMDATA, src, 0);
/* Deselect old location. */
if (!text)
return NULL; /* sfree won't choke on this */
- ret = smalloc(2*strlen(text)+1); /* size potentially doubles! */
+ ret = snewn(2*strlen(text)+1, char); /* size potentially doubles! */
shortcut = tolower((unsigned char)shortcut);
p = text;
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;
/* Start a containing box, if we have a boxname. */
if (s->boxname && *s->boxname) {
- struct winctrl *c = smalloc(sizeof(struct winctrl));
+ struct winctrl *c = snew(struct winctrl);
c->ctrl = NULL;
c->base_id = base_id;
c->num_ids = 1;
/* Draw a title, if we have one. */
if (!s->boxname && s->boxtitle) {
- struct winctrl *c = smalloc(sizeof(struct winctrl));
+ struct winctrl *c = snew(struct winctrl);
c->ctrl = NULL;
c->base_id = base_id;
c->num_ids = 1;
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.
ctrl->radio.shortcut);
shortcuts[nshortcuts++] = ctrl->radio.shortcut;
- buttons = smalloc(ctrl->radio.nbuttons * sizeof(struct radio));
+ buttons = snewn(ctrl->radio.nbuttons, struct radio);
for (i = 0; i < ctrl->radio.nbuttons; i++) {
buttons[i].text =
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:
ctrl->listbox.shortcut);
shortcuts[nshortcuts++] = ctrl->listbox.shortcut;
if (ctrl->listbox.draglist) {
- data = smalloc(sizeof(struct prefslist));
+ data = snew(struct prefslist);
num_ids = 4;
prefslist(data, &pos, ctrl->listbox.height, escaped,
base_id, base_id+1, base_id+2, base_id+3);
int *tabarray;
int i, percent;
- tabarray = smalloc((ctrl->listbox.ncols-1) * sizeof(int));
+ tabarray = snewn(ctrl->listbox.ncols-1, int);
percent = 0;
for (i = 0; i < ctrl->listbox.ncols-1; i++) {
percent += ctrl->listbox.percentages[i];
statictext(&pos, escaped, 1, base_id);
staticbtn(&pos, "", base_id+1, "Change...", base_id+2);
sfree(escaped);
- data = smalloc(sizeof(FontSpec));
+ data = snew(FontSpec);
break;
default:
assert(!"Can't happen");
* (and isn't tabdelayed).
*/
if (pos.hwnd) {
- struct winctrl *c = smalloc(sizeof(struct winctrl));
+ struct winctrl *c = snew(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;
}
/*
CB_GETCURSEL, 0, 0);
len = SendDlgItemMessage(dp->hwnd, c->base_id+1,
CB_GETLBTEXTLEN, index, 0);
- text = smalloc(len+1);
+ text = snewn(len+1, char);
SendDlgItemMessage(dp->hwnd, c->base_id+1, CB_GETLBTEXT,
index, (LPARAM)text);
SetDlgItemText(dp->hwnd, c->base_id+1, text);
if (msg == WM_COMMAND && id == 2 &&
(HIWORD(wParam) == BN_SETFOCUS || HIWORD(wParam) == BN_KILLFOCUS))
winctrl_set_focus(ctrl, dp, HIWORD(wParam) == BN_SETFOCUS);
+ if (msg == WM_COMMAND && id == 1 && HIWORD(wParam) == EN_CHANGE)
+ ctrl->generic.handler(ctrl, dp, dp->data, EVENT_VALCHANGE);
if (id == 2 &&
(msg == WM_COMMAND &&
(HIWORD(wParam) == BN_CLICKED ||
* strings in any listbox then you MUST not assign them different
* IDs and expect to get meaningful results back.
*/
-void dlg_listbox_addwithindex(union control *ctrl, void *dlg,
- char const *text, int id)
+void dlg_listbox_addwithid(union control *ctrl, void *dlg,
+ char const *text, int id)
{
struct dlgparam *dp = (struct dlgparam *)dlg;
struct winctrl *c = dlg_findbyctrl(dp, ctrl);
tmp.ctrl = ctrl;
p = find234(dp->privdata, &tmp, NULL);
if (!p) {
- p = smalloc(sizeof(struct perctrl_privdata));
+ p = snew(struct perctrl_privdata);
p->ctrl = ctrl;
p->needs_free = FALSE;
add234(dp->privdata, p);
tmp.ctrl = ctrl;
p = find234(dp->privdata, &tmp, NULL);
if (!p) {
- p = smalloc(sizeof(struct perctrl_privdata));
+ p = snew(struct perctrl_privdata);
p->ctrl = ctrl;
p->needs_free = FALSE;
add234(dp->privdata, p);
}
assert(!p->needs_free);
p->needs_free = TRUE;
+ /*
+ * This is an internal allocation routine, so it's allowed to
+ * use smalloc directly.
+ */
p->data = smalloc(size);
return p->data;
}