made kpress() more flexible, removed st.h, added config.h.
This commit is contained in:
		
							
								
								
									
										210
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										210
									
								
								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; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user