X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/6da411554bfe4c2a8ddfbb0616b0030ea5e813f5..62ddb51e0424dd4bd1098b024f2427959aefc729:/windows/winctrls.c diff --git a/windows/winctrls.c b/windows/winctrls.c index 0fb4b9fc..9e8e0e7d 100644 --- a/windows/winctrls.c +++ b/windows/winctrls.c @@ -148,44 +148,29 @@ void endbox(struct ctlpos *cp) } /* - * Some edit boxes. Each one has a static above it. The percentages - * of the horizontal space are provided. + * A static line, followed by a full-width edit box. */ -void multiedit(struct ctlpos *cp, int password, ...) +void editboxfw(struct ctlpos *cp, int password, char *text, + int staticid, int editid) { RECT r; - va_list ap; - int percent, xpos; - percent = xpos = 0; - va_start(ap, password); - while (1) { - char *text; - int staticid, editid, pcwidth; - text = va_arg(ap, char *); - if (!text) - break; - staticid = va_arg(ap, int); - editid = va_arg(ap, int); - pcwidth = va_arg(ap, int); - - r.left = xpos + GAPBETWEEN; - percent += pcwidth; - xpos = (cp->width + GAPBETWEEN) * percent / 100; - r.right = xpos - r.left; + r.left = GAPBETWEEN; + r.right = cp->width; + if (text) { r.top = cp->ypos; r.bottom = STATICHEIGHT; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, text, staticid); - r.top = cp->ypos + 8 + GAPWITHIN; - r.bottom = EDITHEIGHT; - doctl(cp, r, "EDIT", - WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL | - (password ? ES_PASSWORD : 0), - WS_EX_CLIENTEDGE, "", editid); + cp->ypos += STATICHEIGHT + GAPWITHIN; } - va_end(ap); - cp->ypos += STATICHEIGHT + GAPWITHIN + EDITHEIGHT + GAPBETWEEN; + r.top = cp->ypos; + r.bottom = EDITHEIGHT; + doctl(cp, r, "EDIT", + WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL | + (password ? ES_PASSWORD : 0), + WS_EX_CLIENTEDGE, "", editid); + cp->ypos += EDITHEIGHT + GAPBETWEEN; } /* @@ -198,16 +183,18 @@ void combobox(struct ctlpos *cp, char *text, int staticid, int listid) r.left = GAPBETWEEN; r.right = cp->width; + if (text) { + r.top = cp->ypos; + r.bottom = STATICHEIGHT; + doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, text, staticid); + cp->ypos += STATICHEIGHT + GAPWITHIN; + } r.top = cp->ypos; - r.bottom = STATICHEIGHT; - doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, text, staticid); - r.top = cp->ypos + 8 + GAPWITHIN; r.bottom = COMBOHEIGHT * 10; doctl(cp, r, "COMBOBOX", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWN | CBS_HASSTRINGS, WS_EX_CLIENTEDGE, "", listid); - - cp->ypos += STATICHEIGHT + GAPWITHIN + COMBOHEIGHT + GAPBETWEEN; + cp->ypos += COMBOHEIGHT + GAPBETWEEN; } struct radio { char *text; int id; }; @@ -670,7 +657,7 @@ void staticddl(struct ctlpos *cp, char *stext, r.right = rwid; r.bottom = COMBOHEIGHT*4; doctl(cp, r, "COMBOBOX", - WS_CHILD | WS_VISIBLE | WS_TABSTOP | + WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_HASSTRINGS, WS_EX_CLIENTEDGE, "", lid); cp->ypos += height + GAPBETWEEN; @@ -717,19 +704,21 @@ void staticddlbig(struct ctlpos *cp, char *stext, { RECT r; - r.left = GAPBETWEEN; - r.top = cp->ypos; - r.right = cp->width; - r.bottom = STATICHEIGHT; - doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid); - cp->ypos += STATICHEIGHT; + if (stext) { + r.left = GAPBETWEEN; + r.top = cp->ypos; + r.right = cp->width; + r.bottom = STATICHEIGHT; + doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid); + cp->ypos += STATICHEIGHT; + } r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; r.bottom = COMBOHEIGHT*4; doctl(cp, r, "COMBOBOX", - WS_CHILD | WS_VISIBLE | WS_TABSTOP | + WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_HASSTRINGS, WS_EX_CLIENTEDGE, "", lid); cp->ypos += COMBOHEIGHT + GAPBETWEEN; } @@ -742,12 +731,14 @@ void bigeditctrl(struct ctlpos *cp, char *stext, { RECT r; - r.left = GAPBETWEEN; - r.top = cp->ypos; - r.right = cp->width; - r.bottom = STATICHEIGHT; - cp->ypos += r.bottom + GAPWITHIN; - doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid); + if (stext) { + r.left = GAPBETWEEN; + r.top = cp->ypos; + r.right = cp->width; + r.bottom = STATICHEIGHT; + cp->ypos += r.bottom + GAPWITHIN; + doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid); + } r.left = GAPBETWEEN; r.top = cp->ypos; @@ -1048,6 +1039,10 @@ int handle_prefslist(struct prefslist *hdl, int dest = 0; /* initialise to placate gcc */ switch (dlm->uNotification) { case DL_BEGINDRAG: + /* Add a dummy item to make pl_itemfrompt() work + * better. + * FIXME: this causes scrollbar glitches if the count of + * listbox contains >= its height. */ hdl->dummyitem = SendDlgItemMessage(hwnd, hdl->listid, LB_ADDSTRING, 0, (LPARAM) ""); @@ -1055,7 +1050,7 @@ int handle_prefslist(struct prefslist *hdl, 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 */ @@ -1069,9 +1064,9 @@ int handle_prefslist(struct prefslist *hdl, 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) { @@ -1166,10 +1161,11 @@ void progressbar(struct ctlpos *cp, int id) * 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 */ @@ -1508,8 +1504,8 @@ void winctrl_layout(struct dlgparam *dp, struct winctrls *wc, combobox(&pos, escaped, base_id, base_id+1); else - multiedit(&pos, ctrl->editbox.password, escaped, - base_id, base_id+1, 100, NULL); + editboxfw(&pos, ctrl->editbox.password, escaped, + base_id, base_id+1); } else { if (ctrl->editbox.has_list) { staticcombo(&pos, escaped, base_id, base_id+1, @@ -1905,14 +1901,8 @@ int winctrl_handle_command(struct dlgparam *dp, UINT msg, HIWORD(wParam) == BN_DOUBLECLICKED))) { OPENFILENAME of; char filename[FILENAME_MAX]; - int ret; memset(&of, 0, sizeof(of)); -#ifdef OPENFILENAME_SIZE_VERSION_400 - of.lStructSize = OPENFILENAME_SIZE_VERSION_400; -#else - of.lStructSize = sizeof(of); -#endif of.hwndOwner = dp->hwnd; if (ctrl->fileselect.filter) of.lpstrFilter = ctrl->fileselect.filter; @@ -1925,14 +1915,9 @@ int winctrl_handle_command(struct dlgparam *dp, UINT msg, filename[lenof(filename)-1] = '\0'; of.nMaxFile = lenof(filename); of.lpstrFileTitle = NULL; - of.lpstrInitialDir = NULL; of.lpstrTitle = ctrl->fileselect.title; of.Flags = 0; - if (ctrl->fileselect.for_writing) - ret = GetSaveFileName(&of); - else - ret = GetOpenFileName(&of); - if (ret) { + if (request_file(NULL, &of, FALSE, ctrl->fileselect.for_writing)) { SetDlgItemText(dp->hwnd, c->base_id + 1, filename); ctrl->generic.handler(ctrl, dp, dp->data, EVENT_VALCHANGE); } @@ -2020,13 +2005,12 @@ int winctrl_handle_command(struct dlgparam *dp, UINT msg, /* * 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. @@ -2047,9 +2031,7 @@ int winctrl_context_help(struct dlgparam *dp, HWND hwnd, int id) 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; } @@ -2252,6 +2234,53 @@ void dlg_text_set(union control *ctrl, void *dlg, char const *text) 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;