#ifndef PUTTY_PUTTY_H
#define PUTTY_PUTTY_H
-#include <stdio.h> /* for FILENAME_MAX */
#include <stddef.h> /* for wchar_t */
/*
#include "puttyps.h"
#include "network.h"
+#include "misc.h"
/* Three attribute types:
- * The ATTRs (normal attributes) are stored with the characters in the main
- * display arrays
+ * The ATTRs (normal attributes) are stored with the characters in
+ * the main display arrays
*
- * The TATTRs (temporary attributes) are generated on the fly, they can overlap
- * with characters but not with normal attributes.
+ * The TATTRs (temporary attributes) are generated on the fly, they
+ * can overlap with characters but not with normal attributes.
*
- * The LATTRs (line attributes) conflict with no others and only have one
- * value per line. But on area clears the LATTR cells are set to the erase_char
- * (or DEFAULT_ATTR + 'E')
+ * The LATTRs (line attributes) are an entirely disjoint space of
+ * flags.
*
* ATTR_INVALID is an illegal colour combination.
*/
#define LATTR_WRAPPED 0x10000000UL
#define LATTR_WRAPPED2 0x20000000UL
-#define ATTR_INVALID 0x00FF0000UL
+#define ATTR_INVALID 0x03FF0000UL
/* Like Linux use the F000 page for direct to font. */
#define ATTR_OEMCP 0x0000F000UL /* OEM Codepage DTF */
*/
#define UCSWIDE 0xDFFF
-#define ATTR_NARROW 0x20000000UL
-#define ATTR_WIDE 0x10000000UL
-#define ATTR_BOLD 0x01000000UL
-#define ATTR_UNDER 0x02000000UL
-#define ATTR_REVERSE 0x04000000UL
-#define ATTR_BLINK 0x08000000UL
-#define ATTR_FGMASK 0x000F0000UL
-#define ATTR_BGMASK 0x00F00000UL
-#define ATTR_COLOURS 0x00FF0000UL
+#define ATTR_NARROW 0x80000000UL
+#define ATTR_WIDE 0x40000000UL
+#define ATTR_BOLD 0x04000000UL
+#define ATTR_UNDER 0x08000000UL
+#define ATTR_REVERSE 0x10000000UL
+#define ATTR_BLINK 0x20000000UL
+#define ATTR_FGMASK 0x001F0000UL
+#define ATTR_BGMASK 0x03E00000UL
+#define ATTR_COLOURS 0x03FF0000UL
#define ATTR_FGSHIFT 16
-#define ATTR_BGSHIFT 20
+#define ATTR_BGSHIFT 21
-#define ATTR_DEFAULT 0x00980000UL
+#define ATTR_DEFAULT 0x01280000UL /* bg 9, fg 8 */
#define ATTR_DEFFG 0x00080000UL
-#define ATTR_DEFBG 0x00900000UL
+#define ATTR_DEFBG 0x01200000UL
#define ERASE_CHAR (ATTR_DEFAULT | ATTR_ASCII | ' ')
#define ATTR_MASK 0xFFFFFF00UL
#define CHAR_MASK 0x000000FFUL
#define ATTR_CUR_AND (~(ATTR_BOLD|ATTR_REVERSE|ATTR_BLINK|ATTR_COLOURS))
-#define ATTR_CUR_XOR 0x00BA0000UL
+#define ATTR_CUR_XOR 0x016A0000UL
struct sesslist {
int nsessions;
#define PK_ISKEYPAD(k) ((k) >= PK_PF1 && (k) <= PK_KPENTER)
#define PK_ISFKEY(k) ((k) >= PK_F1 && (k) <= PK_F20)
-typedef enum {
+enum {
VT_XWINDOWS, VT_OEMANSI, VT_OEMONLY, VT_POORMAN, VT_UNICODE
-} VT_Mode;
+};
enum {
/*
enum {
/*
- * Line discipline option states: off, on, up to the backend.
+ * Several different bits of the PuTTY configuration seem to be
+ * three-way settings whose values are `always yes', `always
+ * no', and `decide by some more complex automated means'. This
+ * is true of line discipline options (local echo and line
+ * editing), proxy DNS, Close On Exit, and SSH server bug
+ * workarounds. Accordingly I supply a single enum here to deal
+ * with them all.
*/
- LD_YES, LD_NO, LD_BACKEND
+ FORCE_ON, FORCE_OFF, AUTO
+};
+
+enum {
+ /*
+ * Proxy types.
+ */
+ PROXY_NONE, PROXY_HTTP, PROXY_SOCKS, PROXY_TELNET
};
enum {
};
enum {
- /*
- * Close On Exit behaviours. (cfg.close_on_exit)
- */
- COE_NEVER, /* Never close the window */
- COE_NORMAL, /* Close window on "normal" (non-error) exits only */
- COE_ALWAYS /* Always close the window */
+ /* Protocol back ends. (cfg.protocol) */
+ PROT_RAW, PROT_TELNET, PROT_RLOGIN, PROT_SSH
+};
+
+enum {
+ /* Bell settings (cfg.beep) */
+ BELL_DISABLED, BELL_DEFAULT, BELL_VISUAL, BELL_WAVEFILE
+};
+
+enum {
+ /* Taskbar flashing indication on bell (cfg.beep_ind) */
+ B_IND_DISABLED, B_IND_FLASH, B_IND_STEADY
+};
+
+enum {
+ /* Resize actions (cfg.resize_action) */
+ RESIZE_TERM, RESIZE_DISABLED, RESIZE_FONT, RESIZE_EITHER
};
enum {
*/
extern const int be_default_protocol;
+/*
+ * IMPORTANT POLICY POINT: everything in this structure which wants
+ * to be treated like an integer must be an actual, honest-to-
+ * goodness `int'. No enum-typed variables. This is because parts
+ * of the code will want to pass around `int *' pointers to them
+ * and we can't run the risk of porting to some system on which the
+ * enum comes out as a different size from int.
+ */
struct config_tag {
/* Basic options */
char host[512];
int port;
- enum { PROT_RAW, PROT_TELNET, PROT_RLOGIN, PROT_SSH } protocol;
+ int protocol;
int close_on_exit;
int warn_on_close;
int ping_interval; /* in seconds */
int tcp_nodelay;
/* Proxy options */
char proxy_exclude_list[512];
- enum { PROXYDNS_NO, PROXYDNS_AUTO, PROXYDNS_YES } proxy_dns;
+ int proxy_dns;
int even_proxy_localhost;
- enum { PROXY_NONE, PROXY_HTTP, PROXY_SOCKS, PROXY_TELNET } proxy_type;
+ int proxy_type;
char proxy_host[512];
int proxy_port;
char proxy_username[32];
int agentfwd;
int change_username; /* allow username switching in SSH2 */
int ssh_cipherlist[CIPHER_MAX];
- char keyfile[FILENAME_MAX];
+ Filename keyfile;
int sshprot; /* use v1 or v2 when both available */
int ssh2_des_cbc; /* "des-cbc" nonstandard SSH2 cipher */
int try_tis_auth;
int fullscreenonaltenter;
int scroll_on_key;
int scroll_on_disp;
+ int erase_to_scrollback;
int compose_key;
int ctrlaltkeys;
char wintitle[256]; /* initial window title */
int lfhascr;
int cursor_type; /* 0=block 1=underline 2=vertical */
int blink_cur;
- enum {
- BELL_DISABLED, BELL_DEFAULT, BELL_VISUAL, BELL_WAVEFILE
- } beep;
- enum {
- B_IND_DISABLED, B_IND_FLASH, B_IND_STEADY
- } beep_ind;
+ int beep;
+ int beep_ind;
int bellovl; /* bell overload protection active? */
int bellovl_n; /* number of bells to cause overload */
int bellovl_t; /* time interval for overload (seconds) */
int bellovl_s; /* period of silence to re-enable bell (s) */
- char bell_wavefile[FILENAME_MAX];
+ Filename bell_wavefile;
int scrollbar;
int scrollbar_in_fullscreen;
- enum { RESIZE_TERM, RESIZE_DISABLED, RESIZE_FONT, RESIZE_EITHER } resize_action;
+ int resize_action;
int bce;
int blinktext;
int win_name_always;
int width, height;
- char font[256];
- int fontisbold;
- int fontheight;
- int fontcharset;
- char logfilename[FILENAME_MAX];
+ FontSpec font;
+ Filename logfilename;
int logtype;
int logxfovr;
int hide_mouseptr;
int mouse_override;
short wordness[256];
/* translations */
- VT_Mode vtmode;
+ int vtmode;
char line_codepage[128];
int xlat_capslockcyr;
/* X11 forwarding */
int rport_acceptall; /* same for remote forwarded ports (SSH2 only) */
char portfwd[1024]; /* [LR]localport\thost:port\000[LR]localport\thost:port\000\000 */
/* SSH bug compatibility modes */
- enum {
- BUG_AUTO, BUG_OFF, BUG_ON
- } sshbug_ignore1, sshbug_plainpw1, sshbug_rsa1,
+ int sshbug_ignore1, sshbug_plainpw1, sshbug_rsa1,
sshbug_hmac2, sshbug_derivekey2, sshbug_rsapad2,
- sshbug_dhgex2;
+ sshbug_dhgex2, sshbug_pksessid2;
/* Options for pterm. Should split out into platform-dependent part. */
int stamp_utmp;
int login_shell;
int scrollbar_on_left;
- char boldfont[256];
- char widefont[256];
- char wideboldfont[256];
+ FontSpec boldfont;
+ FontSpec widefont;
+ FontSpec wideboldfont;
int shadowboldoffset;
};
void do_cursor(Context, int, int, char *, int, unsigned long, int);
int char_width(Context ctx, int uc);
#ifdef OPTIMISE_SCROLL
-void do_scroll(void *, int, int, int);
+void do_scroll(Context, int, int, int);
#endif
void set_title(void *frontend, char *);
void set_icon(void *frontend, char *);
* (The integer one is expected to return `def' if it has no clear
* opinion of its own. This is because there's no integer value
* which I can reliably set aside to indicate `nil'. The string
- * function is perfectly all right returning NULL, of course.)
+ * function is perfectly all right returning NULL, of course. The
+ * Filename and FontSpec functions are _not allowed_ to fail to
+ * return, since these defaults _must_ be per-platform.)
*/
char *platform_default_s(const char *name);
int platform_default_i(const char *name, int def);
+Filename platform_default_filename(const char *name);
+FontSpec platform_default_fontspec(const char *name);
/*
* Exports from terminal.c.
void term_copyall(Terminal *);
void term_reconfig(Terminal *, Config *);
void term_seen_key_event(Terminal *);
-int from_backend(void *, int is_stderr, char *data, int len);
+int from_backend(void *, int is_stderr, const char *data, int len);
void term_provide_resize_fn(Terminal *term,
void (*resize_fn)(void *, int, int),
void *resize_ctx);
void verify_ssh_host_key(void *frontend, char *host, int port, char *keytype,
char *keystr, char *fingerprint);
void askcipher(void *frontend, char *ciphername, int cs);
-int askappend(void *frontend, char *filename);
+int askappend(void *frontend, Filename filename);
/*
* Exports from console.c (that aren't equivalents to things in
void cmdline_error(char *, ...);
/*
+ * Exports from config.c.
+ */
+struct controlbox;
+void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
+ int midsession, int protocol);
+
+/*
* X11 auth mechanisms we know about.
*/
enum {
};
extern const char *const x11_authnames[]; /* declared in x11fwd.c */
+/*
+ * Miscellaneous exports from the platform-specific code.
+ */
+Filename filename_from_str(const char *string);
+const char *filename_to_str(const Filename *fn);
+int filename_equal(Filename f1, Filename f2);
+int filename_is_null(Filename fn);
+
#endif