rearranged code, resize fixed. - st - Simple Terminal
       
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 2f5ebe0a4d71aea0bb3aa0e500765a402e4a96f4
 (DIR) parent 476f93794acc36ea69dfd33551e311863c8afc9a
 (HTM) Author: Aurélien Aptel <aurelien.aptel@gmail.com>
       Date:   Wed,  2 Jun 2010 16:01:30 +0200
       
       rearranged code, resize fixed.
       
       Diffstat:
         st.c                                |     106 +++++++++++++++++--------------
       
       1 file changed, 58 insertions(+), 48 deletions(-)
       ---
 (DIR) diff --git a/st.c b/st.c
       @@ -56,7 +56,7 @@ typedef struct {
        ttypedef Glyph* Line;
        
        ttypedef struct {
       -        Glyph attr;  /* current char attributes */
       +        Glyph attr;         /* current char attributes */
                int x;
                int y;
        } TCursor;
       @@ -65,24 +65,24 @@ typedef struct {
        /* ESC '[' [[ [<priv>] <arg> [;]] <mode>] */
        ttypedef struct {
                char buf[ESC_BUF_SIZ]; /* raw string */
       -        int len;               /* raw string length */
       +        int len;                           /* raw string length */
                char priv;
                int arg[ESC_ARG_SIZ];
       -        int narg;              /* nb of args */
       +        int narg;                           /* nb of args */
                char mode;
        } CSIEscape;
        
        /* Internal representation of the screen */
        ttypedef struct {
       -        int row;    /* nb row */  
       -        int col;    /* nb col */
       +        int row;        /* nb row */  
       +        int col;        /* nb col */
                Line* line; /* screen */
       -        TCursor c;  /* cursor */
       +        TCursor c;        /* cursor */
                char hidec;
       -        int top;    /* top    scroll limit */
       -        int bot;    /* bottom scroll limit */
       -        int mode;   /* terminal mode flags */
       -        int esc;    /* escape state flags */
       +        int top;        /* top          scroll limit */
       +        int bot;        /* bottom scroll limit */
       +        int mode;        /* terminal mode flags */
       +        int esc;        /* escape state flags */
                char title[ESC_TITLE_SIZ];
                int titlelen;
        } Term;
       @@ -93,8 +93,10 @@ typedef struct {
                Window win;
                Pixmap buf;
                int scr;
       -        int w;  /* window width  */
       -        int h;  /* window height */
       +        int w;        /* window width         */
       +        int h;        /* window height */
       +        int bufw; /* pixmap width  */
       +        int bufh; /* pixmap height */
                int ch; /* char height */
                int cw; /* char width  */
        } XWindow; 
       @@ -216,7 +218,7 @@ execsh(void) {
        
        void
        xbell(void) { /* visual bell */
       -        XRectangle r = { BORDER, BORDER, xw.w, xw.h };
       +        XRectangle r = { BORDER, BORDER, xw.bufw, xw.bufh };
                XSetForeground(xw.dis, dc.gc, dc.col[BellCol]);
                XFillRectangles(xw.dis, xw.win, dc.gc, &r, 1);
                /* usleep(30000); */
       @@ -367,7 +369,7 @@ tscrolldown (int n) {
        
                for(i = 0; i < n; i++)
                        memset(term.line[term.bot-i], 0, term.col*sizeof(Glyph));
       -           
       +        
                for(i = term.bot; i >= term.top+n; i--) {
                        temp = term.line[i];
                        term.line[i] = term.line[i-n];
       @@ -582,7 +584,7 @@ tsetattr(int *attr, int l) {
                                term.c.attr.mode |= ATTR_REVERSE;        
                                break;
                        case 22: 
       -                        term.c.attr.mode &= ~ATTR_BOLD;  
       +                        term.c.attr.mode &= ~ATTR_BOLD;         
                                break;
                        case 24: 
                                term.c.attr.mode &= ~ATTR_UNDERLINE;
       @@ -665,7 +667,7 @@ csihandle(void) {
                case 'G': /* CHA -- Move to <col> */
                case '`': /* XXX: HPA -- same? */
                        DEFAULT(escseq.arg[0], 1);
       -             tmoveto(escseq.arg[0]-1, term.c.y);
       +                tmoveto(escseq.arg[0]-1, term.c.y);
                        break;
                case 'H': /* CUP -- Move to <row> <col> */
                case 'f': /* XXX: HVP -- same? */
       @@ -1027,11 +1029,22 @@ xclear(int x1, int y1, int x2, int y2) {
        }
        
        void
       +xhints(void)
       +{
       +        XClassHint chint = {TNAME, TNAME};
       +        XWMHints wmhint         = {.flags = InputHint, .input = 1};
       +        XSizeHints shint = { 
       +                .flags = PSize | PResizeInc,
       +                .height = xw.h, /* XXX: doesn't seem to work, see run() */
       +                .width = xw.w,
       +                .height_inc = xw.ch,
       +                .width_inc = xw.cw,
       +        };
       +        XSetWMProperties(xw.dis, xw.win, NULL, NULL, NULL, 0, &shint, &wmhint, &chint);
       +}
       +
       +void
        xinit(void) {
       -        XClassHint chint;
       -        XWMHints wmhint;
       -        XSizeHints shint;
       -        char *args[] = {NULL};
                int i;
        
                xw.dis = XOpenDisplay(NULL);
       @@ -1055,27 +1068,21 @@ xinit(void) {
                term.c.attr.bg = DefaultBG;
                term.c.attr.mode = ATTR_NULL;
                /* windows */
       -        xw.h = term.row * xw.ch;
       -        xw.w = term.col * xw.cw;
       +        xw.h = term.row * xw.ch + 2*BORDER;
       +        xw.w = term.col * xw.cw + 2*BORDER;
                xw.win = XCreateSimpleWindow(xw.dis, XRootWindow(xw.dis, xw.scr), 0, 0,
       -                        xw.w + 2*BORDER, xw.h + 2*BORDER, 0, 
       +                        xw.w, xw.h, 0, 
                                dc.col[DefaultBG],
                                dc.col[DefaultBG]);
       -        xw.buf = XCreatePixmap(xw.dis, xw.win, xw.w, xw.h, XDefaultDepth(xw.dis, xw.scr));
       +        xw.bufw = xw.w - 2*BORDER;
       +        xw.bufh = xw.h - 2*BORDER;
       +        xw.buf = XCreatePixmap(xw.dis, xw.win, xw.bufw, xw.bufh, XDefaultDepth(xw.dis, xw.scr));
                /* gc */
                dc.gc = XCreateGC(xw.dis, xw.win, 0, NULL);
                XMapWindow(xw.dis, xw.win);
       -        /* wm stuff */
       -        chint.res_name = TNAME, chint.res_class = TNAME;
       -        wmhint.input = 1, wmhint.flags = InputHint;
       -        shint.height_inc = xw.ch, shint.width_inc = xw.cw;
       -        shint.height = xw.h + 2*BORDER, shint.width = xw.w + 2*BORDER;
       -        shint.flags = PSize | PResizeInc;
       -        XSetWMProperties(xw.dis, xw.win, NULL, NULL, &args[0], 0, &shint, &wmhint, &chint);
       +        xhints();
                XStoreName(xw.dis, xw.win, TNAME);
       -        XFillRectangle(xw.dis, xw.buf, dc.gc, 0, 0, xw.w, xw.h);
                XSync(xw.dis, 0);
       -
        }
        
        void
       @@ -1152,7 +1159,7 @@ draw_(int dummy) {
        
                if(!term.hidec)
                        xcursor(CURSOR_DRAW);
       -        XCopyArea(xw.dis, xw.buf, xw.win, dc.gc, 0, 0, xw.w, xw.h, BORDER, BORDER);
       +        XCopyArea(xw.dis, xw.buf, xw.win, dc.gc, 0, 0, xw.bufw, xw.bufh, BORDER, BORDER);
                XFlush(xw.dis);
        }
        #endif
       @@ -1181,7 +1188,7 @@ draw(int redraw_all) {
                        xdraws(buf, base, ox, y, i);
                }
                xcursor(term.hidec ? CURSOR_HIDE : CURSOR_DRAW);
       -        XCopyArea(xw.dis, xw.buf, xw.win, dc.gc, 0, 0, xw.w, xw.h, BORDER, BORDER);
       +        XCopyArea(xw.dis, xw.buf, xw.win, dc.gc, 0, 0, xw.bufw, xw.bufh, BORDER, BORDER);
                XFlush(xw.dis);
        }
        
       @@ -1209,7 +1216,7 @@ kpress(XEvent *ev) {
                int meta;
                int shift;
        
       -        meta  = e->state & Mod1Mask;
       +        meta = e->state & Mod1Mask;
                shift = e->state & ShiftMask;
                len = XLookupString(e, buf, sizeof(buf), &ksym, NULL);
        
       @@ -1242,18 +1249,21 @@ kpress(XEvent *ev) {
        void
        resize(XEvent *e) {
                int col, row;
       -        col = e->xconfigure.width / xw.cw;
       -        row = e->xconfigure.height / xw.ch;
                
       -        if(term.col != col || term.row != row) {
       -                tresize(col, row);
       -                ttyresize(col, row);
       -                xw.w = e->xconfigure.width;
       -                xw.h = e->xconfigure.height;
       -                XFreePixmap(xw.dis, xw.buf);
       -                xw.buf = XCreatePixmap(xw.dis, xw.win, xw.w, xw.h, XDefaultDepth(xw.dis, xw.scr));
       -                draw(SCREEN_REDRAW);
       -        }
       +        if(e->xconfigure.width == xw.w && e->xconfigure.height == xw.h)
       +                return;
       +        
       +        xw.w = e->xconfigure.width;
       +        xw.h = e->xconfigure.height;
       +        xw.bufw = xw.w - 2*BORDER;
       +        xw.bufh = xw.h - 2*BORDER;
       +        col = xw.bufw / xw.cw;
       +        row = xw.bufh / xw.ch;
       +        tresize(col, row);
       +        ttyresize(col, row);
       +        XFreePixmap(xw.dis, xw.buf);
       +        xw.buf = XCreatePixmap(xw.dis, xw.win, xw.bufw, xw.bufh, XDefaultDepth(xw.dis, xw.scr));
       +        draw(SCREEN_REDRAW);
        }
        
        void
       @@ -1264,7 +1274,7 @@ run(void) {
        
                running = 1;
                XSelectInput(xw.dis, xw.win, ExposureMask | KeyPressMask | StructureNotifyMask);
       -        XResizeWindow(xw.dis, xw.win, xw.w+2*BORDER, xw.h+2*BORDER); /* fix resize bug in wmii (?) */
       +        XResizeWindow(xw.dis, xw.win, xw.w, xw.h); /* XXX: fix resize bug in wmii (?) */
        
                while(running) {
                        FD_ZERO(&rfd);