/* 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 int Color; 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);