tTrying out the double buffering without dbe. - st - [fork] customized build of… | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit c7b033b8f0a31ec08d3d9dafa390b24c6e232e09 | |
parent 0e232a41150d67539df05e60c7e829f0bfb431d0 | |
Author: Christoph Lohmann <[email protected]> | |
Date: Sat, 19 Jan 2013 15:00:16 +0100 | |
Trying out the double buffering without dbe. | |
Diffstat: | |
M st.c | 50 ++++++++++++++++++++++++-----… | |
1 file changed, 39 insertions(+), 11 deletions(-) | |
--- | |
diff --git a/st.c b/st.c | |
t@@ -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 */ | |
t@@ -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); | |
t@@ -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); | |
t@@ -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); | |
} | |
t@@ -2449,7 +2457,7 @@ xzoom(const Arg *arg) | |
xunloadfonts(); | |
xloadfonts(usedfont, usedfontsize + arg->i); | |
cresize(0, 0); | |
- draw(); | |
+ redraw(0); | |
} | |
void | |
t@@ -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); | |
t@@ -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 | |
t@@ -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 | |
t@@ -2889,6 +2916,7 @@ expose(XEvent *ev) { | |
if(!e->count) | |
xw.state &= ~WIN_REDRAW; | |
} | |
+ redraw(0); | |
} | |
void |