~petersanchez/st

cf65699a29683bff9d50187c18b160e21a538f48 — Anselm R Garbe 14 years ago 0a5e510
we definately need pixmaps for the drawing, currently drawing into the window is painfully slow! much more slower than drawing into a pixmap and mapping that when finished -- several optimisations
2 files changed, 89 insertions(+), 101 deletions(-)

M config.h
M st.c
M config.h => config.h +11 -11
@@ 6,7 6,7 @@
#define LINESPACE 1 /* additional pixel between each line */

/* Terminal colors */
static char* colorname[] = {
static const char *colorname[] = {
	"black",
	"red",
	"green",


@@ 26,14 26,14 @@ static char* colorname[] = {


/* special keys */
static Key key[] = {
	{ XK_Delete, "\033[3~" },
	{ XK_Home,   "\033[1~" },
	{ XK_End,    "\033[4~" },
	{ XK_Prior,  "\033[5~" },
	{ XK_Next,   "\033[6~" },
	{ XK_Left,   "\033[D" },
	{ XK_Right,  "\033[C" },
	{ XK_Up,     "\033[A" },
	{ XK_Down,   "\033[B" },
static const char *key[] = {
	[XK_Delete] = "\033[3~", 
	[XK_Home]   = "\033[1~",
	[XK_End]    = "\033[4~",
	[XK_Prior]  = "\033[5~",
	[XK_Next]   = "\033[6~",
	[XK_Left]   = "\033[D",
	[XK_Right]  = "\033[C",
	[XK_Up]     = "\033[A",
	[XK_Down]   = "\033[B",
};

M st.c => st.c +78 -90
@@ 1,5 1,5 @@
/* See LICENSE for licence details. */
#define _XOPEN_SOURCE
#define _XOPEN_SOURCE 600
#include <ctype.h>
#include <errno.h>
#include <fcntl.h>


@@ 107,61 107,68 @@ typedef struct {
	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);
static void die(const char *errstr, ...);
static void draw(int);
static void execsh(void);
static void sigchld(int);
static void run(void);

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

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

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

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

static void expose(XEvent *);
static void kpress(XEvent *);
static void resize(XEvent *);

static void (*handler[LASTEvent])(XEvent *) = {
	[KeyPress] = kpress,
	[Expose] = expose,
	[ConfigureNotify] = resize
};

/* Globals */
DC dc;
XWindow xw;
Term term;
Escseq escseq;
int cmdfd;
pid_t pid;
int running;
static DC dc;
static XWindow xw;
static Term term;
static Escseq escseq;
static int cmdfd;
static pid_t pid;
static int running;

void
die(const char *errstr, ...) {


@@ 259,7 266,7 @@ ttyread(void) {
}

void
ttywrite(char *s, size_t n) {
ttywrite(const char *s, size_t n) {
	if(write(cmdfd, s, n) == -1)
		die("write error on tty: %s\n", SERRNO);
}


@@ 997,29 1004,25 @@ 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
expose(XEvent *ev) {
	draw(SCredraw);
}

void
kpress(XKeyEvent *e) {
kpress(XEvent *ev) {
	XKeyEvent *e = &ev->xkey;
	KeySym ksym;
	char buf[32];
	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(skmap = kmap(ksym))
		ttywrite(skmap, strlen(skmap));
	if(key[ksym])
		ttywrite(key[ksym], strlen(key[ksym]));
	else if(len > 0) {
		buf[sizeof(buf)-1] = '\0';
		if(meta && len == 1)


@@ 1054,7 1057,6 @@ resize(XEvent *e) {

void
run(void) {
	int ret;
	XEvent ev;
	fd_set rfd;
	int xfd = XConnectionNumber(xw.dis);


@@ 1062,39 1064,25 @@ run(void) {
	running = 1;
	XSelectInput(xw.dis, xw.win, ExposureMask | KeyPressMask | StructureNotifyMask);
	XResizeWindow(xw.dis, xw.win, xw.w , xw.h); /* fix resize bug in wmii (?) */
	

	while(running) {
		FD_ZERO(&rfd);
		FD_SET(cmdfd, &rfd);
		FD_SET(xfd, &rfd);
		XFlush(xw.dis);
		ret = select(MAX(xfd, cmdfd)+1, &rfd, NULL, NULL, NULL);

		if(ret < 0)
		if(select(MAX(xfd, cmdfd)+1, &rfd, NULL, NULL, NULL) == -1) {
			if(errno == EINTR)
				continue;
			die("select failed: %s\n", SERRNO);
				
		if(FD_ISSET(xfd, &rfd)) {
			while(XPending(xw.dis)) {
				XNextEvent(xw.dis, &ev);
				switch (ev.type) {
				default:
					break;
				case KeyPress:
					kpress(&ev.xkey);
					break;
				case Expose:
					draw(SCredraw);
					break;
				case ConfigureNotify:
					resize(&ev);
					break;
				}
			}
		}
		if(FD_ISSET(cmdfd, &rfd)) {
			ttyread();
			draw(SCupdate);
		}
		while(XPending(xw.dis)) {
			XNextEvent(xw.dis, &ev);
			if(handler[ev.type])
				(handler[ev.type])(&ev);
		}
	}
}