aboutsummaryrefslogblamecommitdiffstats
path: root/st.h
blob: 0bd2c4e535e4452a4031cf5b97ac6f79f7424e5a (plain) (tree)
1
2
3
4
5
6
7
8
9
10
                                      

                     
                  





                   
                   
                      


                       
                     
                   














                           
                    



















                                                            



                     
                              










                                                                                            
                                                                 

                                                   

                  





























































                                                      
                  








































                                      
/* See LICENSE for licence details. */
#define _XOPEN_SOURCE
#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
#include <locale.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <sys/ioctl.h>
#include <sys/select.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.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 SERRNO strerror(errno)
#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, TMaltcharset }; /* 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 sigchld(int);
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);
remember that computers suck.