tRender only once in each main loop iteration - st - [fork] customized build of… | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit c5a9b799d44be9c0fa4264dc34d9dd61321be795 | |
parent 85849ce72aa4e9cee307a031b97777e9eba2d453 | |
Author: Roberto E. Vargas Caballero <[email protected]> | |
Date: Sun, 16 Sep 2012 10:48:38 +0200 | |
Render only once in each main loop iteration | |
draw() runs over all lines of the screen and renders only the dirty lines, | |
tthis avoids render lines which are not modified since last draw() call. In | |
tthis moment the main loop is something like: | |
- Wait something to read from file descriptors | |
- Read from pseudo tty | |
- Call draw() for rending | |
- Read X events | |
This cause the problem that all the X events that have to update the screen | |
have to call draw() (because draw() is called before of X events handling), | |
so you can have multiples renderings in only one iteration, that will waste | |
a lot of resources. | |
This patch change the main loop to: | |
- Wait something to read from file descriptors | |
- Read from pseudo tty | |
- Read X events | |
- Call draw() for rending | |
So X events don't have to worry about rendering, because draw() is called | |
after them. | |
The only place where draw is called outside of the main loop is in redraw(), | |
but it is necessary for getting a good tput flash. | |
--- | |
st.c | 29 ++++++----------------------- | |
1 file changed, 6 insertions(+), 23 deletions(-) | |
Diffstat: | |
M st.c | 29 ++++++----------------------- | |
1 file changed, 6 insertions(+), 23 deletions(-) | |
--- | |
diff --git a/st.c b/st.c | |
t@@ -288,7 +288,6 @@ static void ttywrite(const char *, size_t); | |
static void xdraws(char *, Glyph, int, int, int, int); | |
static void xhints(void); | |
static void xclear(int, int, int, int); | |
-static void xcopy(void); | |
static void xdrawcursor(void); | |
static void xinit(void); | |
static void xloadcols(void); | |
t@@ -635,7 +634,6 @@ void selclear(XEvent *e) { | |
return; | |
sel.bx = -1; | |
tsetdirt(sel.b.y, sel.e.y); | |
- draw(); | |
} | |
void | |
t@@ -685,8 +683,6 @@ xsetsel(char *str) { | |
clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); | |
XSetSelectionOwner(xw.dpy, clipboard, xw.win, CurrentTime); | |
- | |
- XFlush(xw.dpy); | |
} | |
void | |
t@@ -729,7 +725,6 @@ brelease(XEvent *e) { | |
} | |
memcpy(&sel.tclick2, &sel.tclick1, sizeof(struct timeval)); | |
gettimeofday(&sel.tclick1, NULL); | |
- draw(); | |
} | |
void | |
t@@ -746,7 +741,6 @@ bmotion(XEvent *e) { | |
int starty = MIN(oldey, sel.ey); | |
int endy = MAX(oldey, sel.ey); | |
tsetdirt(starty, endy); | |
- draw(); | |
} | |
} | |
} | |
t@@ -2091,13 +2085,6 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, … | |
XDrawLine(xw.dpy, xw.buf, dc.gc, winx, winy+1, winx+width-1, w… | |
} | |
-/* copy buffer pixmap to screen pixmap */ | |
-void | |
-xcopy() { | |
- XdbeSwapInfo swpinfo[1] = {{xw.win, XdbeCopied}}; | |
- XdbeSwapBuffers(xw.dpy, swpinfo, 1); | |
-} | |
- | |
void | |
xdrawcursor(void) { | |
static int oldx = 0; | |
t@@ -2118,8 +2105,6 @@ xdrawcursor(void) { | |
} else | |
xclear(oldx, oldy, oldx, oldy); | |
- xcopy(); | |
- | |
/* draw the new one */ | |
if(!(term.c.state & CURSOR_HIDE)) { | |
if(!(xw.state & WIN_FOCUSED)) | |
t@@ -2132,8 +2117,6 @@ xdrawcursor(void) { | |
xdraws(g.c, g, term.c.x, term.c.y, 1, sl); | |
oldx = term.c.x, oldy = term.c.y; | |
} | |
- | |
- xcopy(); | |
} | |
void | |
t@@ -2152,8 +2135,10 @@ redraw(void) { | |
void | |
draw() { | |
+ XdbeSwapInfo swpinfo[1] = {{xw.win, XdbeCopied}}; | |
+ | |
drawregion(0, 0, term.col, term.row); | |
- xcopy(); | |
+ XdbeSwapBuffers(xw.dpy, swpinfo, 1); | |
} | |
void | |
t@@ -2208,7 +2193,6 @@ expose(XEvent *ev) { | |
if(!e->count) | |
xw.state &= ~WIN_REDRAW; | |
} | |
- xcopy(); | |
} | |
void | |
t@@ -2241,7 +2225,6 @@ focus(XEvent *ev) { | |
xseturgency(0); | |
} else | |
xw.state &= ~WIN_FOCUSED; | |
- draw(); | |
} | |
char* | |
t@@ -2317,7 +2300,6 @@ cmessage(XEvent *e) { | |
} else if(e->xclient.data.l[1] == XEMBED_FOCUS_OUT) { | |
xw.state &= ~WIN_FOCUSED; | |
} | |
- draw(); | |
} | |
} | |
t@@ -2358,8 +2340,6 @@ run(void) { | |
if(FD_ISSET(cmdfd, &rfd)) | |
ttyread(); | |
- draw(); | |
- | |
while(XPending(xw.dpy)) { | |
XNextEvent(xw.dpy, &ev); | |
if(XFilterEvent(&ev, xw.win)) | |
t@@ -2367,6 +2347,9 @@ run(void) { | |
if(handler[ev.type]) | |
(handler[ev.type])(&ev); | |
} | |
+ | |
+ draw(); | |
+ XFlush(xw.dpy); | |
} | |
} | |