1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-10 01:48:00 +00:00

Initial support for HTML Help. All the ad-hoc help-file finding code

and various calls to WinHelp() have been centralised into a new file
winhelp.c, which in turn has been modified to detect a .CHM file as
well as .HLP and select between them as appropriate. It explicitly
tries to load HHCTRL.OCX and use GetProcAddress, meaning that it
_should_ still work correctly on pre-HTML-Help platforms, falling
gracefully back to WinHelp, but although I tested this by
temporarily renaming my own HHCTRL.OCX I haven't yet been able to
test it on a real HTML-Help-free platform.

Also in this checkin: a new .but file and docs makefile changes to
make it convenient to build the sources for a .CHM. As yet, owing to
limitations of Halibut's CHM support, I'm not able to write a .CHM
directly, more's the pity.

[originally from svn r7000]
This commit is contained in:
Simon Tatham 2006-12-17 11:16:07 +00:00
parent 86eac20abb
commit 1dac1bc911
12 changed files with 379 additions and 303 deletions

8
Recipe
View File

@ -220,7 +220,7 @@ TERMINAL = terminal wcwidth ldiscucs logging tree234 minibidi
# GUI front end and terminal emulator (putty, puttytel). # GUI front end and terminal emulator (putty, puttytel).
GUITERM = TERMINAL window windlg winctrls sizetip winucs winprint GUITERM = TERMINAL window windlg winctrls sizetip winucs winprint
+ winutils wincfg sercfg + winutils wincfg sercfg winhelp
# Same thing on Unix. # Same thing on Unix.
UXTERM = TERMINAL uxcfg sercfg uxucs uxprint timing UXTERM = TERMINAL uxcfg sercfg uxucs uxprint timing
@ -255,7 +255,7 @@ CHARSET = sbcsdat slookup sbcs utf8 toucs fromucs xenc mimeenc macenc localenc
# Standard libraries. # Standard libraries.
LIBS = advapi32.lib user32.lib gdi32.lib comctl32.lib comdlg32.lib LIBS = advapi32.lib user32.lib gdi32.lib comctl32.lib comdlg32.lib
+ shell32.lib winmm.lib imm32.lib winspool.lib + shell32.lib winmm.lib imm32.lib winspool.lib htmlhelp.lib
# Network backend sets. This also brings in the relevant attachment # Network backend sets. This also brings in the relevant attachment
# to proxy.c depending on whether we're crypto-avoidant or not. # to proxy.c depending on whether we're crypto-avoidant or not.
@ -287,12 +287,12 @@ psftp : [C] psftp winsftp wincons WINSSH BE_SSH SFTP wildcard WINMISC
pageant : [G] winpgnt sshrsa sshpubk sshdes sshbn sshmd5 version tree234 pageant : [G] winpgnt sshrsa sshpubk sshdes sshbn sshmd5 version tree234
+ misc sshaes sshsha winpgntc sshdss sshsh512 winutils winmisc + misc sshaes sshsha winpgntc sshdss sshsh512 winutils winmisc
+ pageant.res LIBS + winhelp pageant.res LIBS
puttygen : [G] winpgen sshrsag sshdssg sshprime sshdes sshbn sshmd5 version puttygen : [G] winpgen sshrsag sshdssg sshprime sshdes sshbn sshmd5 version
+ sshrand winnoise sshsha winstore misc winctrls sshrsa sshdss winmisc + sshrand winnoise sshsha winstore misc winctrls sshrsa sshdss winmisc
+ sshpubk sshaes sshsh512 import winutils puttygen.res tree234 + sshpubk sshaes sshsh512 import winutils puttygen.res tree234
+ notiming LIBS wintime + notiming winhelp LIBS wintime
pterm : [X] GTKTERM uxmisc misc ldisc settings uxpty uxsel BE_NONE uxstore pterm : [X] GTKTERM uxmisc misc ldisc settings uxpty uxsel BE_NONE uxstore
+ uxsignal CHARSET cmdline uxpterm version time + uxsignal CHARSET cmdline uxpterm version time

View File

@ -49,6 +49,10 @@ index.html: $(INPUTS)
putty.info: $(INPUTS) putty.info: $(INPUTS)
$(HALIBUT) --info $(INPUTS) $(HALIBUT) --info $(INPUTS)
chm: putty.hhp
putty.hhp: $(INPUTS) chm.but
$(HALIBUT) --html $(INPUTS) chm.but
MKMAN = $(HALIBUT) --man=$@ mancfg.but $< MKMAN = $(HALIBUT) --man=$@ mancfg.but $<
MANPAGES = putty.1 puttygen.1 plink.1 pscp.1 psftp.1 puttytel.1 pterm.1 MANPAGES = putty.1 puttygen.1 plink.1 pscp.1 psftp.1 puttytel.1 pterm.1
man: $(MANPAGES) man: $(MANPAGES)
@ -62,4 +66,4 @@ puttytel.1: man-ptel.but mancfg.but; $(MKMAN)
pterm.1: man-pter.but mancfg.but; $(MKMAN) pterm.1: man-pter.but mancfg.but; $(MKMAN)
clean: clean:
rm -f *.html *.txt *.hlp *.cnt *.1 *.info vstr.but rm -f *.html *.txt *.hlp *.cnt *.1 *.info vstr.but *.hh[pck] *.chm

19
doc/chm.but Normal file
View File

@ -0,0 +1,19 @@
\# File containing the magic HTML configuration directives to create
\# an MS HTML Help project. We put this on the end of the PuTTY
\# docs build command line to build the HHP and friends.
\cfg{html-leaf-level}{infinite}
\cfg{html-leaf-contains-contents}{false}
\cfg{html-suppress-navlinks}{true}
\cfg{html-suppress-address}{true}
\cfg{html-contents-filename}{index.html}
\cfg{html-template-filename}{%k.html}
\cfg{html-template-fragment}{%k}
\cfg{html-mshtmlhelp-chm}{putty.chm}
\cfg{html-mshtmlhelp-project}{putty.hhp}
\cfg{html-mshtmlhelp-contents}{putty.hhc}
\cfg{html-mshtmlhelp-index}{putty.hhk}
\versionid $Id$

View File

@ -2005,7 +2005,7 @@ int winctrl_handle_command(struct dlgparam *dp, UINT msg,
/* /*
* This function can be called to produce context help on a * 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 winctrl_context_help(struct dlgparam *dp, HWND hwnd, int id)
{ {
@ -2032,9 +2032,7 @@ int winctrl_context_help(struct dlgparam *dp, HWND hwnd, int id)
if (!c->ctrl || !c->ctrl->generic.helpctx.p) if (!c->ctrl || !c->ctrl->generic.helpctx.p)
return 0; /* no help available for this ctrl */ return 0; /* no help available for this ctrl */
cmd = dupprintf("JI(`',`%s')", c->ctrl->generic.helpctx.p); launch_help(hwnd, c->ctrl->generic.helpctx.p);
WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)cmd);
sfree(cmd);
return 1; return 1;
} }

View File

@ -380,7 +380,7 @@ static int CALLBACK GenericMainDlgProc(HWND hwnd, UINT msg,
create_controls(hwnd, ""); /* Open and Cancel buttons etc */ create_controls(hwnd, ""); /* Open and Cancel buttons etc */
SetWindowText(hwnd, dp.wintitle); SetWindowText(hwnd, dp.wintitle);
SetWindowLongPtr(hwnd, GWLP_USERDATA, 0); SetWindowLongPtr(hwnd, GWLP_USERDATA, 0);
if (help_path) if (has_help())
SetWindowLongPtr(hwnd, GWL_EXSTYLE, SetWindowLongPtr(hwnd, GWL_EXSTYLE,
GetWindowLongPtr(hwnd, GWL_EXSTYLE) | GetWindowLongPtr(hwnd, GWL_EXSTYLE) |
WS_EX_CONTEXTHELP); WS_EX_CONTEXTHELP);
@ -389,7 +389,6 @@ static int CALLBACK GenericMainDlgProc(HWND hwnd, UINT msg,
if (item) if (item)
DestroyWindow(item); DestroyWindow(item);
} }
requested_help = FALSE;
SendMessage(hwnd, WM_SETICON, (WPARAM) ICON_BIG, SendMessage(hwnd, WM_SETICON, (WPARAM) ICON_BIG,
(LPARAM) LoadIcon(hinst, MAKEINTRESOURCE(IDI_CFGICON))); (LPARAM) LoadIcon(hinst, MAKEINTRESOURCE(IDI_CFGICON)));
/* /*
@ -586,19 +585,12 @@ static int CALLBACK GenericMainDlgProc(HWND hwnd, UINT msg,
ret = 0; ret = 0;
return ret; return ret;
case WM_HELP: case WM_HELP:
if (help_path) { if (!winctrl_context_help(&dp, hwnd,
if (winctrl_context_help(&dp, hwnd, ((LPHELPINFO)lParam)->iCtrlId))
((LPHELPINFO)lParam)->iCtrlId)) MessageBeep(0);
requested_help = TRUE;
else
MessageBeep(0);
}
break; break;
case WM_CLOSE: case WM_CLOSE:
if (requested_help) { quit_help(hwnd);
WinHelp(hwnd, help_path, HELP_QUIT, 0);
requested_help = FALSE;
}
SaneEndDialog(hwnd, 0); SaneEndDialog(hwnd, 0);
return 0; return 0;
@ -622,12 +614,7 @@ void modal_about_box(HWND hwnd)
void show_help(HWND hwnd) void show_help(HWND hwnd)
{ {
if (help_path) { launch_help(hwnd, NULL);
WinHelp(hwnd, help_path,
help_has_contents ? HELP_FINDER : HELP_CONTENTS,
0);
requested_help = TRUE;
}
} }
void defuse_showwindow(void) void defuse_showwindow(void)
@ -653,7 +640,7 @@ int do_config(void)
ctrlbox = ctrl_new_box(); ctrlbox = ctrl_new_box();
setup_config_box(ctrlbox, FALSE, 0, 0); setup_config_box(ctrlbox, FALSE, 0, 0);
win_setup_config_box(ctrlbox, &dp.hwnd, (help_path != NULL), FALSE, 0); win_setup_config_box(ctrlbox, &dp.hwnd, has_help(), FALSE, 0);
dp_init(&dp); dp_init(&dp);
winctrl_init(&ctrls_base); winctrl_init(&ctrls_base);
winctrl_init(&ctrls_panel); winctrl_init(&ctrls_panel);
@ -685,7 +672,7 @@ int do_reconfig(HWND hwnd, int protcfginfo)
ctrlbox = ctrl_new_box(); ctrlbox = ctrl_new_box();
setup_config_box(ctrlbox, TRUE, cfg.protocol, protcfginfo); setup_config_box(ctrlbox, TRUE, cfg.protocol, protcfginfo);
win_setup_config_box(ctrlbox, &dp.hwnd, (help_path != NULL), TRUE, win_setup_config_box(ctrlbox, &dp.hwnd, has_help(), TRUE,
cfg.protocol); cfg.protocol);
dp_init(&dp); dp_init(&dp);
winctrl_init(&ctrls_base); winctrl_init(&ctrls_base);

View File

@ -345,31 +345,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
osVersion.dwPlatformId != VER_PLATFORM_WIN32_NT)) osVersion.dwPlatformId != VER_PLATFORM_WIN32_NT))
wm_mousewheel = RegisterWindowMessage("MSWHEEL_ROLLMSG"); wm_mousewheel = RegisterWindowMessage("MSWHEEL_ROLLMSG");
/* init_help();
* See if we can find our Help file.
*/
{
char b[2048], *p, *q, *r;
FILE *fp;
GetModuleFileName(NULL, b, sizeof(b) - 1);
r = b;
p = strrchr(b, '\\');
if (p && p >= r) r = p+1;
q = strrchr(b, ':');
if (q && q >= r) r = q+1;
strcpy(r, PUTTY_HELP_FILE);
if ( (fp = fopen(b, "r")) != NULL) {
help_path = dupstr(b);
fclose(fp);
} else
help_path = NULL;
strcpy(r, PUTTY_HELP_CONTENTS);
if ( (fp = fopen(b, "r")) != NULL) {
help_has_contents = TRUE;
fclose(fp);
} else
help_has_contents = FALSE;
}
/* /*
* Process the command line. * Process the command line.
@ -787,7 +763,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
AppendMenu(m, (cfg.resize_action == RESIZE_DISABLED) ? AppendMenu(m, (cfg.resize_action == RESIZE_DISABLED) ?
MF_GRAYED : MF_ENABLED, IDM_FULLSCREEN, "&Full Screen"); MF_GRAYED : MF_ENABLED, IDM_FULLSCREEN, "&Full Screen");
AppendMenu(m, MF_SEPARATOR, 0, 0); AppendMenu(m, MF_SEPARATOR, 0, 0);
if (help_path) if (has_help())
AppendMenu(m, MF_ENABLED, IDM_HELP, "&Help"); AppendMenu(m, MF_ENABLED, IDM_HELP, "&Help");
str = dupprintf("&About %s", appname); str = dupprintf("&About %s", appname);
AppendMenu(m, MF_ENABLED, IDM_ABOUT, str); AppendMenu(m, MF_ENABLED, IDM_ABOUT, str);
@ -884,6 +860,7 @@ void cleanup_exit(int code)
crypto_wrapup(); crypto_wrapup();
#endif #endif
} }
shutdown_help();
exit(code); exit(code);
} }
@ -2276,8 +2253,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
showabout(hwnd); showabout(hwnd);
break; break;
case IDM_HELP: case IDM_HELP:
WinHelp(hwnd, help_path, launch_help(hwnd, NULL);
help_has_contents ? HELP_FINDER : HELP_CONTENTS, 0);
break; break;
case SC_MOUSEMENU: case SC_MOUSEMENU:
/* /*

123
windows/winhelp.c Normal file
View File

@ -0,0 +1,123 @@
/*
* winhelp.c: centralised functions to launch Windows help files,
* and to decide whether to use .HLP or .CHM help in any given
* situation.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "putty.h"
#include <htmlhelp.h>
typedef HWND (CALLBACK *htmlhelp_t)(HWND, LPCSTR, UINT, DWORD);
static char *help_path, *chm_path;
static int help_has_contents;
static int requested_help;
static DWORD html_help_cookie;
static htmlhelp_t htmlhelp;
void init_help(void)
{
char b[2048], *p, *q, *r;
FILE *fp;
GetModuleFileName(NULL, b, sizeof(b) - 1);
r = b;
p = strrchr(b, '\\');
if (p && p >= r) r = p+1;
q = strrchr(b, ':');
if (q && q >= r) r = q+1;
strcpy(r, PUTTY_HELP_FILE);
if ( (fp = fopen(b, "r")) != NULL) {
help_path = dupstr(b);
fclose(fp);
} else
help_path = NULL;
strcpy(r, PUTTY_HELP_CONTENTS);
if ( (fp = fopen(b, "r")) != NULL) {
help_has_contents = TRUE;
fclose(fp);
} else
help_has_contents = FALSE;
strcpy(r, PUTTY_CHM_FILE);
if ( (fp = fopen(b, "r")) != NULL) {
chm_path = dupstr(b);
fclose(fp);
} else
chm_path = NULL;
if (chm_path) {
HINSTANCE dllHH = LoadLibrary("hhctrl.ocx");
if (dllHH) {
htmlhelp = (htmlhelp_t)GetProcAddress(dllHH, "HtmlHelpA");
if (!htmlhelp)
FreeLibrary(dllHH);
}
if (htmlhelp)
htmlhelp(NULL, NULL, HH_INITIALIZE, (DWORD)&html_help_cookie);
else
chm_path = NULL;
}
}
void shutdown_help(void)
{
if (chm_path)
htmlhelp(NULL, NULL, HH_UNINITIALIZE, html_help_cookie);
}
int has_help(void)
{
/*
* FIXME: it would be nice here to disregard help_path on
* platforms that didn't have WINHLP32. But that's probably
* unrealistic, since even Vista will have it if the user
* specifically downloads it.
*/
return (help_path || chm_path);
}
void launch_help(HWND hwnd, const char *topic)
{
if (topic) {
int colonpos = strcspn(topic, ":");
if (chm_path) {
char *fname;
assert(topic[colonpos] != '\0');
fname = dupprintf("%s::/%s.html>main", chm_path,
topic + colonpos + 1);
htmlhelp(hwnd, fname, HH_DISPLAY_TOPIC, 0);
sfree(fname);
} else if (help_path) {
char *cmd = dupprintf("JI(`',`%.*s')", colonpos, topic);
WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)cmd);
sfree(cmd);
}
} else {
if (chm_path) {
htmlhelp(hwnd, chm_path, HH_DISPLAY_TOPIC, 0);
} else if (help_path) {
WinHelp(hwnd, help_path,
help_has_contents ? HELP_FINDER : HELP_CONTENTS, 0);
}
}
requested_help = TRUE;
}
void quit_help(HWND hwnd)
{
if (requested_help) {
if (chm_path) {
htmlhelp(NULL, NULL, HH_CLOSE_ALL, 0);
} else if (help_path) {
WinHelp(hwnd, help_path, HELP_QUIT, 0);
}
requested_help = FALSE;
}
}

View File

@ -12,131 +12,148 @@
#define WINHELP_CTX_no_help NULL #define WINHELP_CTX_no_help NULL
#define WINHELP_CTX_session_hostname "session.hostname" #define WINHELP_CTX_session_hostname "session.hostname:config-hostname"
#define WINHELP_CTX_session_saved "session.saved" #define WINHELP_CTX_session_saved "session.saved:config-saving"
#define WINHELP_CTX_session_coe "session.coe" #define WINHELP_CTX_session_coe "session.coe:config-closeonexit"
#define WINHELP_CTX_logging_main "logging.main" #define WINHELP_CTX_logging_main "logging.main:config-logging"
#define WINHELP_CTX_logging_filename "logging.filename" #define WINHELP_CTX_logging_filename "logging.filename:config-logfilename"
#define WINHELP_CTX_logging_exists "logging.exists" #define WINHELP_CTX_logging_exists "logging.exists:config-logfileexists"
#define WINHELP_CTX_logging_flush "logging.flush" #define WINHELP_CTX_logging_flush "logging.flush:config-logflush"
#define WINHELP_CTX_logging_ssh_omit_password "logging.ssh.omitpassword" #define WINHELP_CTX_logging_ssh_omit_password "logging.ssh.omitpassword:config-logssh"
#define WINHELP_CTX_logging_ssh_omit_data "logging.ssh.omitdata" #define WINHELP_CTX_logging_ssh_omit_data "logging.ssh.omitdata:config-logssh"
#define WINHELP_CTX_keyboard_backspace "keyboard.backspace" #define WINHELP_CTX_keyboard_backspace "keyboard.backspace:config-backspace"
#define WINHELP_CTX_keyboard_homeend "keyboard.homeend" #define WINHELP_CTX_keyboard_homeend "keyboard.homeend:config-homeend"
#define WINHELP_CTX_keyboard_funkeys "keyboard.funkeys" #define WINHELP_CTX_keyboard_funkeys "keyboard.funkeys:config-funkeys"
#define WINHELP_CTX_keyboard_appkeypad "keyboard.appkeypad" #define WINHELP_CTX_keyboard_appkeypad "keyboard.appkeypad:config-appkeypad"
#define WINHELP_CTX_keyboard_appcursor "keyboard.appcursor" #define WINHELP_CTX_keyboard_appcursor "keyboard.appcursor:config-appcursor"
#define WINHELP_CTX_keyboard_nethack "keyboard.nethack" #define WINHELP_CTX_keyboard_nethack "keyboard.nethack:config-nethack"
#define WINHELP_CTX_keyboard_compose "keyboard.compose" #define WINHELP_CTX_keyboard_compose "keyboard.compose:config-compose"
#define WINHELP_CTX_keyboard_ctrlalt "keyboard.ctrlalt" #define WINHELP_CTX_keyboard_ctrlalt "keyboard.ctrlalt:config-ctrlalt"
#define WINHELP_CTX_features_application "features.application" #define WINHELP_CTX_features_application "features.application:config-features-application"
#define WINHELP_CTX_features_mouse "features.mouse" #define WINHELP_CTX_features_mouse "features.mouse:config-features-mouse"
#define WINHELP_CTX_features_resize "features.resize" #define WINHELP_CTX_features_resize "features.resize:config-features-resize"
#define WINHELP_CTX_features_altscreen "features.altscreen" #define WINHELP_CTX_features_altscreen "features.altscreen:config-features-altscreen"
#define WINHELP_CTX_features_retitle "features.retitle" #define WINHELP_CTX_features_retitle "features.retitle:config-features-retitle"
#define WINHELP_CTX_features_qtitle "features.qtitle" #define WINHELP_CTX_features_qtitle "features.qtitle:config-features-qtitle"
#define WINHELP_CTX_features_dbackspace "features.dbackspace" #define WINHELP_CTX_features_dbackspace "features.dbackspace:config-features-dbackspace"
#define WINHELP_CTX_features_charset "features.charset" #define WINHELP_CTX_features_charset "features.charset:config-features-charset"
#define WINHELP_CTX_features_arabicshaping "features.arabicshaping" #define WINHELP_CTX_features_arabicshaping "features.arabicshaping:config-features-shaping"
#define WINHELP_CTX_features_bidi "features.bidi" #define WINHELP_CTX_features_bidi "features.bidi:config-features-bidi"
#define WINHELP_CTX_terminal_autowrap "terminal.autowrap" #define WINHELP_CTX_terminal_autowrap "terminal.autowrap:config-autowrap"
#define WINHELP_CTX_terminal_decom "terminal.decom" #define WINHELP_CTX_terminal_decom "terminal.decom:config-decom"
#define WINHELP_CTX_terminal_lfhascr "terminal.lfhascr" #define WINHELP_CTX_terminal_lfhascr "terminal.lfhascr:config-crlf"
#define WINHELP_CTX_terminal_bce "terminal.bce" #define WINHELP_CTX_terminal_bce "terminal.bce:config-erase"
#define WINHELP_CTX_terminal_blink "terminal.blink" #define WINHELP_CTX_terminal_blink "terminal.blink:config-blink"
#define WINHELP_CTX_terminal_answerback "terminal.answerback" #define WINHELP_CTX_terminal_answerback "terminal.answerback:config-answerback"
#define WINHELP_CTX_terminal_localecho "terminal.localecho" #define WINHELP_CTX_terminal_localecho "terminal.localecho:config-localecho"
#define WINHELP_CTX_terminal_localedit "terminal.localedit" #define WINHELP_CTX_terminal_localedit "terminal.localedit:config-localedit"
#define WINHELP_CTX_terminal_printing "terminal.printing" #define WINHELP_CTX_terminal_printing "terminal.printing:config-printing"
#define WINHELP_CTX_bell_style "bell.style" #define WINHELP_CTX_bell_style "bell.style:config-bellstyle"
#define WINHELP_CTX_bell_taskbar "bell.taskbar" #define WINHELP_CTX_bell_taskbar "bell.taskbar:config-belltaskbar"
#define WINHELP_CTX_bell_overload "bell.overload" #define WINHELP_CTX_bell_overload "bell.overload:config-bellovl"
#define WINHELP_CTX_window_size "window.size" #define WINHELP_CTX_window_size "window.size:config-winsize"
#define WINHELP_CTX_window_resize "window.resize" #define WINHELP_CTX_window_resize "window.resize:config-winsizelock"
#define WINHELP_CTX_window_scrollback "window.scrollback" #define WINHELP_CTX_window_scrollback "window.scrollback:config-scrollback"
#define WINHELP_CTX_window_erased "window.erased" #define WINHELP_CTX_window_erased "window.erased:config-erasetoscrollback"
#define WINHELP_CTX_behaviour_closewarn "behaviour.closewarn" #define WINHELP_CTX_behaviour_closewarn "behaviour.closewarn:config-warnonclose"
#define WINHELP_CTX_behaviour_altf4 "behaviour.altf4" #define WINHELP_CTX_behaviour_altf4 "behaviour.altf4:config-altf4"
#define WINHELP_CTX_behaviour_altspace "behaviour.altspace" #define WINHELP_CTX_behaviour_altspace "behaviour.altspace:config-altspace"
#define WINHELP_CTX_behaviour_altonly "behaviour.altonly" #define WINHELP_CTX_behaviour_altonly "behaviour.altonly:config-altonly"
#define WINHELP_CTX_behaviour_alwaysontop "behaviour.alwaysontop" #define WINHELP_CTX_behaviour_alwaysontop "behaviour.alwaysontop:config-alwaysontop"
#define WINHELP_CTX_behaviour_altenter "behaviour.altenter" #define WINHELP_CTX_behaviour_altenter "behaviour.altenter:config-fullscreen"
#define WINHELP_CTX_appearance_cursor "appearance.cursor" #define WINHELP_CTX_appearance_cursor "appearance.cursor:config-cursor"
#define WINHELP_CTX_appearance_font "appearance.font" #define WINHELP_CTX_appearance_font "appearance.font:config-font"
#define WINHELP_CTX_appearance_title "appearance.title" #define WINHELP_CTX_appearance_title "appearance.title:config-title"
#define WINHELP_CTX_appearance_hidemouse "appearance.hidemouse" #define WINHELP_CTX_appearance_hidemouse "appearance.hidemouse:config-mouseptr"
#define WINHELP_CTX_appearance_border "appearance.border" #define WINHELP_CTX_appearance_border "appearance.border:config-winborder"
#define WINHELP_CTX_connection_termtype "connection.termtype" #define WINHELP_CTX_connection_termtype "connection.termtype:config-termtype"
#define WINHELP_CTX_connection_termspeed "connection.termspeed" #define WINHELP_CTX_connection_termspeed "connection.termspeed:config-termspeed"
#define WINHELP_CTX_connection_username "connection.username" #define WINHELP_CTX_connection_username "connection.username:config-username"
#define WINHELP_CTX_connection_keepalive "connection.keepalive" #define WINHELP_CTX_connection_keepalive "connection.keepalive:config-keepalive"
#define WINHELP_CTX_connection_nodelay "connection.nodelay" #define WINHELP_CTX_connection_nodelay "connection.nodelay:config-nodelay"
#define WINHELP_CTX_connection_ipversion "connection.ipversion" #define WINHELP_CTX_connection_ipversion "connection.ipversion:config-address-family"
#define WINHELP_CTX_connection_tcpkeepalive "connection.tcpkeepalive" #define WINHELP_CTX_connection_tcpkeepalive "connection.tcpkeepalive:config-tcp-keepalives"
#define WINHELP_CTX_proxy_type "proxy.type" #define WINHELP_CTX_proxy_type "proxy.type:config-proxy-type"
#define WINHELP_CTX_proxy_main "proxy.main" #define WINHELP_CTX_proxy_main "proxy.main:config-proxy"
#define WINHELP_CTX_proxy_exclude "proxy.exclude" #define WINHELP_CTX_proxy_exclude "proxy.exclude:config-proxy-exclude"
#define WINHELP_CTX_proxy_dns "proxy.dns" #define WINHELP_CTX_proxy_dns "proxy.dns:config-proxy-dns"
#define WINHELP_CTX_proxy_auth "proxy.auth" #define WINHELP_CTX_proxy_auth "proxy.auth:config-proxy-auth"
#define WINHELP_CTX_proxy_command "proxy.command" #define WINHELP_CTX_proxy_command "proxy.command:config-proxy-command"
#define WINHELP_CTX_proxy_socksver "proxy.socksver" #define WINHELP_CTX_telnet_environ "telnet.environ:config-environ"
#define WINHELP_CTX_telnet_environ "telnet.environ" #define WINHELP_CTX_telnet_oldenviron "telnet.oldenviron:config-oldenviron"
#define WINHELP_CTX_telnet_oldenviron "telnet.oldenviron" #define WINHELP_CTX_telnet_passive "telnet.passive:config-ptelnet"
#define WINHELP_CTX_telnet_passive "telnet.passive" #define WINHELP_CTX_telnet_specialkeys "telnet.specialkeys:config-telnetkey"
#define WINHELP_CTX_telnet_specialkeys "telnet.specialkeys" #define WINHELP_CTX_telnet_newline "telnet.newline:config-telnetnl"
#define WINHELP_CTX_telnet_newline "telnet.newline" #define WINHELP_CTX_rlogin_localuser "rlogin.localuser:config-rlogin-localuser"
#define WINHELP_CTX_rlogin_localuser "rlogin.localuser" #define WINHELP_CTX_ssh_nopty "ssh.nopty:config-ssh-pty"
#define WINHELP_CTX_ssh_nopty "ssh.nopty" #define WINHELP_CTX_ssh_ttymodes "ssh.ttymodes:config-ttymodes"
#define WINHELP_CTX_ssh_ttymodes "ssh.ttymodes" #define WINHELP_CTX_ssh_noshell "ssh.noshell:config-ssh-noshell"
#define WINHELP_CTX_ssh_noshell "ssh.noshell" #define WINHELP_CTX_ssh_ciphers "ssh.ciphers:config-ssh-encryption"
#define WINHELP_CTX_ssh_ciphers "ssh.ciphers" #define WINHELP_CTX_ssh_protocol "ssh.protocol:config-ssh-prot"
#define WINHELP_CTX_ssh_protocol "ssh.protocol" #define WINHELP_CTX_ssh_command "ssh.command:config-command"
#define WINHELP_CTX_ssh_command "ssh.command" #define WINHELP_CTX_ssh_compress "ssh.compress:config-ssh-comp"
#define WINHELP_CTX_ssh_compress "ssh.compress" #define WINHELP_CTX_ssh_kexlist "ssh.kex.order:config-ssh-kex-order"
#define WINHELP_CTX_ssh_kexlist "ssh.kex.order" #define WINHELP_CTX_ssh_kex_repeat "ssh.kex.repeat:config-ssh-kex-rekey"
#define WINHELP_CTX_ssh_kex_repeat "ssh.kex.repeat" #define WINHELP_CTX_ssh_auth_bypass "ssh.auth.bypass:config-ssh-noauth"
#define WINHELP_CTX_ssh_auth_bypass "ssh.auth.bypass" #define WINHELP_CTX_ssh_auth_privkey "ssh.auth.privkey:config-ssh-privkey"
#define WINHELP_CTX_ssh_auth_privkey "ssh.auth.privkey" #define WINHELP_CTX_ssh_auth_agentfwd "ssh.auth.agentfwd:config-ssh-agentfwd"
#define WINHELP_CTX_ssh_auth_agentfwd "ssh.auth.agentfwd" #define WINHELP_CTX_ssh_auth_changeuser "ssh.auth.changeuser:config-ssh-changeuser"
#define WINHELP_CTX_ssh_auth_changeuser "ssh.auth.changeuser" #define WINHELP_CTX_ssh_auth_pageant "ssh.auth.pageant:config-ssh-tryagent"
#define WINHELP_CTX_ssh_auth_pageant "ssh.auth.pageant" #define WINHELP_CTX_ssh_auth_tis "ssh.auth.tis:config-ssh-tis"
#define WINHELP_CTX_ssh_auth_tis "ssh.auth.tis" #define WINHELP_CTX_ssh_auth_ki "ssh.auth.ki:config-ssh-ki"
#define WINHELP_CTX_ssh_auth_ki "ssh.auth.ki" #define WINHELP_CTX_selection_buttons "selection.buttons:config-mouse"
#define WINHELP_CTX_selection_buttons "selection.buttons" #define WINHELP_CTX_selection_shiftdrag "selection.shiftdrag:config-mouseshift"
#define WINHELP_CTX_selection_shiftdrag "selection.shiftdrag" #define WINHELP_CTX_selection_rect "selection.rect:config-rectselect"
#define WINHELP_CTX_selection_rect "selection.rect" #define WINHELP_CTX_selection_charclasses "selection.charclasses:config-charclasses"
#define WINHELP_CTX_selection_charclasses "selection.charclasses" #define WINHELP_CTX_selection_linedraw "selection.linedraw:config-linedrawpaste"
#define WINHELP_CTX_selection_linedraw "selection.linedraw" #define WINHELP_CTX_selection_rtf "selection.rtf:config-rtfpaste"
#define WINHELP_CTX_selection_rtf "selection.rtf" #define WINHELP_CTX_colours_ansi "colours.ansi:config-ansicolour"
#define WINHELP_CTX_colours_ansi "colours.ansi" #define WINHELP_CTX_colours_xterm256 "colours.xterm256:config-xtermcolour"
#define WINHELP_CTX_colours_xterm256 "colours.xterm256" #define WINHELP_CTX_colours_bold "colours.bold:config-boldcolour"
#define WINHELP_CTX_colours_bold "colours.bold" #define WINHELP_CTX_colours_system "colours.system:config-syscolour"
#define WINHELP_CTX_colours_system "colours.system" #define WINHELP_CTX_colours_logpal "colours.logpal:config-logpalette"
#define WINHELP_CTX_colours_logpal "colours.logpal" #define WINHELP_CTX_colours_config "colours.config:config-colourcfg"
#define WINHELP_CTX_colours_config "colours.config" #define WINHELP_CTX_translation_codepage "translation.codepage:config-charset"
#define WINHELP_CTX_translation_codepage "translation.codepage" #define WINHELP_CTX_translation_cjk_ambig_wide "translation.cjkambigwide:config-cjk-ambig-wide"
#define WINHELP_CTX_translation_cjk_ambig_wide "translation.cjkambigwide" #define WINHELP_CTX_translation_cyrillic "translation.cyrillic:config-cyr"
#define WINHELP_CTX_translation_cyrillic "translation.cyrillic" #define WINHELP_CTX_translation_linedraw "translation.linedraw:config-linedraw"
#define WINHELP_CTX_translation_linedraw "translation.linedraw" #define WINHELP_CTX_ssh_tunnels_x11 "ssh.tunnels.x11:config-ssh-x11"
#define WINHELP_CTX_ssh_tunnels_x11 "ssh.tunnels.x11" #define WINHELP_CTX_ssh_tunnels_x11auth "ssh.tunnels.x11auth:config-ssh-x11auth"
#define WINHELP_CTX_ssh_tunnels_x11auth "ssh.tunnels.x11auth" #define WINHELP_CTX_ssh_tunnels_portfwd "ssh.tunnels.portfwd:config-ssh-portfwd"
#define WINHELP_CTX_ssh_tunnels_portfwd "ssh.tunnels.portfwd" #define WINHELP_CTX_ssh_tunnels_portfwd_localhost "ssh.tunnels.portfwd.localhost:config-ssh-portfwd-localhost"
#define WINHELP_CTX_ssh_tunnels_portfwd_localhost "ssh.tunnels.portfwd.localhost" #define WINHELP_CTX_ssh_tunnels_portfwd_ipversion "ssh.tunnels.portfwd.ipversion:config-ssh-portfwd-address-family"
#define WINHELP_CTX_ssh_tunnels_portfwd_ipversion "ssh.tunnels.portfwd.ipversion" #define WINHELP_CTX_ssh_bugs_ignore1 "ssh.bugs.ignore1:config-ssh-bug-ignore1"
#define WINHELP_CTX_ssh_bugs_ignore1 "ssh.bugs.ignore1" #define WINHELP_CTX_ssh_bugs_plainpw1 "ssh.bugs.plainpw1:config-ssh-bug-plainpw1"
#define WINHELP_CTX_ssh_bugs_plainpw1 "ssh.bugs.plainpw1" #define WINHELP_CTX_ssh_bugs_rsa1 "ssh.bugs.rsa1:config-ssh-bug-rsa1"
#define WINHELP_CTX_ssh_bugs_rsa1 "ssh.bugs.rsa1" #define WINHELP_CTX_ssh_bugs_hmac2 "ssh.bugs.hmac2:config-ssh-bug-hmac2"
#define WINHELP_CTX_ssh_bugs_hmac2 "ssh.bugs.hmac2" #define WINHELP_CTX_ssh_bugs_derivekey2 "ssh.bugs.derivekey2:config-ssh-bug-derivekey2"
#define WINHELP_CTX_ssh_bugs_derivekey2 "ssh.bugs.derivekey2" #define WINHELP_CTX_ssh_bugs_rsapad2 "ssh.bugs.rsapad2:config-ssh-bug-sig"
#define WINHELP_CTX_ssh_bugs_rsapad2 "ssh.bugs.rsapad2" #define WINHELP_CTX_ssh_bugs_pksessid2 "ssh.bugs.pksessid2:config-ssh-bug-pksessid2"
#define WINHELP_CTX_ssh_bugs_pksessid2 "ssh.bugs.pksessid2" #define WINHELP_CTX_ssh_bugs_rekey2 "ssh.bugs.rekey2:config-ssh-bug-rekey"
#define WINHELP_CTX_ssh_bugs_rekey2 "ssh.bugs.rekey2" #define WINHELP_CTX_serial_line "serial.line:config-serial-line"
#define WINHELP_CTX_serial_line "serial.line" #define WINHELP_CTX_serial_speed "serial.speed:config-serial-speed"
#define WINHELP_CTX_serial_speed "serial.speed" #define WINHELP_CTX_serial_databits "serial.databits:config-serial-databits"
#define WINHELP_CTX_serial_databits "serial.databits" #define WINHELP_CTX_serial_stopbits "serial.stopbits:config-serial-stopbits"
#define WINHELP_CTX_serial_stopbits "serial.stopbits" #define WINHELP_CTX_serial_parity "serial.parity:config-serial-parity"
#define WINHELP_CTX_serial_parity "serial.parity" #define WINHELP_CTX_serial_flow "serial.flow:config-serial-flow"
#define WINHELP_CTX_serial_flow "serial.flow"
#define WINHELP_CTX_pageant_general "pageant.general:pageant"
#define WINHELP_CTX_pageant_keylist "pageant.keylist:pageant-mainwin-keylist"
#define WINHELP_CTX_pageant_addkey "pageant.addkey:pageant-mainwin-addkey"
#define WINHELP_CTX_pageant_remkey "pageant.remkey:pageant-mainwin-remkey"
#define WINHELP_CTX_pgpfingerprints "pgpfingerprints:pgpkeys"
#define WINHELP_CTX_puttygen_general "puttygen.general:pubkey-puttygen"
#define WINHELP_CTX_puttygen_keytype "puttygen.keytype:puttygen-keytype"
#define WINHELP_CTX_puttygen_bits "puttygen.bits:puttygen-strength"
#define WINHELP_CTX_puttygen_generate "puttygen.generate:puttygen-generate"
#define WINHELP_CTX_puttygen_fingerprint "puttygen.fingerprint:puttygen-fingerprint"
#define WINHELP_CTX_puttygen_comment "puttygen.comment:puttygen-comment"
#define WINHELP_CTX_puttygen_passphrase "puttygen.passphrase:puttygen-passphrase"
#define WINHELP_CTX_puttygen_savepriv "puttygen.savepriv:puttygen-savepriv"
#define WINHELP_CTX_puttygen_savepub "puttygen.savepub:puttygen-savepub"
#define WINHELP_CTX_puttygen_pastekey "puttygen.pastekey:puttygen-pastekey"
#define WINHELP_CTX_puttygen_load "puttygen.load:puttygen-load"
#define WINHELP_CTX_puttygen_conversions "puttygen.conversions:puttygen-conversions"
/* These are used in Windows-specific bits of the frontend. /* These are used in Windows-specific bits of the frontend.
* We (ab)use "help context identifiers" (dwContextId) to identify them. */ * We (ab)use "help context identifiers" (dwContextId) to identify them. */
@ -144,13 +161,13 @@
#define HELPCTXID(x) WINHELP_CTXID_ ## x #define HELPCTXID(x) WINHELP_CTXID_ ## x
#define WINHELP_CTXID_no_help 0 #define WINHELP_CTXID_no_help 0
#define WINHELP_CTX_errors_hostkey_absent "errors.hostkey.absent" #define WINHELP_CTX_errors_hostkey_absent "errors.hostkey.absent:errors-hostkey-absent"
#define WINHELP_CTXID_errors_hostkey_absent 1 #define WINHELP_CTXID_errors_hostkey_absent 1
#define WINHELP_CTX_errors_hostkey_changed "errors.hostkey.changed" #define WINHELP_CTX_errors_hostkey_changed "errors.hostkey.changed:errors-hostkey-wrong"
#define WINHELP_CTXID_errors_hostkey_changed 2 #define WINHELP_CTXID_errors_hostkey_changed 2
#define WINHELP_CTX_errors_cantloadkey "errors.cantloadkey" #define WINHELP_CTX_errors_cantloadkey "errors.cantloadkey:errors-cant-load-key"
#define WINHELP_CTXID_errors_cantloadkey 3 #define WINHELP_CTXID_errors_cantloadkey 3
#define WINHELP_CTX_option_cleanup "options.cleanup" #define WINHELP_CTX_option_cleanup "options.cleanup:using-cleanup"
#define WINHELP_CTXID_option_cleanup 4 #define WINHELP_CTXID_option_cleanup 4
#define WINHELP_CTX_pgp_fingerprints "pgpfingerprints" #define WINHELP_CTX_pgp_fingerprints "pgpfingerprints:pgpkeys"
#define WINHELP_CTXID_pgp_fingerprints 5 #define WINHELP_CTXID_pgp_fingerprints 5

View File

@ -800,7 +800,7 @@ static int CALLBACK MainDlgProc(HWND hwnd, UINT msg,
switch (msg) { switch (msg) {
case WM_INITDIALOG: case WM_INITDIALOG:
if (help_path) if (has_help())
SetWindowLongPtr(hwnd, GWL_EXSTYLE, SetWindowLongPtr(hwnd, GWL_EXSTYLE,
GetWindowLongPtr(hwnd, GWL_EXSTYLE) | GetWindowLongPtr(hwnd, GWL_EXSTYLE) |
WS_EX_CONTEXTHELP); WS_EX_CONTEXTHELP);
@ -810,7 +810,6 @@ static int CALLBACK MainDlgProc(HWND hwnd, UINT msg,
* if the help file isn't present. * if the help file isn't present.
*/ */
} }
requested_help = FALSE;
SendMessage(hwnd, WM_SETICON, (WPARAM) ICON_BIG, SendMessage(hwnd, WM_SETICON, (WPARAM) ICON_BIG,
(LPARAM) LoadIcon(hinst, MAKEINTRESOURCE(200))); (LPARAM) LoadIcon(hinst, MAKEINTRESOURCE(200)));
@ -856,7 +855,7 @@ static int CALLBACK MainDlgProc(HWND hwnd, UINT msg,
menu1 = CreateMenu(); menu1 = CreateMenu();
AppendMenu(menu1, MF_ENABLED, IDC_ABOUT, "&About"); AppendMenu(menu1, MF_ENABLED, IDC_ABOUT, "&About");
if (help_path) if (has_help())
AppendMenu(menu1, MF_ENABLED, IDC_GIVEHELP, "&Help"); AppendMenu(menu1, MF_ENABLED, IDC_GIVEHELP, "&Help");
AppendMenu(menu, MF_POPUP | MF_ENABLED, (UINT) menu1, "&Help"); AppendMenu(menu, MF_POPUP | MF_ENABLED, (UINT) menu1, "&Help");
@ -1036,11 +1035,7 @@ static int CALLBACK MainDlgProc(HWND hwnd, UINT msg,
case IDC_GIVEHELP: case IDC_GIVEHELP:
if (HIWORD(wParam) == BN_CLICKED || if (HIWORD(wParam) == BN_CLICKED ||
HIWORD(wParam) == BN_DOUBLECLICKED) { HIWORD(wParam) == BN_DOUBLECLICKED) {
if (help_path) { launch_help(hwnd, WINHELP_CTX_puttygen_general);
WinHelp(hwnd, help_path, HELP_COMMAND,
(DWORD)"JI(`',`puttygen.general')");
requested_help = TRUE;
}
} }
return 0; return 0;
case IDC_GENERATE: case IDC_GENERATE:
@ -1331,7 +1326,7 @@ static int CALLBACK MainDlgProc(HWND hwnd, UINT msg,
ui_set_state(hwnd, state, 2); ui_set_state(hwnd, state, 2);
break; break;
case WM_HELP: case WM_HELP:
if (help_path) { {
int id = ((LPHELPINFO)lParam)->iCtrlId; int id = ((LPHELPINFO)lParam)->iCtrlId;
char *topic = NULL; char *topic = NULL;
switch (id) { switch (id) {
@ -1339,47 +1334,44 @@ static int CALLBACK MainDlgProc(HWND hwnd, UINT msg,
case IDC_PROGRESS: case IDC_PROGRESS:
case IDC_GENSTATIC: case IDC_GENSTATIC:
case IDC_GENERATE: case IDC_GENERATE:
topic = "puttygen.generate"; break; topic = WINHELP_CTX_puttygen_generate; break;
case IDC_PKSTATIC: case IDC_PKSTATIC:
case IDC_KEYDISPLAY: case IDC_KEYDISPLAY:
topic = "puttygen.pastekey"; break; topic = WINHELP_CTX_puttygen_pastekey; break;
case IDC_FPSTATIC: case IDC_FPSTATIC:
case IDC_FINGERPRINT: case IDC_FINGERPRINT:
topic = "puttygen.fingerprint"; break; topic = WINHELP_CTX_puttygen_fingerprint; break;
case IDC_COMMENTSTATIC: case IDC_COMMENTSTATIC:
case IDC_COMMENTEDIT: case IDC_COMMENTEDIT:
topic = "puttygen.comment"; break; topic = WINHELP_CTX_puttygen_comment; break;
case IDC_PASSPHRASE1STATIC: case IDC_PASSPHRASE1STATIC:
case IDC_PASSPHRASE1EDIT: case IDC_PASSPHRASE1EDIT:
case IDC_PASSPHRASE2STATIC: case IDC_PASSPHRASE2STATIC:
case IDC_PASSPHRASE2EDIT: case IDC_PASSPHRASE2EDIT:
topic = "puttygen.passphrase"; break; topic = WINHELP_CTX_puttygen_passphrase; break;
case IDC_LOADSTATIC: case IDC_LOADSTATIC:
case IDC_LOAD: case IDC_LOAD:
topic = "puttygen.load"; break; topic = WINHELP_CTX_puttygen_load; break;
case IDC_SAVESTATIC: case IDC_SAVESTATIC:
case IDC_SAVE: case IDC_SAVE:
topic = "puttygen.savepriv"; break; topic = WINHELP_CTX_puttygen_savepriv; break;
case IDC_SAVEPUB: case IDC_SAVEPUB:
topic = "puttygen.savepub"; break; topic = WINHELP_CTX_puttygen_savepub; break;
case IDC_TYPESTATIC: case IDC_TYPESTATIC:
case IDC_KEYSSH1: case IDC_KEYSSH1:
case IDC_KEYSSH2RSA: case IDC_KEYSSH2RSA:
case IDC_KEYSSH2DSA: case IDC_KEYSSH2DSA:
topic = "puttygen.keytype"; break; topic = WINHELP_CTX_puttygen_keytype; break;
case IDC_BITSSTATIC: case IDC_BITSSTATIC:
case IDC_BITS: case IDC_BITS:
topic = "puttygen.bits"; break; topic = WINHELP_CTX_puttygen_bits; break;
case IDC_IMPORT: case IDC_IMPORT:
case IDC_EXPORT_OPENSSH: case IDC_EXPORT_OPENSSH:
case IDC_EXPORT_SSHCOM: case IDC_EXPORT_SSHCOM:
topic = "puttygen.conversions"; break; topic = WINHELP_CTX_puttygen_conversions; break;
} }
if (topic) { if (topic) {
char *cmd = dupprintf("JI(`',`%s')", topic); launch_help(hwnd, topic);
WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)cmd);
sfree(cmd);
requested_help = TRUE;
} else { } else {
MessageBeep(0); MessageBeep(0);
} }
@ -1388,22 +1380,24 @@ static int CALLBACK MainDlgProc(HWND hwnd, UINT msg,
case WM_CLOSE: case WM_CLOSE:
state = (struct MainDlgState *) GetWindowLongPtr(hwnd, GWLP_USERDATA); state = (struct MainDlgState *) GetWindowLongPtr(hwnd, GWLP_USERDATA);
sfree(state); sfree(state);
if (requested_help) { quit_help(hwnd);
WinHelp(hwnd, help_path, HELP_QUIT, 0);
requested_help = FALSE;
}
EndDialog(hwnd, 1); EndDialog(hwnd, 1);
return 0; return 0;
} }
return 0; return 0;
} }
void cleanup_exit(int code) { exit(code); } void cleanup_exit(int code)
{
shutdown_help();
exit(code);
}
int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
{ {
int argc; int argc;
char **argv; char **argv;
int ret;
InitCommonControls(); InitCommonControls();
hinst = inst; hinst = inst;
@ -1412,22 +1406,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
/* /*
* See if we can find our Help file. * See if we can find our Help file.
*/ */
{ init_help();
char b[2048], *p, *q, *r;
FILE *fp;
GetModuleFileName(NULL, b, sizeof(b) - 1);
r = b;
p = strrchr(b, '\\');
if (p && p >= r) r = p+1;
q = strrchr(b, ':');
if (q && q >= r) r = q+1;
strcpy(r, PUTTY_HELP_FILE);
if ( (fp = fopen(b, "r")) != NULL) {
help_path = dupstr(b);
fclose(fp);
} else
help_path = NULL;
}
split_into_argv(cmdline, &argc, &argv, NULL); split_into_argv(cmdline, &argc, &argv, NULL);
@ -1445,6 +1424,8 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
} }
random_ref(); random_ref();
return DialogBox(hinst, MAKEINTRESOURCE(201), NULL, ret = DialogBox(hinst, MAKEINTRESOURCE(201), NULL, MainDlgProc) != IDOK;
MainDlgProc) != IDOK;
cleanup_exit(ret);
return ret; /* just in case optimiser complains */
} }

View File

@ -1470,7 +1470,7 @@ static int CALLBACK KeyListProc(HWND hwnd, UINT msg,
rd.right - rd.left, rd.bottom - rd.top, TRUE); rd.right - rd.left, rd.bottom - rd.top, TRUE);
} }
if (help_path) if (has_help())
SetWindowLongPtr(hwnd, GWL_EXSTYLE, SetWindowLongPtr(hwnd, GWL_EXSTYLE,
GetWindowLongPtr(hwnd, GWL_EXSTYLE) | GetWindowLongPtr(hwnd, GWL_EXSTYLE) |
WS_EX_CONTEXTHELP); WS_EX_CONTEXTHELP);
@ -1479,7 +1479,6 @@ static int CALLBACK KeyListProc(HWND hwnd, UINT msg,
if (item) if (item)
DestroyWindow(item); DestroyWindow(item);
} }
requested_help = FALSE;
keylist = hwnd; keylist = hwnd;
{ {
@ -1572,29 +1571,22 @@ static int CALLBACK KeyListProc(HWND hwnd, UINT msg,
case 103: /* help */ case 103: /* help */
if (HIWORD(wParam) == BN_CLICKED || if (HIWORD(wParam) == BN_CLICKED ||
HIWORD(wParam) == BN_DOUBLECLICKED) { HIWORD(wParam) == BN_DOUBLECLICKED) {
if (help_path) { launch_help(hwnd, WINHELP_CTX_pageant_general);
WinHelp(hwnd, help_path, HELP_COMMAND,
(DWORD)"JI(`',`pageant.general')");
requested_help = TRUE;
}
} }
return 0; return 0;
} }
return 0; return 0;
case WM_HELP: case WM_HELP:
if (help_path) { {
int id = ((LPHELPINFO)lParam)->iCtrlId; int id = ((LPHELPINFO)lParam)->iCtrlId;
char *topic = NULL; char *topic = NULL;
switch (id) { switch (id) {
case 100: topic = "pageant.keylist"; break; case 100: topic = WINHELP_CTX_pageant_keylist; break;
case 101: topic = "pageant.addkey"; break; case 101: topic = WINHELP_CTX_pageant_addkey; break;
case 102: topic = "pageant.remkey"; break; case 102: topic = WINHELP_CTX_pageant_remkey; break;
} }
if (topic) { if (topic) {
char *cmd = dupprintf("JI(`',`%s')", topic); launch_help(hwnd, topic);
WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)cmd);
sfree(cmd);
requested_help = TRUE;
} else { } else {
MessageBeep(0); MessageBeep(0);
} }
@ -1788,11 +1780,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
} }
break; break;
case IDM_HELP: case IDM_HELP:
if (help_path) { launch_help(hwnd, WINHELP_CTX_pageant_general);
WinHelp(hwnd, help_path, HELP_COMMAND,
(DWORD)"JI(`',`pageant.general')");
requested_help = TRUE;
}
break; break;
default: default:
{ {
@ -1819,10 +1807,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
} }
break; break;
case WM_DESTROY: case WM_DESTROY:
if (requested_help) { quit_help(hwnd);
WinHelp(hwnd, help_path, HELP_QUIT, 0);
requested_help = FALSE;
}
PostQuitMessage(0); PostQuitMessage(0);
return 0; return 0;
case WM_COPYDATA: case WM_COPYDATA:
@ -1948,7 +1933,11 @@ void agent_schedule_callback(void (*callback)(void *, void *, int),
assert(!"We shouldn't get here"); assert(!"We shouldn't get here");
} }
void cleanup_exit(int code) { exit(code); } void cleanup_exit(int code)
{
shutdown_help();
exit(code);
}
int flags = FLAG_SYNCAGENT; int flags = FLAG_SYNCAGENT;
@ -2006,22 +1995,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
/* /*
* See if we can find our Help file. * See if we can find our Help file.
*/ */
{ init_help();
char b[2048], *p, *q, *r;
FILE *fp;
GetModuleFileName(NULL, b, sizeof(b) - 1);
r = b;
p = strrchr(b, '\\');
if (p && p >= r) r = p+1;
q = strrchr(b, ':');
if (q && q >= r) r = q+1;
strcpy(r, PUTTY_HELP_FILE);
if ( (fp = fopen(b, "r")) != NULL) {
help_path = dupstr(b);
fclose(fp);
} else
help_path = NULL;
}
/* /*
* Look for the PuTTY binary (we will enable the saved session * Look for the PuTTY binary (we will enable the saved session
@ -2161,7 +2135,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
"&View Keys"); "&View Keys");
AppendMenu(systray_menu, MF_ENABLED, IDM_ADDKEY, "Add &Key"); AppendMenu(systray_menu, MF_ENABLED, IDM_ADDKEY, "Add &Key");
AppendMenu(systray_menu, MF_SEPARATOR, 0, 0); AppendMenu(systray_menu, MF_SEPARATOR, 0, 0);
if (help_path) if (has_help())
AppendMenu(systray_menu, MF_ENABLED, IDM_HELP, "&Help"); AppendMenu(systray_menu, MF_ENABLED, IDM_HELP, "&Help");
AppendMenu(systray_menu, MF_ENABLED, IDM_ABOUT, "&About"); AppendMenu(systray_menu, MF_ENABLED, IDM_ABOUT, "&About");
AppendMenu(systray_menu, MF_SEPARATOR, 0, 0); AppendMenu(systray_menu, MF_SEPARATOR, 0, 0);
@ -2201,5 +2175,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
if (advapi) if (advapi)
FreeLibrary(advapi); FreeLibrary(advapi);
return msg.wParam;
cleanup_exit(msg.wParam);
return msg.wParam; /* just in case optimiser complains */
} }

View File

@ -97,6 +97,7 @@ typedef struct terminal_tag Terminal;
#define PUTTY_REG_GPARENT_CHILD "SimonTatham" #define PUTTY_REG_GPARENT_CHILD "SimonTatham"
#define PUTTY_HELP_FILE "putty.hlp" #define PUTTY_HELP_FILE "putty.hlp"
#define PUTTY_CHM_FILE "putty.chm"
#define PUTTY_HELP_CONTENTS "putty.cnt" #define PUTTY_HELP_CONTENTS "putty.cnt"
#define GETTICKCOUNT GetTickCount #define GETTICKCOUNT GetTickCount
@ -120,11 +121,13 @@ GLOBAL HWND logbox;
GLOBAL HINSTANCE hinst; GLOBAL HINSTANCE hinst;
/* /*
* Details of the help file. * Help file stuff in winhelp.c.
*/ */
GLOBAL char *help_path; void init_help(void);
GLOBAL int help_has_contents; void shutdown_help(void);
GLOBAL int requested_help; int has_help(void);
void launch_help(HWND hwnd, const char *topic);
void quit_help(HWND hwnd);
/* /*
* The terminal and logging context are notionally local to the * The terminal and logging context are notionally local to the

View File

@ -94,28 +94,20 @@ void filereq_free(filereq *state)
/* Callback function to launch context help. */ /* Callback function to launch context help. */
static VOID CALLBACK message_box_help_callback(LPHELPINFO lpHelpInfo) static VOID CALLBACK message_box_help_callback(LPHELPINFO lpHelpInfo)
{ {
if (help_path) { char *context = NULL;
char *context = NULL;
#define CHECK_CTX(name) \ #define CHECK_CTX(name) \
do { \ do { \
if (lpHelpInfo->dwContextId == WINHELP_CTXID_ ## name) \ if (lpHelpInfo->dwContextId == WINHELP_CTXID_ ## name) \
context = WINHELP_CTX_ ## name; \ context = WINHELP_CTX_ ## name; \
} while (0) } while (0)
CHECK_CTX(errors_hostkey_absent); CHECK_CTX(errors_hostkey_absent);
CHECK_CTX(errors_hostkey_changed); CHECK_CTX(errors_hostkey_changed);
CHECK_CTX(errors_cantloadkey); CHECK_CTX(errors_cantloadkey);
CHECK_CTX(option_cleanup); CHECK_CTX(option_cleanup);
CHECK_CTX(pgp_fingerprints); CHECK_CTX(pgp_fingerprints);
#undef CHECK_CTX #undef CHECK_CTX
if (context) { if (context)
/* We avoid using malloc, in case we're in a situation where launch_help(hwnd, context);
* it would be awkward to do so. */
char cmd[WINHELP_CTX_MAXLEN+10];
sprintf(cmd, "JI(`',`%.*s')", WINHELP_CTX_MAXLEN, context);
WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)cmd);
requested_help = TRUE;
}
}
} }
int message_box(LPCTSTR text, LPCTSTR caption, DWORD style, DWORD helpctxid) int message_box(LPCTSTR text, LPCTSTR caption, DWORD style, DWORD helpctxid)
@ -136,7 +128,7 @@ int message_box(LPCTSTR text, LPCTSTR caption, DWORD style, DWORD helpctxid)
mbox.lpszCaption = caption; mbox.lpszCaption = caption;
mbox.dwContextHelpId = helpctxid; mbox.dwContextHelpId = helpctxid;
mbox.dwStyle = style; mbox.dwStyle = style;
if (helpctxid != 0 && help_path) mbox.dwStyle |= MB_HELP; if (helpctxid != 0 && has_help()) mbox.dwStyle |= MB_HELP;
return MessageBoxIndirect(&mbox); return MessageBoxIndirect(&mbox);
} }