projects
/
u
/
mdw
/
putty
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Alert box to support host-key checking.
[u/mdw/putty]
/
winctrls.c
diff --git
a/winctrls.c
b/winctrls.c
index
4d055f4
..
dc931c8
100644
(file)
--- a/
winctrls.c
+++ b/
winctrls.c
@@
-16,6
+16,7
@@
#include <windows.h>
#include <commctrl.h>
#include <assert.h>
#include <windows.h>
#include <commctrl.h>
#include <assert.h>
+#include <ctype.h>
#include "winstuff.h"
#include "misc.h"
#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);
}
SWP_NOACTIVATE | SWP_NOCOPYBITS |
SWP_NOMOVE | SWP_NOZORDER);
}
- }
+ } else
+ ctl = NULL;
return ctl;
}
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)
{
*/
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;
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;
SIZE size;
char *ret, *p, *q;
RECT r;
+ HFONT oldfont, newfont;
ret = smalloc(1+strlen(text));
p = text;
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.
* 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);
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;
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) ||
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++;
}
nlines++;
}
+ SelectObject(hdc, oldfont);
ReleaseDC(cp->hwnd, hdc);
if (lines) *lines = nlines;
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;
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 =
switch (dlm->uNotification) {
case DL_BEGINDRAG:
hdl->dummyitem =
@@
-1321,9
+1328,10
@@
void winctrl_layout(struct dlgparam *dp, struct winctrls *wc,
struct ctlpos pos;
struct ctlpos pos;
- char shortcuts[MAX_SHORTCUTS_PER_CTRL], nshortcuts;
+ char shortcuts[MAX_SHORTCUTS_PER_CTRL];
+ int nshortcuts;
char *escaped;
char *escaped;
- int i, base_id, num_ids
, orig_tabdelay
;
+ int i, base_id, num_ids;
void *data;
base_id = *id;
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];
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
/*
* 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;
assert(!ctrl->generic.tabdelay);
ctrl = ctrl->tabdelay.ctrl;
- orig_tabdelay = TRUE;
for (i = 0; i < ntabdelays; i++)
if (tabdelayed[i] == ctrl)
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 */
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;
} 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");
break;
default:
assert(!"Can't happen");
+ num_ids = 0; /* placate gcc */
break;
}
break;
}
@@
-1659,7
+1667,7
@@
void winctrl_layout(struct dlgparam *dp, struct winctrls *wc,
base_id += num_ids;
}
base_id += num_ids;
}
- if (
!orig_tabdelay
) {
+ if (
colstart >= 0
) {
/*
* Update the ypos in all columns crossed by this
* control.
/*
* 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.
*/
/*
* 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)
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;
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);
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 &&
* 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);
}
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.
*/
/*
* 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)
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 ||
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);
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 ||
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);
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 ||
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);
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 ||
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 ?
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 ?