/*
 * window.h	Constants, prototypes etc. for the window routines.
 *
 *		$Id: window.h,v 1.16 2007-10-10 20:18:20 al-guest Exp $
 *
 *		This file is part of the minicom communications package,
 *		Copyright 1991-1996 Miquel van Smoorenburg.
 *
 *		This program is free software; you can redistribute it and/or
 *		modify it under the terms of the GNU General Public License
 *		as published by the Free Software Foundation; either version
 *		2 of the License, or (at your option) any later version.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * fmg 1/11/94 colors
 * fmg 8/20/97 added stuff for history search section
 * fmg 8/21/97 added kludged F_key support for RedHat4.1
 */

#include <stddef.h>

/*
 * One character is contained in a "ELM"
 */
typedef struct _elm {
  wchar_t 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 screen */
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 screen_ibmpc;  /* Literal pass-through of all characters? */
extern int screen_iso;	/* Literal pass-through of all characters? */
extern int w_init;	/* Already initialized? */
extern char *_tptr;
extern int use_status;	/* Turned on in main() */

/* fmg 1/11/94 colors */

extern int mfcolor;     /* Menu Foreground Color */
extern int mbcolor;     /* Menu Background Color */
extern int tfcolor;     /* Terminal Foreground Color */
extern int tbcolor;     /* Terminal Background Color */
extern int sfcolor;     /* Status Bar Foreground Color */
extern int sbcolor;     /* Status Bar Background Color */
extern const char *J_col[]; /* Color's names */

/*
 * Possible attributes.
 */
#define XA_NORMAL	 0
#define XA_BLINK	 1
#define XA_BOLD		 2
#define XA_REVERSE	 4
#define XA_STANDOUT	 8
#define XA_UNDERLINE	16
#define XA_ALTCHARSET	32
#define XA_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

/*
 * Function prototypes.
 */

int wxgetch(void);

void mc_wflush(void);
WIN *mc_wopen(int x1, int y1, int x2, int y2, int border,
           int attr, int fg, int bg, int direct, int hl, int rel);
void mc_wclose(WIN *win, int replace);
void mc_wleave(void);
void mc_wreturn(void);
void mc_wresize(WIN *w, int x, int y);
void mc_wredraw(WIN *w, int newdirect);
void mc_wscroll(WIN *win, int dir);
void mc_wlocate(WIN *win, int x, int y);
void mc_wputc(WIN *win, wchar_t c);
void mc_wdrawelm(WIN *win, int y, ELM *e);
void mc_wputs(WIN *win, const char *s);
int mc_wprintf(WIN *, const char *, ...)
        __attribute__((format(printf, 2, 3)));
void mc_wbell(void);
void mc_wcursor(WIN *win, int type);
void mc_wtitle(WIN *w, int pos , const char *s);
void mc_wcurbar(WIN *w, int y , int attr);
int mc_wselect(int x, int y, const char *const *choices,
            void (*const *funlist)(void) ,
            const char *title , int attr , int fg , int bg );
void mc_wclrch(WIN *w, int n);
void mc_wclrel(WIN *w);
void mc_wclreol(WIN *w);
void mc_wclrbol(WIN *w);
void mc_wclreos(WIN *w);
void mc_wclrbos(WIN *w);
void mc_winclr(WIN *w);
void mc_winsline(WIN *w);
void mc_wdelline(WIN *w);
void mc_winschar(WIN *w);
void mc_winschar2(WIN *w, wchar_t c, int move);
void mc_wdelchar(WIN *w);
int  mc_wgets(WIN *win, char *s, int linemax, int totmax);
int  mc_wgetwcs(WIN *win, wchar_t *s, int linemax, int totmax);
void win_end(void);
#ifdef BBS
int win_init(char *term, int lines);
#else
int win_init(int fg, int bg, int attr);
#endif
/* fmg 8/20/97: both needed by history search section */
void mc_wdrawelm_inverse( WIN *w, int y, ELM *e);
void mc_wdrawelm_var(WIN *w, ELM *e, wchar_t **buf);
void mc_clear_window_simple(WIN *w);

/*
 * Some macro's that can be used as functions.
 */
#define mc_wsetregion(w, z1, z2) (((w)->sy1=(w)->y1+(z1)),((w)->sy2=(w)->y1+(z2)))
#define mc_wresetregion(w) ( (w)->sy1 = (w)->y1, (w)->sy2 = (w)->y2 )
#define mc_wgetattr(w) ( (w)->attr )
#define mc_wsetattr(w, a) ( (w)->attr = (a) )
#define mc_wsetfgcol(w, fg) ( (w)->color = ((w)->color & 15) + ((fg) << 4))
#define mc_wsetbgcol(w, bg) ( (w)->color = ((w)->color & 240) + (bg) )
#define mc_wsetam(w) ( (w)->wrap = 1 )
#define mc_wresetam(w) ( (w)->wrap = 0 )

/*
 * Alright, 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_F11		277
#define K_F12		278

#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	23
#define KEY_OFFS	256

/* Here's where the meta keycode start. (512 + keycode). */
#define K_META		512

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

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

