[hackers] [st] Trying out the double buffering without dbe. || Christoph Lohmann

From: <git_AT_suckless.org>
Date: Sat, 19 Jan 2013 15:00:37 +0100

commit c7b033b8f0a31ec08d3d9dafa390b24c6e232e09
Author: Christoph Lohmann <20h_AT_r-36.net>
Date: Sat Jan 19 15:00:16 2013 +0100

    Trying out the double buffering without dbe.

diff --git a/st.c b/st.c
index 979fdc8..ef78896 100644
--- a/st.c
+++ b/st.c
_AT_@ -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 */
_AT_@ -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);
_AT_@ -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);
_AT_@ -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);
 }
 
_AT_@ -2449,7 +2457,7 @@ xzoom(const Arg *arg)
         xunloadfonts();
         xloadfonts(usedfont, usedfontsize + arg->i);
         cresize(0, 0);
- draw();
+ redraw(0);
 }
 
 void
_AT_@ -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);
_AT_@ -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
");
         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
_AT_@ -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
_AT_@ -2889,6 +2916,7 @@ expose(XEvent *ev) {
                 if(!e->count)
                         xw.state &= ~WIN_REDRAW;
         }
+ redraw(0);
 }
 
 void
Received on Sat Jan 19 2013 - 15:00:37 CET

This archive was generated by hypermail 2.3.0 : Sat Jan 19 2013 - 15:12:09 CET