172 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			172 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* See LICENSE for licence details. */
 | |
| #define _XOPEN_SOURCE
 | |
| #include <ctype.h>
 | |
| #include <fcntl.h>
 | |
| #include <locale.h>
 | |
| #include <stdarg.h>
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| #include <sys/ioctl.h>
 | |
| #include <sys/select.h>
 | |
| #include <sys/stat.h>
 | |
| #include <sys/types.h>
 | |
| #include <unistd.h>
 | |
| #include <X11/Xlib.h>
 | |
| #include <X11/keysym.h>
 | |
| #include <X11/Xutil.h>
 | |
| 
 | |
| /* 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 "fixed"
 | |
| #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 */
 | |
| 
 | |
| 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 <pre> [[ [<priv>] <arg> [;]] <mode>] */
 | |
| 	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);
 |