# st

Unnamed repository; edit this file 'description' to name the repository.

| Log | Files | Refs | README | LICENSE

    commit 8b4bfe31ec1075316dbb2e7d21753771ae3e5590
    parent 5d8aa08ba5a13b20166f21540370b01e239819b1
    Author: Aurélien Aptel <aurelien.aptel@gmail.com>
    Date:   Tue, 16 Jun 2009 02:23:46 +0200

    made kpress() more flexible, removed st.h, added config.h.

    Diffstat:
    Mst.c | 210++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------

    1 file changed, 181 insertions(+), 29 deletions(-)
    diff --git a/st.c b/st.c
    @@ -1,5 +1,160 @@
     /* See LICENSE for licence details. */
    -#include "st.h"
    +/* 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>
    +
    +#define TNAME "st"
    +
    +/* 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)
    +
    +/* Attribute, Cursor, Character state, Terminal mode, Screen draw mode */
    +enum { ATnone=0 , ATreverse=1 , ATunderline=2, ATbold=4 };
    +enum { CSup, CSdown, CSright, CSleft, CShide, CSdraw, CSwrap, CSsave, CSload };
    +enum { CRset=1 , CRupdate=2 };
    +enum { TMwrap=1 , TMinsert=2, TMaltcharset };
    +enum { SCupdate, SCredraw };
    +
    +typedef int Color;
    +
    +typedef struct {
    +	KeySym k;
    +	char s[ESCSIZ];
    +} Key;
    +
    +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 */
    +/* ESC <pre> [[ [<priv>] <arg> [;]] <mode>] */
    +typedef struct {
    +	char buf[ESCSIZ+1]; /* raw string */
    +	int len;            /* raw string length */
    +	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;
    +
    +#include "config.h"
    +
    +/* 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);
    +char* kmap(KeySym);
    +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);
    +

     /* Globals */
     DC dc;
    @@ -725,11 +880,11 @@ xinit(void) {
     	xw.dis = XOpenDisplay(NULL);
     	xw.scr = XDefaultScreen(xw.dis);
     	if(!xw.dis)
    -		die("can not open display");
    +		die("Can't open display\n");

     	/* font */
     	if(!(dc.font = XLoadQueryFont(xw.dis, FONT)))
    -		die("can not find font " FONT);
    +		die("Can't load font %s\n", FONT);

     	xw.cw = dc.font->max_bounds.rbearing - dc.font->min_bounds.lbearing;
     	xw.ch = dc.font->ascent + dc.font->descent + LINESPACE;
    @@ -834,6 +989,15 @@ draw(int redraw_all) {
     	xcursor(CSdraw);
     }

    +char*
    +kmap(KeySym k) {
    +	int i;
    +	for(i = 0; i < LEN(key); i++)
    +		if(key[i].k == k)
    +			return (char*)key[i].s;
    +	return NULL;
    +}
    +
     void
     kpress(XKeyEvent *e) {
     	KeySym ksym;
    @@ -841,39 +1005,28 @@ kpress(XKeyEvent *e) {
     	int len;
     	int meta;
     	int shift;
    +	char* skmap;

     	meta  = e->state & Mod1Mask;
     	shift = e->state & ShiftMask;
     	len = XLookupString(e, buf, sizeof(buf), &ksym, NULL);
    -	if(len > 0) {
    +	if(skmap = kmap(ksym))
    +		ttywrite(skmap, strlen(skmap));
    +	else if(len > 0) {
     		buf[sizeof(buf)-1] = '\0';
     		if(meta && len == 1)
     			ttywrite("\033", 1);
     		ttywrite(buf, len);
    -		return;
    -	}
    -	switch(ksym) {
    -	default:
    -		fprintf(stderr, "errkey: %d\n", (int)ksym);
    -		break;
    -	case XK_Up:
    -	case XK_Down:
    -	case XK_Left:
    -	case XK_Right:
    -		sprintf(buf, "\033[%c", "DACB"[ksym - XK_Left]);
    -		ttywrite(buf, 3);
    -		break;
    -	case XK_Delete: ttywrite(KEYDELETE, sizeof(KEYDELETE)-1); break;
    -	case XK_Home:  ttywrite(KEYHOME, sizeof(KEYHOME)-1); break;
    -	case XK_End:   ttywrite(KEYEND,  sizeof(KEYEND) -1); break;
    -	case XK_Prior: ttywrite(KEYPREV, sizeof(KEYPREV)-1); break;
    -	case XK_Next:  ttywrite(KEYNEXT, sizeof(KEYNEXT)-1); break;
    -	case XK_Insert:
    -		/* XXX: paste X clipboard */
    -		if(shift)
    -			;
    -		break;
    -	}
    +	} else
    +		switch(ksym) {
    +		case XK_Insert:
    +			if(shift)
    +				/* XXX: paste X clipboard */;
    +			break;
    +		default:
    +			fprintf(stderr, "errkey: %d\n", (int)ksym);
    +			break;
    +		}
     }

     void
    @@ -891,7 +1044,6 @@ resize(XEvent *e) {
     	}
     }

    -
     void
     run(void) {
     	int ret;