if (cp->hwnd) {
ctl = CreateWindowEx(exstyle, wclass, wtext, wstyle,
r.left, r.top, r.right, r.bottom,
- cp->hwnd, (HMENU) wid, hinst, NULL);
+ cp->hwnd, (HMENU)(ULONG_PTR)wid, hinst, NULL);
SendMessage(ctl, WM_SETFONT, cp->font, MAKELPARAM(TRUE, 0));
if (!strcmp(wclass, "LISTBOX")) {
nbuttons = 0;
while (1) {
char *btext = va_arg(ap, char *);
- int bid;
if (!btext)
break;
- bid = va_arg(ap, int);
+ (void) va_arg(ap, int); /* id */
nbuttons++;
}
va_end(ap);
nbuttons = 0;
while (1) {
char *btext = va_arg(ap, char *);
- int bid;
if (!btext)
break;
- bid = va_arg(ap, int);
+ (void) va_arg(ap, int); /* id */
+ nbuttons++;
}
va_end(ap);
buttons = snewn(nbuttons, struct radio);
nbuttons = 0;
while (1) {
char *btext = va_arg(ap, char *);
- int bid;
if (!btext)
break;
- bid = va_arg(ap, int);
+ (void) va_arg(ap, int); /* id */
+ nbuttons++;
}
va_end(ap);
buttons = snewn(nbuttons, struct radio);
char *staticwrap(struct ctlpos *cp, HWND hwnd, char *text, int *lines)
{
HDC hdc = GetDC(hwnd);
- int lpx = GetDeviceCaps(hdc, LOGPIXELSX);
int width, nlines, j;
INT *pwidths, nfit;
SIZE size;
if (lines) *lines = nlines;
+ sfree(pwidths);
+
return ret;
}
shortcuts[nshortcuts++] = ctrl->fontselect.shortcut;
statictext(&pos, escaped, 1, base_id);
staticbtn(&pos, "", base_id+1, "Change...", base_id+2);
+ data = fontspec_new("", 0, 0, 0);
sfree(escaped);
- data = snew(FontSpec);
break;
default:
assert(!"Can't happen");
winctrl_add_shortcuts(dp, c);
if (actual_base_id == base_id)
base_id += num_ids;
- }
+ } else {
+ sfree(data);
+ }
if (colstart >= 0) {
/*
CHOOSEFONT cf;
LOGFONT lf;
HDC hdc;
- FontSpec fs = *(FontSpec *)c->data;
-
+ FontSpec *fs = (FontSpec *)c->data;
+
hdc = GetDC(0);
- lf.lfHeight = -MulDiv(fs.height,
+ lf.lfHeight = -MulDiv(fs->height,
GetDeviceCaps(hdc, LOGPIXELSY), 72);
ReleaseDC(0, hdc);
lf.lfWidth = lf.lfEscapement = lf.lfOrientation = 0;
lf.lfItalic = lf.lfUnderline = lf.lfStrikeOut = 0;
- lf.lfWeight = (fs.isbold ? FW_BOLD : 0);
- lf.lfCharSet = fs.charset;
+ lf.lfWeight = (fs->isbold ? FW_BOLD : 0);
+ lf.lfCharSet = fs->charset;
lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
lf.lfQuality = DEFAULT_QUALITY;
lf.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE;
- strncpy(lf.lfFaceName, fs.name,
+ strncpy(lf.lfFaceName, fs->name,
sizeof(lf.lfFaceName) - 1);
lf.lfFaceName[sizeof(lf.lfFaceName) - 1] = '\0';
cf.lStructSize = sizeof(cf);
cf.hwndOwner = dp->hwnd;
cf.lpLogFont = &lf;
- cf.Flags = CF_FIXEDPITCHONLY | CF_FORCEFONTEXIST |
- CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS;
+ cf.Flags = (dp->fixed_pitch_fonts ? CF_FIXEDPITCHONLY : 0) |
+ CF_FORCEFONTEXIST | CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS;
if (ChooseFont(&cf)) {
- strncpy(fs.name, lf.lfFaceName,
- sizeof(fs.name) - 1);
- fs.name[sizeof(fs.name) - 1] = '\0';
- fs.isbold = (lf.lfWeight == FW_BOLD);
- fs.charset = lf.lfCharSet;
- fs.height = cf.iPointSize / 10;
+ fs = fontspec_new(lf.lfFaceName, (lf.lfWeight == FW_BOLD),
+ cf.iPointSize / 10, lf.lfCharSet);
dlg_fontsel_set(ctrl, dp, fs);
+ fontspec_free(fs);
+
ctrl->generic.handler(ctrl, dp, dp->data, EVENT_VALCHANGE);
}
}
SetDlgItemText(dp->hwnd, c->base_id+1, text);
}
-void dlg_editbox_get(union control *ctrl, void *dlg, char *buffer, int length)
+char *dlg_editbox_get(union control *ctrl, void *dlg)
{
struct dlgparam *dp = (struct dlgparam *)dlg;
struct winctrl *c = dlg_findbyctrl(dp, ctrl);
assert(c && c->ctrl->generic.type == CTRL_EDITBOX);
- GetDlgItemText(dp->hwnd, c->base_id+1, buffer, length);
- buffer[length-1] = '\0';
+ return GetDlgItemText_alloc(dp->hwnd, c->base_id+1);
}
/* The `listbox' functions can also apply to combo boxes. */
struct dlgparam *dp = (struct dlgparam *)dlg;
struct winctrl *c = dlg_findbyctrl(dp, ctrl);
int msg, ret;
- assert(c && c->ctrl->generic.type == CTRL_LISTBOX &&
- !c->ctrl->listbox.multisel);
+ assert(c && c->ctrl->generic.type == CTRL_LISTBOX);
+ if (c->ctrl->listbox.multisel) {
+ assert(c->ctrl->listbox.height != 0); /* not combo box */
+ ret = SendDlgItemMessage(dp->hwnd, c->base_id+1, LB_GETSELCOUNT, 0, 0);
+ if (ret == LB_ERR || ret > 1)
+ return -1;
+ }
msg = (c->ctrl->listbox.height != 0 ? LB_GETCURSEL : CB_GETCURSEL);
ret = SendDlgItemMessage(dp->hwnd, c->base_id+1, msg, 0, 0);
if (ret == LB_ERR)
}
}
-void dlg_filesel_set(union control *ctrl, void *dlg, Filename fn)
+void dlg_filesel_set(union control *ctrl, void *dlg, Filename *fn)
{
struct dlgparam *dp = (struct dlgparam *)dlg;
struct winctrl *c = dlg_findbyctrl(dp, ctrl);
assert(c && c->ctrl->generic.type == CTRL_FILESELECT);
- SetDlgItemText(dp->hwnd, c->base_id+1, fn.path);
+ SetDlgItemText(dp->hwnd, c->base_id+1, fn->path);
}
-void dlg_filesel_get(union control *ctrl, void *dlg, Filename *fn)
+Filename *dlg_filesel_get(union control *ctrl, void *dlg)
{
struct dlgparam *dp = (struct dlgparam *)dlg;
struct winctrl *c = dlg_findbyctrl(dp, ctrl);
+ char *tmp;
+ Filename *ret;
assert(c && c->ctrl->generic.type == CTRL_FILESELECT);
- GetDlgItemText(dp->hwnd, c->base_id+1, fn->path, lenof(fn->path));
- fn->path[lenof(fn->path)-1] = '\0';
+ tmp = GetDlgItemText_alloc(dp->hwnd, c->base_id+1);
+ ret = filename_from_str(tmp);
+ sfree(tmp);
+ return ret;
}
-void dlg_fontsel_set(union control *ctrl, void *dlg, FontSpec fs)
+void dlg_fontsel_set(union control *ctrl, void *dlg, FontSpec *fs)
{
char *buf, *boldstr;
struct dlgparam *dp = (struct dlgparam *)dlg;
struct winctrl *c = dlg_findbyctrl(dp, ctrl);
assert(c && c->ctrl->generic.type == CTRL_FONTSELECT);
- *(FontSpec *)c->data = fs; /* structure copy */
+ fontspec_free((FontSpec *)c->data);
+ c->data = fontspec_copy(fs);
- boldstr = (fs.isbold ? "bold, " : "");
- if (fs.height == 0)
- buf = dupprintf("Font: %s, %sdefault height", fs.name, boldstr);
+ boldstr = (fs->isbold ? "bold, " : "");
+ if (fs->height == 0)
+ buf = dupprintf("Font: %s, %sdefault height", fs->name, boldstr);
else
- buf = dupprintf("Font: %s, %s%d-%s", fs.name, boldstr,
- (fs.height < 0 ? -fs.height : fs.height),
- (fs.height < 0 ? "pixel" : "point"));
+ buf = dupprintf("Font: %s, %s%d-%s", fs->name, boldstr,
+ (fs->height < 0 ? -fs->height : fs->height),
+ (fs->height < 0 ? "pixel" : "point"));
SetDlgItemText(dp->hwnd, c->base_id+1, buf);
sfree(buf);
+
+ dlg_auto_set_fixed_pitch_flag(dp);
}
-void dlg_fontsel_get(union control *ctrl, void *dlg, FontSpec *fs)
+FontSpec *dlg_fontsel_get(union control *ctrl, void *dlg)
{
struct dlgparam *dp = (struct dlgparam *)dlg;
struct winctrl *c = dlg_findbyctrl(dp, ctrl);
assert(c && c->ctrl->generic.type == CTRL_FONTSELECT);
- *fs = *(FontSpec *)c->data; /* structure copy */
+ return fontspec_copy((FontSpec *)c->data);
}
/*
struct winctrl *c = dlg_findbyctrl(dp, ctrl);
int id;
HWND ctl;
+ if (!c)
+ return;
switch (ctrl->generic.type) {
case CTRL_EDITBOX: id = c->base_id + 1; break;
case CTRL_RADIO:
MessageBeep(0);
}
-void dlg_error_msg(void *dlg, char *msg)
+void dlg_error_msg(void *dlg, const char *msg)
{
struct dlgparam *dp = (struct dlgparam *)dlg;
MessageBox(dp->hwnd, msg,
return 0;
}
-struct perctrl_privdata {
- union control *ctrl;
- void *data;
- int needs_free;
-};
+void dlg_auto_set_fixed_pitch_flag(void *dlg)
+{
+ struct dlgparam *dp = (struct dlgparam *)dlg;
+ Conf *conf = (Conf *)dp->data;
+ FontSpec *fs;
+ int quality;
+ HFONT hfont;
+ HDC hdc;
+ TEXTMETRIC tm;
+ int is_var;
+
+ /*
+ * Attempt to load the current font, and see if it's
+ * variable-pitch. If so, start off the fixed-pitch flag for the
+ * dialog box as false.
+ *
+ * We assume here that any client of the dlg_* mechanism which is
+ * using font selectors at all is also using a normal 'Conf *'
+ * as dp->data.
+ */
+
+ quality = conf_get_int(conf, CONF_font_quality);
+ fs = conf_get_fontspec(conf, CONF_font);
+
+ hfont = CreateFont(0, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE,
+ DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
+ CLIP_DEFAULT_PRECIS, FONT_QUALITY(quality),
+ FIXED_PITCH | FF_DONTCARE, fs->name);
+ hdc = GetDC(NULL);
+ if (hdc && SelectObject(hdc, hfont) && GetTextMetrics(hdc, &tm)) {
+ /* Note that the TMPF_FIXED_PITCH bit is defined upside down :-( */
+ is_var = (tm.tmPitchAndFamily & TMPF_FIXED_PITCH);
+ } else {
+ is_var = FALSE; /* assume it's basically normal */
+ }
+ if (hdc)
+ ReleaseDC(NULL, hdc);
+ if (hfont)
+ DeleteObject(hfont);
+
+ if (is_var)
+ dp->fixed_pitch_fonts = FALSE;
+}
-static int perctrl_privdata_cmp(void *av, void *bv)
+int dlg_get_fixed_pitch_flag(void *dlg)
{
- struct perctrl_privdata *a = (struct perctrl_privdata *)av;
- struct perctrl_privdata *b = (struct perctrl_privdata *)bv;
- if (a->ctrl < b->ctrl)
- return -1;
- else if (a->ctrl > b->ctrl)
- return +1;
- return 0;
+ struct dlgparam *dp = (struct dlgparam *)dlg;
+ return dp->fixed_pitch_fonts;
+}
+
+void dlg_set_fixed_pitch_flag(void *dlg, int flag)
+{
+ struct dlgparam *dp = (struct dlgparam *)dlg;
+ dp->fixed_pitch_fonts = flag;
}
void dp_init(struct dlgparam *dp)
memset(dp->shortcuts, 0, sizeof(dp->shortcuts));
dp->hwnd = NULL;
dp->wintitle = dp->errtitle = NULL;
- dp->privdata = newtree234(perctrl_privdata_cmp);
+ dp->fixed_pitch_fonts = TRUE;
}
void dp_add_tree(struct dlgparam *dp, struct winctrls *wc)
void dp_cleanup(struct dlgparam *dp)
{
- struct perctrl_privdata *p;
-
- if (dp->privdata) {
- while ( (p = index234(dp->privdata, 0)) != NULL ) {
- del234(dp->privdata, p);
- if (p->needs_free)
- sfree(p->data);
- sfree(p);
- }
- freetree234(dp->privdata);
- dp->privdata = NULL;
- }
sfree(dp->wintitle);
sfree(dp->errtitle);
}
-
-void *dlg_get_privdata(union control *ctrl, void *dlg)
-{
- struct dlgparam *dp = (struct dlgparam *)dlg;
- struct perctrl_privdata tmp, *p;
- tmp.ctrl = ctrl;
- p = find234(dp->privdata, &tmp, NULL);
- if (p)
- return p->data;
- else
- return NULL;
-}
-
-void dlg_set_privdata(union control *ctrl, void *dlg, void *ptr)
-{
- struct dlgparam *dp = (struct dlgparam *)dlg;
- struct perctrl_privdata tmp, *p;
- tmp.ctrl = ctrl;
- p = find234(dp->privdata, &tmp, NULL);
- if (!p) {
- p = snew(struct perctrl_privdata);
- p->ctrl = ctrl;
- p->needs_free = FALSE;
- add234(dp->privdata, p);
- }
- p->data = ptr;
-}
-
-void *dlg_alloc_privdata(union control *ctrl, void *dlg, size_t size)
-{
- struct dlgparam *dp = (struct dlgparam *)dlg;
- struct perctrl_privdata tmp, *p;
- tmp.ctrl = ctrl;
- p = find234(dp->privdata, &tmp, NULL);
- if (!p) {
- 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;
-}