X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/fe8abbf463f798f37ee4f43b3b85583a80fbddf4..af76d9655f3579949a9a0643bcb16118334a5dea:/winctrls.c?ds=inline diff --git a/winctrls.c b/winctrls.c index 4d055f46..dc931c88 100644 --- a/winctrls.c +++ b/winctrls.c @@ -16,6 +16,7 @@ #include #include #include +#include #include "winstuff.h" #include "misc.h" @@ -94,7 +95,8 @@ HWND doctl(struct ctlpos *cp, RECT r, SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOZORDER); } - } + } else + ctl = NULL; return ctl; } @@ -384,7 +386,6 @@ void checkbox(struct ctlpos *cp, char *text, int id) */ char *staticwrap(struct ctlpos *cp, HWND hwnd, char *text, int *lines) { - HFONT font = (HFONT) cp->font; HDC hdc = GetDC(hwnd); int lpx = GetDeviceCaps(hdc, LOGPIXELSX); int width, nlines, j; @@ -392,6 +393,7 @@ char *staticwrap(struct ctlpos *cp, HWND hwnd, char *text, int *lines) SIZE size; char *ret, *p, *q; RECT r; + HFONT oldfont, newfont; ret = smalloc(1+strlen(text)); p = text; @@ -402,18 +404,22 @@ char *staticwrap(struct ctlpos *cp, HWND hwnd, char *text, int *lines) * Work out the width the text will need to fit in, by doing * the same adjustment that the `statictext' function itself * will perform. - * - * We must first convert from dialog-box units into pixels, and - * then from pixels into the `logical units' that Windows uses - * within GDI. You can't make this stuff up. */ + SetMapMode(hdc, MM_TEXT); /* ensure logical units == pixels */ r.left = r.top = r.bottom = 0; r.right = cp->width; MapDialogRect(hwnd, &r); - width = MulDiv(r.right, lpx, 72); + width = r.right; nlines = 1; + /* + * We must select the correct font into the HDC before calling + * GetTextExtent*, or silly things will happen. + */ + newfont = (HFONT)SendMessage(hwnd, WM_GETFONT, 0, 0); + oldfont = SelectObject(hdc, newfont); + while (*p) { if (!GetTextExtentExPoint(hdc, p, strlen(p), width, &nfit, pwidths, &size) || @@ -452,6 +458,7 @@ char *staticwrap(struct ctlpos *cp, HWND hwnd, char *text, int *lines) nlines++; } + SelectObject(hdc, oldfont); ReleaseDC(cp->hwnd, hdc); if (lines) *lines = nlines; @@ -1040,7 +1047,7 @@ int handle_prefslist(struct prefslist *hdl, if ((int)wParam == hdl->listid) { DRAGLISTINFO *dlm = (DRAGLISTINFO *)lParam; - int dest; + int dest = 0; /* initialise to placate gcc */ switch (dlm->uNotification) { case DL_BEGINDRAG: hdl->dummyitem = @@ -1321,9 +1328,10 @@ void winctrl_layout(struct dlgparam *dp, struct winctrls *wc, struct ctlpos pos; - char shortcuts[MAX_SHORTCUTS_PER_CTRL], nshortcuts; + char shortcuts[MAX_SHORTCUTS_PER_CTRL]; + int nshortcuts; char *escaped; - int i, base_id, num_ids, orig_tabdelay; + int i, base_id, num_ids; void *data; base_id = *id; @@ -1365,8 +1373,6 @@ void winctrl_layout(struct dlgparam *dp, struct winctrls *wc, for (i = 0; i < s->ncontrols; i++) { union control *ctrl = s->ctrls[i]; - orig_tabdelay = FALSE; - /* * Generic processing that pertains to all control types. * At the end of this if statement, we'll have produced @@ -1423,7 +1429,6 @@ void winctrl_layout(struct dlgparam *dp, struct winctrls *wc, assert(!ctrl->generic.tabdelay); ctrl = ctrl->tabdelay.ctrl; - orig_tabdelay = TRUE; for (i = 0; i < ntabdelays; i++) if (tabdelayed[i] == ctrl) @@ -1432,6 +1437,8 @@ void winctrl_layout(struct dlgparam *dp, struct winctrls *wc, pos = tabdelays[i]; /* structure copy */ + colstart = colspan = -1; /* indicate this was tab-delayed */ + } else { /* * If it wasn't one of those, it's a genuine control; @@ -1638,6 +1645,7 @@ void winctrl_layout(struct dlgparam *dp, struct winctrls *wc, break; default: assert(!"Can't happen"); + num_ids = 0; /* placate gcc */ break; } @@ -1659,7 +1667,7 @@ void winctrl_layout(struct dlgparam *dp, struct winctrls *wc, base_id += num_ids; } - if (!orig_tabdelay) { + if (colstart >= 0) { /* * Update the ypos in all columns crossed by this * control. @@ -1728,6 +1736,7 @@ int winctrl_handle_command(struct dlgparam *dp, UINT msg, /* * Look up the control ID in our data. */ + c = NULL; for (i = 0; i < dp->nctrltrees; i++) { c = winctrl_findbyid(dp->controltrees[i], LOWORD(wParam)); if (c) @@ -1745,6 +1754,8 @@ int winctrl_handle_command(struct dlgparam *dp, UINT msg, RECT r = di->rcItem; SIZE s; + SetMapMode(hdc, MM_TEXT); /* ensure logical units == pixels */ + GetTextExtentPoint32(hdc, (char *)c->data, strlen((char *)c->data), &s); DrawEdge(hdc, &r, EDGE_ETCHED, BF_ADJUST | BF_RECT); @@ -1823,8 +1834,8 @@ int winctrl_handle_command(struct dlgparam *dp, UINT msg, * checked before generating an event. */ if (msg == WM_COMMAND && - HIWORD(wParam) == BN_CLICKED || - HIWORD(wParam) == BN_DOUBLECLICKED && + (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) && IsDlgButtonChecked(dp->hwnd, LOWORD(wParam))) { ctrl->generic.handler(ctrl, dp, dp->data, EVENT_VALCHANGE); } @@ -2014,6 +2025,7 @@ int winctrl_context_help(struct dlgparam *dp, HWND hwnd, int id) /* * Look up the control ID in our data. */ + c = NULL; for (i = 0; i < dp->nctrltrees; i++) { c = winctrl_findbyid(dp->controltrees[i], id); if (c) @@ -2117,8 +2129,8 @@ void dlg_listbox_clear(union control *ctrl, void *dlg) int msg; assert(c && (c->ctrl->generic.type == CTRL_LISTBOX || - c->ctrl->generic.type == CTRL_EDITBOX && - c->ctrl->editbox.has_list)); + (c->ctrl->generic.type == CTRL_EDITBOX && + c->ctrl->editbox.has_list))); msg = (c->ctrl->generic.type==CTRL_LISTBOX && c->ctrl->listbox.height!=0 ? LB_RESETCONTENT : CB_RESETCONTENT); SendDlgItemMessage(dp->hwnd, c->base_id+1, msg, 0, 0); @@ -2131,8 +2143,8 @@ void dlg_listbox_del(union control *ctrl, void *dlg, int index) int msg; assert(c && (c->ctrl->generic.type == CTRL_LISTBOX || - c->ctrl->generic.type == CTRL_EDITBOX && - c->ctrl->editbox.has_list)); + (c->ctrl->generic.type == CTRL_EDITBOX && + c->ctrl->editbox.has_list))); msg = (c->ctrl->generic.type==CTRL_LISTBOX && c->ctrl->listbox.height!=0 ? LB_DELETESTRING : CB_DELETESTRING); SendDlgItemMessage(dp->hwnd, c->base_id+1, msg, index, 0); @@ -2145,8 +2157,8 @@ void dlg_listbox_add(union control *ctrl, void *dlg, char const *text) int msg; assert(c && (c->ctrl->generic.type == CTRL_LISTBOX || - c->ctrl->generic.type == CTRL_EDITBOX && - c->ctrl->editbox.has_list)); + (c->ctrl->generic.type == CTRL_EDITBOX && + c->ctrl->editbox.has_list))); msg = (c->ctrl->generic.type==CTRL_LISTBOX && c->ctrl->listbox.height!=0 ? LB_ADDSTRING : CB_ADDSTRING); SendDlgItemMessage(dp->hwnd, c->base_id+1, msg, 0, (LPARAM)text); @@ -2167,8 +2179,8 @@ void dlg_listbox_addwithindex(union control *ctrl, void *dlg, int msg, msg2, index; assert(c && (c->ctrl->generic.type == CTRL_LISTBOX || - c->ctrl->generic.type == CTRL_EDITBOX && - c->ctrl->editbox.has_list)); + (c->ctrl->generic.type == CTRL_EDITBOX && + c->ctrl->editbox.has_list))); msg = (c->ctrl->generic.type==CTRL_LISTBOX && c->ctrl->listbox.height!=0 ? LB_ADDSTRING : CB_ADDSTRING); msg2 = (c->ctrl->generic.type==CTRL_LISTBOX && c->ctrl->listbox.height!=0 ?