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

master
Anselm R Garbe 16 years ago
parent 0a5e510209
commit cf65699a29

@ -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",
}; };

168
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 *); static int escaddc(char);
void run(void); static int escfinal(char);
static void escdump(void);
int escaddc(char); static void eschandle(void);
int escfinal(char); static void escparse(void);
void escdump(void); static void escreset(void);
void eschandle(void);
void escparse(void); static void tclearregion(int, int, int, int);
void escreset(void); static void tcpos(int);
static void tcursor(int);
void tclearregion(int, int, int, int); static void tdeletechar(int);
void tcpos(int); static void tdeleteline(int);
void tcursor(int); static void tdump(void);
void tdeletechar(int); static void tinsertblank(int);
void tdeleteline(int); static void tinsertblankline(int);
void tdump(void); static void tmoveto(int, int);
void tinsertblank(int); static void tnew(int, int);
void tinsertblankline(int); static void tnewline(void);
void tmoveto(int, int); static void tputc(char);
void tnew(int, int); static void tputs(char*, int);
void tnewline(void); static void tresize(int, int);
void tputc(char); static void tscroll(void);
void tputs(char*, int); static void tsetattr(int*, int);
void tresize(int, int); static void tsetchar(char);
void tscroll(void); static void tsetscroll(int, int);
void tsetattr(int*, int);
void tsetchar(char); static void ttynew(void);
void tsetscroll(int, int); static void ttyread(void);
static void ttyresize(int, int);
void ttynew(void); static void ttywrite(const char *, size_t);
void ttyread(void);
void ttyresize(int, int); static unsigned long xgetcol(const char *);
void ttywrite(char *, size_t); static void xclear(int, int, int, int);
static void xcursor(int);
unsigned long xgetcol(const char *); static void xdrawc(int, int, Glyph);
void xclear(int, int, int, int); static void xinit(void);
void xcursor(int); static void xscroll(void);
void xdrawc(int, int, Glyph);
void xinit(void); static void expose(XEvent *);
void xscroll(void); 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);
@ -1062,39 +1064,25 @@ run(void) {
running = 1; running = 1;
XSelectInput(xw.dis, xw.win, ExposureMask | KeyPressMask | StructureNotifyMask); XSelectInput(xw.dis, xw.win, ExposureMask | KeyPressMask | StructureNotifyMask);
XResizeWindow(xw.dis, xw.win, xw.w , xw.h); /* fix resize bug in wmii (?) */ XResizeWindow(xw.dis, xw.win, xw.w , xw.h); /* fix resize bug in wmii (?) */
while(running) { while(running) {
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);
}
} }
} }

Loading…
Cancel
Save