/*
 * This file is part of the Minicom Communications Program,
 * written by Miquel van Smoorenburg 1991/1992/1993.
 *
 * Window Header File.
 *
 * 1991/10/09 Miquel van Smoorenburg.
 */

/*
 * One character is contained in a "ELM"
 */
typedef struct _elm {
  char value;
  char attr;
  char color;
} ELM;

/*
 * Control struct of a window
 */
typedef struct _win {
  int x1, y1, x2, y2;	/* Coordinates */
  int sy1, sy2;		/* Scrolling region */
  int xs, ys;		/* x and y size */
  char border;		/* type of border */
  char cursor;		/* Does it have a cursor */
  char attr;		/* Current attribute of window */
  char color;		/* Current color of window */
  char autocr;		/* With '\n', do an automatic '\r' */
  char doscroll;	/* Automatically scroll up */
  char wrap;		/* Wrap around edge */
  char direct;		/* Direct write to screen ? */
  short curx, cury;	/* current x and y */
  char o_cursor;
  short o_curx;
  short o_cury;
  char o_attr;
  char o_color;		/* Position & attributes before window was opened */
  ELM *map;		/* Map of contents */
  ELM *histbuf;		/* History buffer. */
  int histlines;	/* How many lines we keep in the history buffer */
  int histline;		/* Current line in the history buffer. */
} WIN;

/*
 * Stdwin is the whole screen
 */
extern WIN *stdwin;	/* Whole screen */
extern int LINES, COLS; /* Size of sreen */
extern int usecolor;	/* Use ansi color escape sequences */
extern int useattr;	/* Use attributes (reverse, bold etc. ) */
extern int dirflush;	/* Direct flush after write */
extern int literal;	/* Literal pass-through of all characters? */
extern int w_init;	/* Already initialized? */

/*
 * Possible attributes.
 */
#define A_NORMAL	 0 
#define A_BLINK		 1
#define A_BOLD		 2
#define A_REVERSE	 4
#define A_STANDOUT	 8
#define A_UNDERLINE	16
#define A_ALTCHARSET	32
#define A_BLANK		64

/*
 * Possible colors
 */
#define BLACK		0
#define RED		1
#define GREEN		2
#define YELLOW		3
#define BLUE		4
#define MAGENTA		5
#define CYAN		6
#define WHITE		7

#define COLATTR(fg, bg) (((fg) << 4) + (bg))
#define COLFG(ca)	((ca) >> 4)
#define COLBG(ca)	((ca) % 16)

/*
 * Possible borders.
 */
#define BNONE	0
#define BSINGLE 1
#define BDOUBLE 2

/*
 * Scrolling directions.
 */
#define S_UP	1
#define S_DOWN	2

/*
 * Cursor types.
 */
#define CNONE	0
#define CNORMAL	1

/*
 * Title Positions
 */
#define TLEFT	0
#define TMID	1
#define TRIGHT	2

/*
 * For wselect.
 */
#define NIL_FUNLIST	((void (**)()) 0)
#define NIL_FUN		((void (*)()) 0)
#define MENU_END	((char *) 0)

#define CNULL		((char *)0)
#define NIL_WIN         (WIN *) 0

/*
 * Function prototypes.
 */

#ifndef _PROTO
#  if __STDC__
#    define _PROTO(fun, args) fun args
#  else
#  define _PROTO(fun, args) fun()
#  endif
#endif

_PROTO( int getch, ( void ));

_PROTO(void wflush, ( void ));
_PROTO(WIN *wopen, ( int x1 , int y1 , int x2 , int y2 , int border ,
		int attr , int fg , int bg , int direct , int hl , int rel ));
_PROTO(void wclose, ( WIN *win , int replace ));
_PROTO(void wleave, ( void ));
_PROTO(void wreturn, ( void ));
_PROTO(void wresize, (WIN *w, int x, int y ));
_PROTO(void wredraw, ( WIN *w , int newdirect ));
_PROTO(void wscroll, ( WIN *win , int dir ));
_PROTO(void wlocate, ( WIN *win , int x , int y ));
_PROTO(void wputc, ( WIN *win , int c ));
_PROTO(void wdrawelm, ( WIN *win, int y, ELM *e ));
_PROTO(void wputs, ( WIN *win , char *s ));
/* Should use stdarg et al. */
int wprintf();
_PROTO(void wbell, ( void ));
_PROTO(void wcursor, ( WIN *win , int type ));
_PROTO(void wtitle, ( WIN *w , int pos , char *s ));
_PROTO(void wcurbar, ( WIN *w , int y , int attr ));
_PROTO(int wselect, ( int x , int y , char **choices , void (**funlist)() ,
	char *title , int attr , int fg , int bg ));
_PROTO(void wclrel, ( WIN *w ));
_PROTO(void wclreol, ( WIN *w ));
_PROTO(void wclrbol, ( WIN *w ));
_PROTO(void wclreos, ( WIN *w ));
_PROTO(void wclrbos, ( WIN *w ));
_PROTO(void winclr, ( WIN *w ));
_PROTO(void winsline, ( WIN *w ));
_PROTO(void wdelline, ( WIN *w ));
_PROTO(void winschar, ( WIN *w ));
_PROTO(void wdelchar, ( WIN *w ));
_PROTO(int wgets, ( WIN *win , char *s , int linemax, int totmax ));
_PROTO(void win_end, ( void ));
#ifdef BBS
_PROTO(int win_init, ( char *term, int lines ));
#else
_PROTO(int win_init, ( int fg , int bg , int attr ));
#endif

/*
 * Some macro's that can be used as functions.
 */
#define wsetregion(w, z1, z2) (((w)->sy1=(w)->y1+(z1)),((w)->sy2=(w)->y1+(z2)))
#define wresetregion(w) ( (w)->sy1 = (w)->y1, (w)->sy2 = (w)->y2 )
#define wgetattr(w) ( (w)->attr )
#define wsetattr(w, a) ( (w)->attr = (a) )
#define wsetfgcol(w, fg) ( (w)->color = ((w)->color & 15) + ((fg) << 4))
#define wsetbgcol(w, bg) ( (w)->color = ((w)->color & 240) + (bg) )
#define wsetam(w) ( (w)->wrap = 1 )
#define wresetam(w) ( (w)->wrap = 0 )

/*
 * Allright, now the macro's for our keyboard routines.
 */
#define K_BS		8
#define K_ESC		27
#define K_STOP		256
#define K_F1		257
#define K_F2		258
#define K_F3		259
#define K_F4		260
#define K_F5		261
#define K_F6		262
#define K_F7		263
#define K_F8		264
#define K_F9		265
#define K_F10		266
#define K_HOME		267
#define K_PGUP		268
#define K_UP		269
#define K_LT		270
#define K_RT		271
#define K_DN		272
#define K_END		273
#define K_PGDN		274
#define K_INS		275
#define K_DEL		276

#define NUM_KEYS	21
#define KEY_OFFS	256

#ifndef EOF
#  define EOF		((int) -1)
#endif
#define K_ERA		'\b'
#define K_KILL		((int) -2)

/* Internal structure. */
struct key {
	char *cap;
	char len;
};

