/* See LICENSE for licence details. */ #define _XOPEN_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* special keys */ #define KEYDELETE "\033[3~" #define KEYHOME "\033[1~" #define KEYEND "\033[4~" #define KEYPREV "\033[5~" #define KEYNEXT "\033[6~" #define TNAME "st" #define SHELL "/bin/bash" #define TAB 8 #define FONT "-*-terminus-medium-r-normal-*-14-*-*-*-*-*-*-*" #define BORDER 3 #define LINESPACE 1 /* additional pixel between each line */ /* Default colors */ #define DefaultFG 7 #define DefaultBG 0 #define DefaultCS 1 #define BellCol DefaultFG /* visual bell color */ static char* colorname[] = { "black", "red", "green", "yellow", "blue", "magenta", "cyan", "white", }; /* Arbitrary sizes */ #define ESCSIZ 256 #define ESCARG 16 #define MIN(a, b) ((a) < (b) ? (a) : (b)) #define MAX(a, b) ((a) < (b) ? (b) : (a)) #define LEN(a) (sizeof(a) / sizeof(a[0])) #define DEFAULT(a, b) (a) = (a) ? (a) : (b) #define BETWEEN(x, a, b) ((a) <= (x) && (x) <= (b)) #define LIMIT(x, a, b) (x) = (x) < (a) ? (a) : (x) > (b) ? (b) : (x) enum { ATnone=0 , ATreverse=1 , ATunderline=2, ATbold=4 }; /* Attribute */ enum { CSup, CSdown, CSright, CSleft, CShide, CSdraw, CSwrap, CSsave, CSload }; /* Cursor */ enum { CRset=1 , CRupdate=2 }; /* Character state */ enum { TMwrap=1 , TMinsert=2 }; /* Terminal mode */ enum { SCupdate, SCredraw }; /* screen draw mode */ #ifdef TRUECOLOR #error Truecolor not implemented yet typedef int Color; #else typedef char Color; #endif typedef struct { char c; /* character code */ char mode; /* attribute flags */ Color fg; /* foreground */ Color bg; /* background */ char state; /* state flag */ } Glyph; typedef Glyph* Line; typedef struct { Glyph attr; /* current char attributes */ char hidden; int x; int y; } TCursor; /* Escape sequence structs */ typedef struct { char buf[ESCSIZ+1]; /* raw string */ int len; /* raw string length */ /* ESC
 [[ []  [;]] ] */
	char pre;           
	char priv;
	int arg[ESCARG+1];
	int narg;           /* nb of args */
	char mode;
} Escseq;

/* Internal representation of the screen */
typedef struct {
	int row;    /* nb row */  
	int col;    /* nb col */
	Line* line; /* screen */
	TCursor c;  /* cursor */
	int top;    /* top    scroll limit */
	int bot;    /* bottom scroll limit */
	int mode;   /* terminal mode */
} Term;

/* Purely graphic info */
typedef struct {
	Display* dis;
	Window win;
	int scr;
	int w;  /* window width  */
	int h;  /* window height */
	int ch; /* char height */
	int cw; /* char width  */
} XWindow; 

/* Drawing Context */
typedef struct {
	unsigned long col[LEN(colorname)];
	XFontStruct* font;
	GC gc;
} DC;


void die(const char *errstr, ...);
void draw(int);
void execsh(void);
void kpress(XKeyEvent *);
void resize(XEvent *);
void run(void);

int escaddc(char);
int escfinal(char);
void escdump(void);
void eschandle(void);
void escparse(void);
void escreset(void);

void tclearregion(int, int, int, int);
void tcpos(int);
void tcursor(int);
void tdeletechar(int);
void tdeleteline(int);
void tdump(void);
void tinsertblank(int);
void tinsertblankline(int);
void tmoveto(int, int);
void tnew(int, int);
void tnewline(void);
void tputc(char);
void tputs(char*, int);
void tresize(int, int);
void tscroll(void);
void tsetattr(int*, int);
void tsetchar(char);
void tsetscroll(int, int);

void ttynew(void);
void ttyread(void);
void ttyresize(int, int);
void ttywrite(char *, size_t);

unsigned long xgetcol(const char *);
void xclear(int, int, int, int);
void xcursor(int);
void xdrawc(int, int, Glyph);
void xinit(void);
void xscroll(void);