X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/e634699906875560987ba8d6aa776ef7b8394301..7440fd4419acfc9c784f142fb9dee3e64c9a18c2:/winstuff.h diff --git a/winstuff.h b/winstuff.h index 8c994c03..693fd42e 100644 --- a/winstuff.h +++ b/winstuff.h @@ -5,11 +5,37 @@ #ifndef PUTTY_WINSTUFF_H #define PUTTY_WINSTUFF_H +#ifndef AUTO_WINSOCK +#include +#endif +#include +#include /* for FILENAME_MAX */ + +#include "tree234.h" + +#include "winhelp.h" + +struct Filename { + char path[FILENAME_MAX]; +}; +#define f_open(filename, mode) ( fopen((filename).path, (mode)) ) + +struct FontSpec { + char name[64]; + int isbold; + int height; + int charset; +}; + +#define BOXFLAGS DLGWINDOWEXTRA +#define BOXRESULT DLGWINDOWEXTRA + 4 +#define DF_END 0x0001 + /* * Global variables. Most modules declare these `extern', but * window.c will do `#define PUTTY_DO_GLOBALS' before including this * module, and so will get them properly defined. - */ +*/ #ifndef GLOBAL #ifdef PUTTY_DO_GLOBALS #define GLOBAL @@ -18,7 +44,12 @@ #endif #endif -typedef struct config_tag Config; /* duplicated from putty.h */ +#ifndef DONE_TYPEDEFS +#define DONE_TYPEDEFS +typedef struct config_tag Config; +typedef struct backend_tag Backend; +typedef struct terminal_tag Terminal; +#endif #define PUTTY_REG_POS "Software\\SimonTatham\\PuTTY" #define PUTTY_REG_PARENT "Software\\SimonTatham" @@ -46,6 +77,20 @@ GLOBAL HWND logbox; GLOBAL HINSTANCE hinst; /* + * Details of the help file. + */ +GLOBAL char *help_path; +GLOBAL int help_has_contents; + +/* + * The terminal and logging context are notionally local to the + * Windows front end, but they must be shared between window.c and + * windlg.c. Likewise the saved-sessions list. + */ +GLOBAL Terminal *term; +GLOBAL void *logctx; + +/* * I've just looked in the windows standard headr files for WM_USER, there * are hundreds of flags defined using the form WM_USER+123 so I've * renumbered this NETEVENT value and the two in window.c @@ -65,6 +110,47 @@ GLOBAL HINSTANCE hinst; #define SELECTION_NUL_TERMINATED 1 /* + * On Windows, copying to the clipboard terminates lines with CRLF. + */ +#define SEL_NL { 13, 10 } + +/* + * sk_getxdmdata() does not exist under Windows (not that I + * couldn't write it if I wanted to, but I haven't bothered), so + * it's a macro which always returns FALSE. With any luck this will + * cause the compiler to notice it can optimise away the + * implementation of XDM-AUTHORIZATION-1 in x11fwd.c :-) + */ +#define sk_getxdmdata(socket, ip, port) (0) + +/* + * File-selector filter strings used in the config box. On Windows, + * these strings are of exactly the type needed to go in + * `lpstrFilter' in an OPENFILENAME structure. + */ +#define FILTER_KEY_FILES ("PuTTY Private Key Files (*.ppk)\0*.ppk\0" \ + "All Files (*.*)\0*\0\0\0") +#define FILTER_WAVE_FILES ("Wave Files (*.wav)\0*.WAV\0" \ + "All Files (*.*)\0*\0\0\0") + +/* + * winnet.c dynamically loads WinSock 2 or WinSock 1 depending on + * what it can get, which means any WinSock routines used outside + * that module must be exported from it as function pointers. So + * here they are. + */ +extern int (WINAPI *p_WSAAsyncSelect) + (SOCKET s, HWND hWnd, u_int wMsg, long lEvent); +extern int (WINAPI *p_WSAEventSelect) + (SOCKET s, WSAEVENT hEventObject, long lNetworkEvents); +extern int (WINAPI *p_select) + (int nfds, fd_set FAR * readfds, fd_set FAR * writefds, + fd_set FAR *exceptfds, const struct timeval FAR * timeout); +extern int (WINAPI *p_WSAGetLastError)(void); +extern int (WINAPI *p_WSAEnumNetworkEvents) + (SOCKET s, WSAEVENT hEventObject, LPWSANETWORKEVENTS lpNetworkEvents); + +/* * Exports from winctrls.c. */ @@ -95,6 +181,26 @@ struct prefslist { }; /* + * This structure is passed to event handler functions as the `dlg' + * parameter, and hence is passed back to winctrls access functions. + */ +struct dlgparam { + HWND hwnd; /* the hwnd of the dialog box */ + struct winctrls *controltrees[8]; /* can have several of these */ + int nctrltrees; + char *wintitle; /* title of actual window */ + char *errtitle; /* title of error sub-messageboxes */ + void *data; /* data to pass in refresh events */ + union control *focused, *lastfocused; /* which ctrl has focus now/before */ + char shortcuts[128]; /* track which shortcuts in use */ + int coloursel_wanted; /* has an event handler asked for + * a colour selector? */ + struct { unsigned char r, g, b, ok; } coloursel_result; /* 0-255 */ + tree234 *privdata; /* stores per-control private data */ + int ended, endresult; /* has the dialog been ended? */ +}; + +/* * Exports from winctrls.c. */ void ctlposinit(struct ctlpos *cp, HWND hwnd, @@ -104,7 +210,7 @@ HWND doctl(struct ctlpos *cp, RECT r, void bartitle(struct ctlpos *cp, char *name, int id); void beginbox(struct ctlpos *cp, char *name, int idbox); void endbox(struct ctlpos *cp); -void multiedit(struct ctlpos *cp, ...); +void multiedit(struct ctlpos *cp, int password, ...); void radioline(struct ctlpos *cp, char *text, int id, int nacross, ...); void bareradioline(struct ctlpos *cp, int nacross, ...); void radiobig(struct ctlpos *cp, char *text, int id, ...); @@ -136,8 +242,8 @@ void charclass(struct ctlpos *cp, char *stext, int sid, int listid, char *btext, int bid, int eid, char *s2text, int s2id); void colouredit(struct ctlpos *cp, char *stext, int sid, int listid, char *btext, int bid, ...); -void prefslist(struct prefslist *hdl, struct ctlpos *cp, char *stext, - int sid, int listid, int upbid, int dnbid); +void prefslist(struct prefslist *hdl, struct ctlpos *cp, int lines, + char *stext, int sid, int listid, int upbid, int dnbid); int handle_prefslist(struct prefslist *hdl, int *array, int maxmemb, int is_dlmsg, HWND hwnd, @@ -146,7 +252,73 @@ void progressbar(struct ctlpos *cp, int id); void fwdsetter(struct ctlpos *cp, int listid, char *stext, int sid, char *e1stext, int e1sid, int e1id, char *e2stext, int e2sid, int e2id, - char *btext, int bid); + char *btext, int bid, + char *r1text, int r1id, char *r2text, int r2id); + +#define MAX_SHORTCUTS_PER_CTRL 16 + +/* + * This structure is what's stored for each `union control' in the + * portable-dialog interface. + */ +struct winctrl { + union control *ctrl; + /* + * The control may have several components at the Windows + * level, with different dialog IDs. To avoid needing N + * separate platformsidectrl structures (which could be stored + * separately in a tree234 so that lookup by ID worked), we + * impose the constraint that those IDs must be in a contiguous + * block. + */ + int base_id; + int num_ids; + /* + * Remember what keyboard shortcuts were used by this control, + * so that when we remove it again we can take them out of the + * list in the dlgparam. + */ + char shortcuts[MAX_SHORTCUTS_PER_CTRL]; + /* + * Some controls need a piece of allocated memory in which to + * store temporary data about the control. + */ + void *data; +}; +/* + * And this structure holds a set of the above, in two separate + * tree234s so that it can find an item by `union control' or by + * dialog ID. + */ +struct winctrls { + tree234 *byctrl, *byid; +}; +struct controlset; +struct controlbox; + +void winctrl_init(struct winctrls *); +void winctrl_cleanup(struct winctrls *); +void winctrl_add(struct winctrls *, struct winctrl *); +void winctrl_remove(struct winctrls *, struct winctrl *); +struct winctrl *winctrl_findbyctrl(struct winctrls *, union control *); +struct winctrl *winctrl_findbyid(struct winctrls *, int); +struct winctrl *winctrl_findbyindex(struct winctrls *, int); +void winctrl_layout(struct dlgparam *dp, struct winctrls *wc, + struct ctlpos *cp, struct controlset *s, int *id); +int winctrl_handle_command(struct dlgparam *dp, UINT msg, + WPARAM wParam, LPARAM lParam); +void winctrl_rem_shortcuts(struct dlgparam *dp, struct winctrl *c); +int winctrl_context_help(struct dlgparam *dp, HWND hwnd, int id); + +void dp_init(struct dlgparam *dp); +void dp_add_tree(struct dlgparam *dp, struct winctrls *tree); +void dp_cleanup(struct dlgparam *dp); + +/* + * Exports from wincfg.c. + */ +void win_setup_config_box(struct controlbox *b, HWND *hwndp, int has_help, + int midsession); /* * Exports from windlg.c. @@ -157,6 +329,22 @@ int do_reconfig(HWND); void showeventlog(HWND); void showabout(HWND); void force_normal(HWND hwnd); +void modal_about_box(HWND hwnd); +void show_help(HWND hwnd); + +/* + * Exports from winmisc.c. + */ + +int SaneDialogBox(HINSTANCE hinst, + LPCTSTR tmpl, + HWND hwndparent, + DLGPROC lpDialogFunc); + +void SaneEndDialog(HWND hwnd, int ret); + +extern OSVERSIONINFO osVersion; +BOOL init_winver(void); /* * Exports from sizetip.c. @@ -165,12 +353,21 @@ void UpdateSizeTip(HWND src, int cx, int cy); void EnableSizeTip(int bEnable); /* - * Unicode and multi-byte character handling stuff. + * Exports from unicode.c. + */ +struct unicode_data; +void init_ucs(Config *, struct unicode_data *); + +/* + * pageantc.c needs to schedule callbacks for asynchronous agent + * requests. This has to be done differently in GUI and console, so + * there's an exported function used for the purpose. + * + * Also, we supply FLAG_SYNCAGENT to force agent requests to be + * synchronous in pscp and psftp. */ -#define is_dbcs_leadbyte(cp, c) IsDBCSLeadByteEx(cp, c) -#define mb_to_wc(cp, flags, mbstr, mblen, wcstr, wclen) \ - MultiByteToWideChar(cp, flags, mbstr, mblen, wcstr, wclen) -#define wc_to_mb(cp, flags, wcstr, wclen, mbstr, mblen, def, defused) \ - WideCharToMultiByte(cp, flags, mbstr, mblen, wcstr, wclen, def,defused) +void agent_schedule_callback(void (*callback)(void *, void *, int), + void *callback_ctx, void *data, int len); +#define FLAG_SYNCAGENT 0x1000 #endif