st

fork of suckless's simple terminal
Index Commits Files Refs README LICENSE
commit c7b033b8f0a31ec08d3d9dafa390b24c6e232e09
parent 0e232a41150d67539df05e60c7e829f0bfb431d0
Author: Christoph Lohmann <20h@r-36.net>
Date:   Sat, 19 Jan 2013 15:00:16 +0100

Trying out the double buffering without dbe.

Diffstat:
Mst.c | 50+++++++++++++++++++++++++++++++++++++++-----------
1 file changed, 39 insertions(+), 11 deletions(-)
diff --git a/st.c b/st.c
@@ -213,8 +213,7 @@ typedef struct {
     bool isfixed; /* is fixed geometry? */
     int fx, fy, fw, fh; /* fixed geometry */
     int tw, th; /* tty width and height */
-    int w;    /* window width */
-    int h;    /* window height */
+    int w, h; /* window width and height */
     int ch; /* char height */
     int cw; /* char width  */
     char state; /* focus, redraw, visible */
@@ -284,11 +283,12 @@ typedef struct {
 typedef struct {
     Colour col[LEN(colorname) < 256 ? 256 : LEN(colorname)];
     Font font, bfont, ifont, ibfont;
+    GC gc;
 } DC;
 
 static void die(const char *, ...);
 static void draw(void);
-static void redraw(void);
+static void redraw(int);
 static void drawregion(int, int, int, int);
 static void execsh(void);
 static void sigchld(int);
@@ -1510,7 +1510,7 @@ tsetmode(bool priv, bool set, int *args, int narg) {
                 mode = term.mode;
                 MODBIT(term.mode, set, MODE_REVERSE);
                 if(mode != term.mode)
-                    redraw();
+                    redraw(REDRAW_TIMEOUT);
                 break;
             case 6: /* DECOM -- Origin */
                 MODBIT(term.c.state, set, CURSOR_ORIGIN);
@@ -2234,6 +2234,14 @@ xresize(int col, int row) {
     xw.tw = MAX(1, col * xw.cw);
     xw.th = MAX(1, row * xw.ch);
 
+    if(!usedbe) {
+        XFreePixmap(xw.dpy, xw.buf);
+        xw.buf = XCreatePixmap(xw.dpy, xw.win, xw.w, xw.h,
+                DefaultDepth(xw.dpy, xw.scr));
+        XSetForeground(xw.dpy, dc.gc, 0);
+        XFillRectangle(xw.dpy, xw.buf, dc.gc, 0, 0, xw.w, xw.h);
+    }
+
     XftDrawChange(xw.draw, xw.buf);
 }
 
@@ -2449,7 +2457,7 @@ xzoom(const Arg *arg)
     xunloadfonts();
     xloadfonts(usedfont, usedfontsize + arg->i);
     cresize(0, 0);
-    draw();
+    redraw(0);
 }
 
 void
@@ -2512,13 +2520,22 @@ xinit(void) {
             &attrs);
 
     /* double buffering */
+    /*
     if(XdbeQueryExtension(xw.dpy, &major, &minor)) {
         xw.buf = XdbeAllocateBackBufferName(xw.dpy, xw.win,
                 XdbeBackground);
         usedbe = True;
     } else {
-        xw.buf = xw.win;
+    */
+        dc.gc = XCreateGC(xw.dpy, parent, 0, 0);
+        xw.buf = XCreatePixmap(xw.dpy, xw.win, xw.w, xw.h,
+                DefaultDepth(xw.dpy, xw.scr));
+        XSetForeground(xw.dpy, dc.gc, 0);
+        XFillRectangle(xw.dpy, xw.buf, dc.gc, 0, 0, xw.w, xw.h);
+        //xw.buf = xw.win;
+    /*
     }
+    */
 
     /* Xft rendering context */
     xw.draw = XftDrawCreate(xw.dpy, xw.win, xw.vis, xw.cmap);
@@ -2815,13 +2832,17 @@ xresettitle(void) {
 }
 
 void
-redraw(void) {
-    struct timespec tv = {0, REDRAW_TIMEOUT * 1000};
+redraw(int timeout) {
+    struct timespec tv = {0, timeout * 1000};
 
     tfulldirt();
+    fprintf(stderr, "draw from redraw\n");
     draw();
-    XSync(xw.dpy, False); /* necessary for a good tput flash */
-    nanosleep(&tv, NULL);
+
+    if(timeout > 0) {
+        nanosleep(&tv, NULL);
+        XSync(xw.dpy, False); /* necessary for a good tput flash */
+    }
 }
 
 void
@@ -2829,8 +2850,14 @@ draw(void) {
     XdbeSwapInfo swpinfo[1] = {{xw.win, XdbeCopied}};
 
     drawregion(0, 0, term.col, term.row);
-    if(usedbe)
+    if(usedbe) {
         XdbeSwapBuffers(xw.dpy, swpinfo, 1);
+    } else {
+        XCopyArea(xw.dpy, xw.buf, xw.win, dc.gc, 0, 0, xw.w,
+                xw.h, 0, 0);
+        XSetForeground(xw.dpy, dc.gc, 0);
+        XSync(xw.dpy, False);
+    }
 }
 
 void
@@ -2889,6 +2916,7 @@ expose(XEvent *ev) {
         if(!e->count)
             xw.state &= ~WIN_REDRAW;
     }
+    redraw(0);
 }
 
 void