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
This commit is contained in:
		
							
								
								
									
										22
									
								
								config.h
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								config.h
									
									
									
									
									
								
							| @ -6,7 +6,7 @@ | |||||||
| #define LINESPACE 1 /* additional pixel between each line */ | #define LINESPACE 1 /* additional pixel between each line */ | ||||||
|  |  | ||||||
| /* Terminal colors */ | /* Terminal colors */ | ||||||
| static char* colorname[] = { | static const char *colorname[] = { | ||||||
| 	"black", | 	"black", | ||||||
| 	"red", | 	"red", | ||||||
| 	"green", | 	"green", | ||||||
| @ -26,14 +26,14 @@ static char* colorname[] = { | |||||||
|  |  | ||||||
|  |  | ||||||
| /* special keys */ | /* special keys */ | ||||||
| static Key key[] = { | static const char *key[] = { | ||||||
| 	{ XK_Delete, "\033[3~" }, | 	[XK_Delete] = "\033[3~",  | ||||||
| 	{ XK_Home,   "\033[1~" }, | 	[XK_Home]   = "\033[1~", | ||||||
| 	{ XK_End,    "\033[4~" }, | 	[XK_End]    = "\033[4~", | ||||||
| 	{ XK_Prior,  "\033[5~" }, | 	[XK_Prior]  = "\033[5~", | ||||||
| 	{ XK_Next,   "\033[6~" }, | 	[XK_Next]   = "\033[6~", | ||||||
| 	{ XK_Left,   "\033[D" }, | 	[XK_Left]   = "\033[D", | ||||||
| 	{ XK_Right,  "\033[C" }, | 	[XK_Right]  = "\033[C", | ||||||
| 	{ XK_Up,     "\033[A" }, | 	[XK_Up]     = "\033[A", | ||||||
| 	{ XK_Down,   "\033[B" }, | 	[XK_Down]   = "\033[B", | ||||||
| }; | }; | ||||||
|  | |||||||
							
								
								
									
										158
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										158
									
								
								st.c
									
									
									
									
									
								
							| @ -1,5 +1,5 @@ | |||||||
| /* See LICENSE for licence details. */ | /* See LICENSE for licence details. */ | ||||||
| #define _XOPEN_SOURCE | #define _XOPEN_SOURCE 600 | ||||||
| #include <ctype.h> | #include <ctype.h> | ||||||
| #include <errno.h> | #include <errno.h> | ||||||
| #include <fcntl.h> | #include <fcntl.h> | ||||||
| @ -107,61 +107,68 @@ typedef struct { | |||||||
| 	GC gc; | 	GC gc; | ||||||
| } DC; | } DC; | ||||||
|  |  | ||||||
| void die(const char *errstr, ...); | static void die(const char *errstr, ...); | ||||||
| void draw(int); | static void draw(int); | ||||||
| void execsh(void); | static void execsh(void); | ||||||
| void sigchld(int); | static void sigchld(int); | ||||||
| char* kmap(KeySym); | static void run(void); | ||||||
| void kpress(XKeyEvent *); |  | ||||||
| void resize(XEvent *); |  | ||||||
| void run(void); |  | ||||||
|  |  | ||||||
| int escaddc(char); | static int escaddc(char); | ||||||
| int escfinal(char); | static int escfinal(char); | ||||||
| void escdump(void); | static void escdump(void); | ||||||
| void eschandle(void); | static void eschandle(void); | ||||||
| void escparse(void); | static void escparse(void); | ||||||
| void escreset(void); | static void escreset(void); | ||||||
|  |  | ||||||
| void tclearregion(int, int, int, int); | static void tclearregion(int, int, int, int); | ||||||
| void tcpos(int); | static void tcpos(int); | ||||||
| void tcursor(int); | static void tcursor(int); | ||||||
| void tdeletechar(int); | static void tdeletechar(int); | ||||||
| void tdeleteline(int); | static void tdeleteline(int); | ||||||
| void tdump(void); | static void tdump(void); | ||||||
| void tinsertblank(int); | static void tinsertblank(int); | ||||||
| void tinsertblankline(int); | static void tinsertblankline(int); | ||||||
| void tmoveto(int, int); | static void tmoveto(int, int); | ||||||
| void tnew(int, int); | static void tnew(int, int); | ||||||
| void tnewline(void); | static void tnewline(void); | ||||||
| void tputc(char); | static void tputc(char); | ||||||
| void tputs(char*, int); | static void tputs(char*, int); | ||||||
| void tresize(int, int); | static void tresize(int, int); | ||||||
| void tscroll(void); | static void tscroll(void); | ||||||
| void tsetattr(int*, int); | static void tsetattr(int*, int); | ||||||
| void tsetchar(char); | static void tsetchar(char); | ||||||
| void tsetscroll(int, int); | static void tsetscroll(int, int); | ||||||
|  |  | ||||||
| void ttynew(void); | static void ttynew(void); | ||||||
| void ttyread(void); | static void ttyread(void); | ||||||
| void ttyresize(int, int); | static void ttyresize(int, int); | ||||||
| void ttywrite(char *, size_t); | static void ttywrite(const char *, size_t); | ||||||
|  |  | ||||||
| unsigned long xgetcol(const char *); | static unsigned long xgetcol(const char *); | ||||||
| void xclear(int, int, int, int); | static void xclear(int, int, int, int); | ||||||
| void xcursor(int); | static void xcursor(int); | ||||||
| void xdrawc(int, int, Glyph); | static void xdrawc(int, int, Glyph); | ||||||
| void xinit(void); | static void xinit(void); | ||||||
| void xscroll(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 */ | /* Globals */ | ||||||
| DC dc; | static DC dc; | ||||||
| XWindow xw; | static XWindow xw; | ||||||
| Term term; | static Term term; | ||||||
| Escseq escseq; | static Escseq escseq; | ||||||
| int cmdfd; | static int cmdfd; | ||||||
| pid_t pid; | static pid_t pid; | ||||||
| int running; | static int running; | ||||||
|  |  | ||||||
| void | void | ||||||
| die(const char *errstr, ...) { | die(const char *errstr, ...) { | ||||||
| @ -259,7 +266,7 @@ ttyread(void) { | |||||||
| } | } | ||||||
|  |  | ||||||
| void | void | ||||||
| ttywrite(char *s, size_t n) { | ttywrite(const char *s, size_t n) { | ||||||
| 	if(write(cmdfd, s, n) == -1) | 	if(write(cmdfd, s, n) == -1) | ||||||
| 		die("write error on tty: %s\n", SERRNO); | 		die("write error on tty: %s\n", SERRNO); | ||||||
| } | } | ||||||
| @ -997,29 +1004,25 @@ draw(int redraw_all) { | |||||||
| 	xcursor(CSdraw); | 	xcursor(CSdraw); | ||||||
| } | } | ||||||
|  |  | ||||||
| char* | void | ||||||
| kmap(KeySym k) { | expose(XEvent *ev) { | ||||||
| 	int i; | 	draw(SCredraw); | ||||||
| 	for(i = 0; i < LEN(key); i++) |  | ||||||
| 		if(key[i].k == k) |  | ||||||
| 			return (char*)key[i].s; |  | ||||||
| 	return NULL; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void | ||||||
| kpress(XKeyEvent *e) { | kpress(XEvent *ev) { | ||||||
|  | 	XKeyEvent *e = &ev->xkey; | ||||||
| 	KeySym ksym; | 	KeySym ksym; | ||||||
| 	char buf[32]; | 	char buf[32]; | ||||||
| 	int len; | 	int len; | ||||||
| 	int meta; | 	int meta; | ||||||
| 	int shift; | 	int shift; | ||||||
| 	char* skmap; |  | ||||||
|  |  | ||||||
| 	meta  = e->state & Mod1Mask; | 	meta  = e->state & Mod1Mask; | ||||||
| 	shift = e->state & ShiftMask; | 	shift = e->state & ShiftMask; | ||||||
| 	len = XLookupString(e, buf, sizeof(buf), &ksym, NULL); | 	len = XLookupString(e, buf, sizeof(buf), &ksym, NULL); | ||||||
| 	if(skmap = kmap(ksym)) | 	if(key[ksym]) | ||||||
| 		ttywrite(skmap, strlen(skmap)); | 		ttywrite(key[ksym], strlen(key[ksym])); | ||||||
| 	else if(len > 0) { | 	else if(len > 0) { | ||||||
| 		buf[sizeof(buf)-1] = '\0'; | 		buf[sizeof(buf)-1] = '\0'; | ||||||
| 		if(meta && len == 1) | 		if(meta && len == 1) | ||||||
| @ -1054,7 +1057,6 @@ resize(XEvent *e) { | |||||||
|  |  | ||||||
| void | void | ||||||
| run(void) { | run(void) { | ||||||
| 	int ret; |  | ||||||
| 	XEvent ev; | 	XEvent ev; | ||||||
| 	fd_set rfd; | 	fd_set rfd; | ||||||
| 	int xfd = XConnectionNumber(xw.dis); | 	int xfd = XConnectionNumber(xw.dis); | ||||||
| @ -1067,34 +1069,20 @@ run(void) { | |||||||
| 		FD_ZERO(&rfd); | 		FD_ZERO(&rfd); | ||||||
| 		FD_SET(cmdfd, &rfd); | 		FD_SET(cmdfd, &rfd); | ||||||
| 		FD_SET(xfd, &rfd); | 		FD_SET(xfd, &rfd); | ||||||
| 		XFlush(xw.dis); | 		if(select(MAX(xfd, cmdfd)+1, &rfd, NULL, NULL, NULL) == -1) { | ||||||
| 		ret = select(MAX(xfd, cmdfd)+1, &rfd, NULL, NULL, NULL); | 			if(errno == EINTR) | ||||||
|  | 				continue; | ||||||
| 		if(ret < 0) |  | ||||||
| 			die("select failed: %s\n", SERRNO); | 			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)) { | 		if(FD_ISSET(cmdfd, &rfd)) { | ||||||
| 			ttyread(); | 			ttyread(); | ||||||
| 			draw(SCupdate); | 			draw(SCupdate); | ||||||
| 		} | 		} | ||||||
|  | 		while(XPending(xw.dis)) { | ||||||
|  | 			XNextEvent(xw.dis, &ev); | ||||||
|  | 			if(handler[ev.type]) | ||||||
|  | 				(handler[ev.type])(&ev); | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user