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 - st - Personal fork of st
 (HTM) git clone git://git.drkhsh.at/st.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit cf65699a29683bff9d50187c18b160e21a538f48
 (DIR) parent 0a5e5102096d65a3ba8e39ea9b9b0eb89fe30e04
 (HTM) Author: Anselm R Garbe <garbeam@gmail.com>
       Date:   Fri, 10 Jul 2009 16:23:11 +0100
       
       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
       
       Diffstat:
         M config.h                            |      22 +++++++++++-----------
         M st.c                                |     168 ++++++++++++++-----------------
       
       2 files changed, 89 insertions(+), 101 deletions(-)
       ---
 (DIR) diff --git a/config.h b/config.h
       @@ -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",
        };
 (DIR) diff --git a/st.c b/st.c
       @@ -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);
       +                }
                }
        }