X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=putty.h;h=99961fdafc4ddd428173991efbc490423875eafe;hb=refs%2Fheads%2Fben-mac-port;hp=581225b3934bc83a141ab14acf69679b05418881;hpb=29f26a10503b94f7b4cf9d06cf660faa1223dece;p=PuTTY.git diff --git a/putty.h b/putty.h index 581225b3..99961fda 100644 --- a/putty.h +++ b/putty.h @@ -3,8 +3,15 @@ #define PUTTY_REG_POS "Software\\SimonTatham\\PuTTY" +#ifdef macintosh +#define OPTIMISE_SCROLL +#endif + #ifdef macintosh #include +#include +#include +#include typedef UInt32 DWORD; #endif /* macintosh */ @@ -41,12 +48,10 @@ typedef UInt32 DWORD; #define CHAR_MASK 0x000000FFUL #ifdef macintosh -typedef void *Context; /* Temporarily until I work out what it should really be */ -#else /* not macintosh */ -typedef HDC Context; -#endif /* not macintosh */ - +#define SEL_NL { 13 } +#else #define SEL_NL { 13, 10 } +#endif /* * Global variables. Most modules declare these `extern', but @@ -59,41 +64,11 @@ typedef HDC Context; #define GLOBAL extern #endif -struct session { - /* Display state */ - int rows, cols, savelines; - int font_width, font_height; - int has_focus; - /* Buffers */ - unsigned char inbuf[INBUF_SIZE]; - int inbuf_head, inbuf_reap; - unsigned char outbuf[OUTBUF_SIZE]; - int outbuf_head, outbuf_reap; - /* Emulator state */ - int app_cursor_keys, app_keypad_keys; - /* Backend */ - Backend *back; - /* Config that created this session */ - Config cfg; -} - -GLOBAL int rows, cols, savelines; - -GLOBAL int font_width, font_height; - #define INBUF_SIZE 2048 #define INBUF_MASK (INBUF_SIZE-1) -GLOBAL unsigned char inbuf[INBUF_SIZE]; -GLOBAL int inbuf_head, inbuf_reap; #define OUTBUF_SIZE 2048 #define OUTBUF_MASK (OUTBUF_SIZE-1) -GLOBAL unsigned char outbuf[OUTBUF_SIZE]; -GLOBAL int outbuf_head, outbuf_reap; - -GLOBAL int has_focus; - -GLOBAL int app_cursor_keys, app_keypad_keys; #define WM_NETEVENT (WM_USER + 1) @@ -114,20 +89,63 @@ typedef enum { VT_XWINDOWS, VT_OEMANSI, VT_OEMONLY, VT_POORMAN } VT_Mode; -typedef struct { +typedef struct Session Session; +typedef struct Socket Socket; + +/* Types of network event */ + +typedef enum { + NE_NULL, /* Nothing happened */ + NE_OPEN, /* Connection successfully opened */ + NE_NOHOST, /* DNS lookup failed for some reason */ + NE_REFUSED, /* Port unreachable */ + NE_NOOPEN, /* Connection failed to open for some other reason */ + NE_DATA, /* Incoming normal data */ + NE_URGENT, /* Incoming urgent data */ + NE_SENT, /* Used internally by Mac network stack */ + NE_CLOSING, /* Connection closed by remote host */ + NE_CLOSED, /* Connection close completed */ + NE_TIMEOUT, /* Remote host vanished */ + NE_ABORT, /* Remote host reset connection */ + NE_DIED, /* Connection has failed for some other reason */ +} Net_Event_Type; + #ifdef macintosh - char *(*init) (char *host, int port, char **realhost); - int (*msg)(void); -#else /* not macintosh */ - char *(*init) (HWND hwnd, char *host, int port, char **realhost); - int (*msg) (WPARAM wParam, LPARAM lParam); -#endif /* not macintosh */ - void (*send) (char *buf, int len); - void (*size) (void); - void (*special) (Telnet_Special code); +typedef void *SOCKET; +#define INVALID_SOCKET NULL +#endif + +typedef struct { + char *(*init) (Session *); + int (*msg)(Session *, SOCKET, Net_Event_Type); + void (*send) (Session *, char *buf, int len); + void (*size) (Session *); + void (*special) (Session *, Telnet_Special code); + void (*shutdown) (Session *); } Backend; -GLOBAL Backend *back; +#ifdef macintosh +typedef struct { + int (*init)(void); + SOCKET (*open)(Session *, char const *, int); + int (*recv)(SOCKET, void *, int, int); + int (*send)(SOCKET, void *, int, int); + void (*poll)(void); + void (*close)(SOCKET); + void (*destroy)(SOCKET); + void (*shutdown)(void); +} Network_Stack; + +GLOBAL Network_Stack *net_stack; + +#define net_open(s, h, p) ((*net_stack->open)((s), (h), (p))) +#define net_recv(s, b, l, f) ((*net_stack->recv)((s), (b), (l), (f))) +#define net_send(s, b, l, f) ((*net_stack->send)((s), (b), (l), (f))) +#define net_poll() ((*net_stack->poll)()) +#define net_close(s) ((*net_stack->close)(s)) +#define net_destroy(s) ((*net_stack->destroy)(s)) +#define net_shutdown() ((*net_stack->shutdown)()) +#endif typedef struct { /* Basic options */ @@ -137,6 +155,7 @@ typedef struct { int close_on_exit; /* SSH options */ int nopty; + enum { CIPHER_3DES, CIPHER_BLOWFISH } cipher; /* Telnet options */ char termtype[32]; char termspeed[32]; @@ -149,6 +168,7 @@ typedef struct { int linux_funkeys; int app_cursor; int app_keypad; + int meta_modifiers; /* Terminal options */ int savelines; int dec_om; @@ -163,32 +183,158 @@ typedef struct { /* Colour options */ int try_palette; int bold_colour; +#ifdef macintosh + PaletteHandle colours; +#else /* not macintosh */ unsigned char colours[22][3]; +#endif /* not macintosh */ /* Selection options */ + int implicit_copy; +#ifdef macintosh int mouse_is_xterm; +#endif short wordness[256]; } Config; -GLOBAL Config cfg; +typedef struct { + /* Display buffers and pointers within them */ + unsigned long *text; /* buffer of text on terminal screen */ + unsigned long *scrtop; /* top of working screen */ + unsigned long *disptop; /* top of displayed screen */ + unsigned long *sbtop; /* top of scrollback */ + unsigned long *cpos; /* cursor position (convenience) */ + unsigned long *disptext; /* buffer of text on real screen */ + unsigned long *wanttext; /* buffer of text we want on screen */ + unsigned long *alttext; /* buffer of text on alt. screen */ + unsigned char *selspace; /* buffer for building selections in */ + + /* Current state */ + unsigned long curr_attr; + int curs_x, curs_y; /* cursor */ + int cset; /* 0 or 1: which char set is in GL */ + unsigned long cset_attr[2]; /* G0 and G1 char sets */ + + /* Saved state */ + unsigned long save_attr; + int save_x, save_y; /* saved cursor position */ + int save_cset, save_csattr; /* saved with cursor position */ + + int marg_t, marg_b; /* scroll margins */ + + /* Flags */ + int dec_om; /* DEC origin mode flag */ + int wrap, wrapnext; /* wrap flags */ + int insert; /* insert-mode flag */ + int rvideo; /* global reverse video flag */ + + /* + * Saved settings on the alternate screen. + */ + int alt_x, alt_y, alt_om, alt_wrap, alt_wnext, alt_ins, alt_cset; + int alt_t, alt_b; + int alt_which; + + /* Escape sequence handler state */ +#define ARGS_MAX 32 /* max # of esc sequence arguments */ + int esc_args[ARGS_MAX]; + int esc_nargs; + int esc_query; +#define OSC_STR_MAX 2048 + int osc_strlen; + char osc_string[OSC_STR_MAX+1]; + int osc_w; + + unsigned char *tabs; + int nl_count; + + enum { + TOPLEVEL, IGNORE_NEXT, + SEEN_ESC, SEEN_CSI, SET_GL, SET_GR, + SEEN_OSC, SEEN_OSC_P, SEEN_OSC_W, OSC_STRING, OSC_MAYBE_ST, + SEEN_ESCHASH + } termstate; + + enum { + NO_SELECTION, ABOUT_TO, DRAGGING, SELECTED + } selstate; + enum { + SM_CHAR, SM_WORD, SM_LINE + } selmode; + unsigned long *selstart, *selend, *selanchor; + short wordness[256]; +} Term_State; + +typedef struct Session { + /* Config that created this session */ + Config cfg; + /* Terminal emulator internal state */ + Term_State ts; + /* Display state */ + int rows, cols, savelines; + int font_width, font_height; + int has_focus; + /* Buffers */ + unsigned char inbuf[INBUF_SIZE]; + int inbuf_head, inbuf_reap; + unsigned char outbuf[OUTBUF_SIZE]; + int outbuf_head, outbuf_reap; + /* Emulator state */ + int app_cursor_keys, app_keypad_keys; + /* Backend */ + Backend *back; + /* Conveniences */ + unsigned long attr_mask; /* Mask of attributes to display */ +#ifdef macintosh + short fontnum; + int font_ascent; + int font_leading; + int font_boldadjust; + WindowPtr window; + PaletteHandle palette; + ControlHandle scrollbar; + WCTabHandle wctab; +#endif +} Session; + +typedef struct Socket Socket; + +/* + * Exports from display system + */ +extern void request_resize(Session *, int, int); +extern void do_text(Session *, int, int, char *, int, unsigned long); +extern void set_title(Session *, char *); +extern void set_icon(Session *, char *); +extern void set_sbar(Session *, int, int, int); +extern void pre_paint(Session *); +extern void post_paint(Session *); +extern void palette_set(Session *, int, int, int, int); +extern void palette_reset(Session *); +extern void write_clip (void *, int); +extern void get_clip (void **, int *); +extern void do_scroll(Session *, int, int, int); +extern void fatalbox(const char *, ...); +#ifdef macintosh +#pragma noreturn (fatalbox) +#endif +extern void beep(Session *s); +extern void lognegot(const char *); /* - * Exports from window.c. + * Exports from the network system */ -void request_resize (int, int); -void do_text (Context, int, int, char *, int, unsigned long); -void set_title (char *); -void set_icon (char *); -void set_sbar (int, int, int); -Context get_ctx(); -void free_ctx (Context); -void palette_set (int, int, int, int); -void palette_reset (void); -void write_clip (void *, int); -void get_clip (void **, int *); -void optimised_move (int, int, int); -void fatalbox (const char *, ...); -void beep (void); -#define OPTIMISE_IS_SCROLL 1 + +#ifndef macintosh +extern Socket *net_open(Session *, char *host, int port); +extern char *net_realname(Socket *); +extern int net_recv(Socket *, void *, int, int); +extern int net_send(Socket *, void *, int, int); +extern void net_close(Socket *); /* ask the remote end to close */ +extern void net_destroy(Socket *); /* Tidy up */ +#endif +#define SEND_PUSH 0x01 +#define SEND_URG 0x02 + /* * Exports from noise.c. @@ -215,29 +361,32 @@ void verify_ssh_host_key(char *host, struct RSAKey *key); * Exports from terminal.c. */ -void term_init (void); -void term_size (int, int, int); -void term_out (void); -void term_paint (Context, int, int, int, int); -void term_scroll (int, int); -void term_pwron (void); -void term_clrsb (void); -void term_mouse (Mouse_Button, Mouse_Action, int, int); -void term_deselect (void); -void term_update (void); -void term_invalidate(void); +extern void term_init(Session *); +extern void term_size(Session *, int, int, int); +extern void term_out(Session *); +extern void term_paint(Session *, int, int, int, int); +extern void term_scroll(Session *, int, int); +extern void term_pwron(Session *); +extern void term_clrsb(Session *); +extern void term_mouse(Session *, Mouse_Button, Mouse_Action, int, int); +extern void term_copy(Session *); +extern void term_paste(Session *); +extern int term_hasselection(Session *); +extern void term_deselect (Session *); +extern void term_update (Session *); +extern void term_invalidate(Session *); /* * Exports from telnet.c. */ -Backend telnet_backend; +extern Backend telnet_backend; /* * Exports from ssh.c. */ -Backend ssh_backend; +extern Backend ssh_backend; /* * Exports from sshrand.c. @@ -268,6 +417,14 @@ void *safemalloc(size_t); void *saferealloc(void *, size_t); void safefree(void *); +/* + * Exports from testback.c + */ + +extern Backend null_backend; +extern Backend loop_backend; +extern Backend hexdump_backend; + /* * Exports from version.c. */