hdl->srcitem = LBItemFromPt(dlm->hWnd, dlm->ptCursor, TRUE);
hdl->dragging = 0;
/* XXX hack Q183115 */
- SetWindowLong(hwnd, DWL_MSGRESULT, TRUE);
+ SetWindowLongPtr(hwnd, DWLP_MSGRESULT, TRUE);
ret |= 1; break;
case DL_CANCELDRAG:
DrawInsert(hwnd, dlm->hWnd, -1); /* Clear arrow */
if (dest > hdl->dummyitem) dest = hdl->dummyitem;
DrawInsert (hwnd, dlm->hWnd, dest);
if (dest >= 0)
- SetWindowLong(hwnd, DWL_MSGRESULT, DL_MOVECURSOR);
+ SetWindowLongPtr(hwnd, DWLP_MSGRESULT, DL_MOVECURSOR);
else
- SetWindowLong(hwnd, DWL_MSGRESULT, DL_STOPCURSOR);
+ SetWindowLongPtr(hwnd, DWLP_MSGRESULT, DL_STOPCURSOR);
ret |= 1; break;
case DL_DROPPED:
if (hdl->dragging) {
* Return value is a malloc'ed copy of the processed version of the
* string.
*/
-static char *shortcut_escape(char *text, char shortcut)
+static char *shortcut_escape(const char *text, char shortcut)
{
char *ret;
- char *p, *q;
+ char const *p;
+ char *q;
if (!text)
return NULL; /* sfree won't choke on this */
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,
/*
* This function can be called to produce context help on a
- * control. Returns TRUE if it has actually launched WinHelp.
+ * control. Returns TRUE if it has actually launched some help.
*/
int winctrl_context_help(struct dlgparam *dp, HWND hwnd, int id)
{
int i;
struct winctrl *c;
- char *cmd;
/*
* Look up the control ID in our data.
if (!c->ctrl || !c->ctrl->generic.helpctx.p)
return 0; /* no help available for this ctrl */
- cmd = dupprintf("JI(`',`%s')", c->ctrl->generic.helpctx.p);
- WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)cmd);
- sfree(cmd);
+ launch_help(hwnd, c->ctrl->generic.helpctx.p);
return 1;
}
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)
SetDlgItemText(dp->hwnd, c->base_id, text);
}
+void dlg_label_change(union control *ctrl, void *dlg, char const *text)
+{
+ struct dlgparam *dp = (struct dlgparam *)dlg;
+ struct winctrl *c = dlg_findbyctrl(dp, ctrl);
+ char *escaped = NULL;
+ int id = -1;
+
+ assert(c);
+ switch (c->ctrl->generic.type) {
+ case CTRL_EDITBOX:
+ escaped = shortcut_escape(text, c->ctrl->editbox.shortcut);
+ id = c->base_id;
+ break;
+ case CTRL_RADIO:
+ escaped = shortcut_escape(text, c->ctrl->radio.shortcut);
+ id = c->base_id;
+ break;
+ case CTRL_CHECKBOX:
+ escaped = shortcut_escape(text, ctrl->checkbox.shortcut);
+ id = c->base_id;
+ break;
+ case CTRL_BUTTON:
+ escaped = shortcut_escape(text, ctrl->button.shortcut);
+ id = c->base_id;
+ break;
+ case CTRL_LISTBOX:
+ escaped = shortcut_escape(text, ctrl->listbox.shortcut);
+ id = c->base_id;
+ break;
+ case CTRL_FILESELECT:
+ escaped = shortcut_escape(text, ctrl->fileselect.shortcut);
+ id = c->base_id;
+ break;
+ case CTRL_FONTSELECT:
+ escaped = shortcut_escape(text, ctrl->fontselect.shortcut);
+ id = c->base_id;
+ break;
+ default:
+ assert(!"Can't happen");
+ break;
+ }
+ if (escaped) {
+ SetDlgItemText(dp->hwnd, id, escaped);
+ sfree(escaped);
+ }
+}
+
void dlg_filesel_set(union control *ctrl, void *dlg, Filename fn)
{
struct dlgparam *dp = (struct dlgparam *)dlg;
(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)
return 0;
}
+void dlg_auto_set_fixed_pitch_flag(void *dlg)
+{
+ struct dlgparam *dp = (struct dlgparam *)dlg;
+ Config *cfg = (Config *)dp->data;
+ HFONT font;
+ 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 'Config *'
+ * as dp->data.
+ */
+
+ font = CreateFont(0, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE,
+ DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
+ CLIP_DEFAULT_PRECIS, FONT_QUALITY(cfg->font_quality),
+ FIXED_PITCH | FF_DONTCARE, cfg->font.name);
+ hdc = GetDC(NULL);
+ if (font && hdc && SelectObject(hdc, font) && 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 (font)
+ DeleteObject(font);
+
+ if (is_var)
+ dp->fixed_pitch_fonts = FALSE;
+}
+
+int dlg_get_fixed_pitch_flag(void *dlg)
+{
+ 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;
+}
+
struct perctrl_privdata {
union control *ctrl;
void *data;
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)