123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- /*
- * Enhanced version of the MessageBox API function. Permits enabling a
- * Help button by setting helpctxid to a context id in the help file
- * relevant to this dialog box. Also permits setting the 'utf8' flag
- * to indicate that the char strings given as 'text' and 'caption' are
- * encoded in UTF-8 rather than the system code page.
- */
- #include "putty.h"
- static HWND message_box_owner;
- /* Callback function to launch context help. */
- static VOID CALLBACK message_box_help_callback(LPHELPINFO lpHelpInfo)
- {
- const char *context = NULL;
- #define CHECK_CTX(name) \
- do { \
- if (lpHelpInfo->dwContextId == WINHELP_CTXID_ ## name) \
- context = WINHELP_CTX_ ## name; \
- } while (0)
- CHECK_CTX(errors_hostkey_absent);
- CHECK_CTX(errors_hostkey_changed);
- CHECK_CTX(errors_cantloadkey);
- CHECK_CTX(option_cleanup);
- CHECK_CTX(pgp_fingerprints);
- #undef CHECK_CTX
- if (context)
- launch_help(message_box_owner, context);
- }
- int message_box(HWND owner, LPCTSTR text, LPCTSTR caption, DWORD style,
- bool utf8, DWORD helpctxid)
- {
- MSGBOXPARAMSW mbox;
- /*
- * We use MessageBoxIndirect() because it allows us to specify a
- * callback function for the Help button.
- */
- mbox.cbSize = sizeof(mbox);
- /* Assumes the globals `hinst' and `hwnd' have sensible values. */
- mbox.hInstance = hinst;
- mbox.dwLanguageId = LANG_NEUTRAL;
- mbox.hwndOwner = message_box_owner = owner;
- wchar_t *wtext, *wcaption;
- if (utf8) {
- wtext = decode_utf8_to_wide_string(text);
- wcaption = decode_utf8_to_wide_string(caption);
- } else {
- wtext = dup_mb_to_wc(DEFAULT_CODEPAGE, text);
- wcaption = dup_mb_to_wc(DEFAULT_CODEPAGE, caption);
- }
- mbox.lpszText = wtext;
- mbox.lpszCaption = wcaption;
- mbox.dwStyle = style;
- mbox.dwContextHelpId = helpctxid;
- if (helpctxid != 0 && has_help()) mbox.dwStyle |= MB_HELP;
- mbox.lpfnMsgBoxCallback = &message_box_help_callback;
- int toret = MessageBoxIndirectW(&mbox);
- sfree(wtext);
- sfree(wcaption);
- return toret;
- }
|