X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/3d9449a111194530856126f3dc89543d83fa0440..dee42491003c8fdd01bd039da46b9d6a2d171584:/windows/windlg.c diff --git a/windows/windlg.c b/windows/windlg.c index 742a761b..5aa20d2c 100644 --- a/windows/windlg.c +++ b/windows/windlg.c @@ -229,6 +229,57 @@ static int CALLBACK AboutProc(HWND hwnd, UINT msg, return 0; } +static int SaneDialogBox(HINSTANCE hinst, + LPCTSTR tmpl, + HWND hwndparent, + DLGPROC lpDialogFunc) +{ + WNDCLASS wc; + HWND hwnd; + MSG msg; + int flags; + int ret; + int gm; + + wc.style = CS_DBLCLKS | CS_SAVEBITS | CS_BYTEALIGNWINDOW; + wc.lpfnWndProc = DefDlgProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = DLGWINDOWEXTRA + 8; + wc.hInstance = hinst; + wc.hIcon = NULL; + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.hbrBackground = (HBRUSH) (COLOR_BACKGROUND +1); + wc.lpszMenuName = NULL; + wc.lpszClassName = "PuTTYConfigBox"; + RegisterClass(&wc); + + hwnd = CreateDialog(hinst, tmpl, hwndparent, lpDialogFunc); + + SetWindowLong(hwnd, BOXFLAGS, 0); /* flags */ + SetWindowLong(hwnd, BOXRESULT, 0); /* result from SaneEndDialog */ + + while ((gm=GetMessage(&msg, NULL, 0, 0)) > 0) { + flags=GetWindowLong(hwnd, BOXFLAGS); + if (!(flags & DF_END) && !IsDialogMessage(hwnd, &msg)) + DispatchMessage(&msg); + if (flags & DF_END) + break; + } + + if (gm == 0) + PostQuitMessage(msg.wParam); /* We got a WM_QUIT, pass it on */ + + ret=GetWindowLong(hwnd, BOXRESULT); + DestroyWindow(hwnd); + return ret; +} + +static void SaneEndDialog(HWND hwnd, int ret) +{ + SetWindowLong(hwnd, BOXRESULT, ret); + SetWindowLong(hwnd, BOXFLAGS, DF_END); +} + /* * Null dialog procedure. */ @@ -769,6 +820,7 @@ int verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, * callback function for the Help button. */ mbox.cbSize = sizeof(mbox); + mbox.hInstance = hinst; mbox.hwndOwner = hwnd; mbox.lpfnMsgBoxCallback = &verify_ssh_host_key_help; mbox.dwLanguageId = LANG_NEUTRAL; @@ -793,13 +845,15 @@ int verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, mbox.dwStyle = MB_ICONWARNING | MB_YESNOCANCEL | MB_DEFBUTTON3 | help_button; mbret = MessageBoxIndirect(&mbox); + assert(mbret==IDYES || mbret==IDNO || mbret==IDCANCEL); sfree((void *)mbox.lpszText); sfree((void *)mbox.lpszCaption); - if (mbret == IDYES) + if (mbret == IDYES) { store_host_key(host, port, keytype, keystr); - if (mbret == IDCANCEL) - return 0; - return 1; + return 1; + } else if (mbret == IDNO) + return 1; + return 0; } if (ret == 1) { /* key was absent */ int mbret; @@ -809,13 +863,14 @@ int verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, mbox.dwStyle = MB_ICONWARNING | MB_YESNOCANCEL | MB_DEFBUTTON3 | help_button; mbret = MessageBoxIndirect(&mbox); + assert(mbret==IDYES || mbret==IDNO || mbret==IDCANCEL); sfree((void *)mbox.lpszText); sfree((void *)mbox.lpszCaption); if (mbret == IDYES) store_host_key(host, port, keytype, keystr); - if (mbret == IDCANCEL) - return 0; - return 1; + if (mbret == IDNO) + return 1; + return 0; } } @@ -851,7 +906,8 @@ int askalg(void *frontend, const char *algtype, const char *algname, * Ask whether to wipe a session log file before writing to it. * Returns 2 for wipe, 1 for append, 0 for cancel (don't log). */ -int askappend(void *frontend, Filename filename) +int askappend(void *frontend, Filename filename, + void (*callback)(void *ctx, int result), void *ctx) { static const char msgtemplate[] = "The session log file \"%.*s\" already exists.\n"