~petersanchez/st

85849ce72aa4e9cee307a031b97777e9eba2d453 — Roberto E. Vargas Caballero 11 years ago 15cc875
Remove timeout in the main loop

The main loop waits until there is some data to read in file descriptors of
the X server or the pseudo tty. But it uses a timeout in select(), which
causes that st awake each 20 ms, even it doesn't have something to do. This
patch removes this problem removing the timeout, which is not needed.
---
 TODO |    1 -
 st.c |   27 +++------------------------
 2 files changed, 3 insertions(+), 25 deletions(-)
2 files changed, 3 insertions(+), 25 deletions(-)

M TODO
M st.c
M TODO => TODO +0 -1
@@ 15,7 15,6 @@ code & interface

* clean selection code
* clean and complete terminfo entry
* remove the timeouts in the main loop

bugs
----

M st.c => st.c +3 -24
@@ 53,8 53,6 @@
#define XK_NO_MOD     UINT_MAX
#define XK_ANY_MOD    0

#define SELECT_TIMEOUT (20*1000) /* 20 ms */
#define DRAW_TIMEOUT  (20*1000) /* 20 ms */
#define REDRAW_TIMEOUT (80*1000) /* 80 ms */

#define SERRNO strerror(errno)


@@ 205,7 203,6 @@ typedef struct {
	int ch; /* char height */
	int cw; /* char width  */
	char state; /* focus, redraw, visible */
	struct timeval lastdraw;
} XWindow;

typedef struct {


@@ 250,7 247,6 @@ static void drawregion(int, int, int, int);
static void execsh(void);
static void sigchld(int);
static void run(void);
static bool last_draw_too_old(void);

static void csidump(void);
static void csihandle(void);


@@ 2158,7 2154,6 @@ void
draw() {
	drawregion(0, 0, term.col, term.row);
	xcopy();
	gettimeofday(&xw.lastdraw, NULL);
}

void


@@ 2345,41 2340,25 @@ resize(XEvent *e) {
	ttyresize(col, row);
}

bool
last_draw_too_old(void) {
	struct timeval now;
	gettimeofday(&now, NULL);
	return TIMEDIFF(now, xw.lastdraw) >= DRAW_TIMEOUT/1000;
}

void
run(void) {
	XEvent ev;
	fd_set rfd;
	int xfd = XConnectionNumber(xw.dpy);
	struct timeval timeout = {0};
	bool stuff_to_print = 0;

	for(;;) {
		FD_ZERO(&rfd);
		FD_SET(cmdfd, &rfd);
		FD_SET(xfd, &rfd);
		timeout.tv_sec  = 0;
		timeout.tv_usec = SELECT_TIMEOUT;
		if(select(MAX(xfd, cmdfd)+1, &rfd, NULL, NULL, &timeout) < 0) {
		if(select(MAX(xfd, cmdfd)+1, &rfd, NULL, NULL, NULL) < 0) {
			if(errno == EINTR)
				continue;
			die("select failed: %s\n", SERRNO);
		}
		if(FD_ISSET(cmdfd, &rfd)) {
		if(FD_ISSET(cmdfd, &rfd))
			ttyread();
			stuff_to_print = 1;
		}

		if(stuff_to_print && last_draw_too_old()) {
			stuff_to_print = 0;
			draw();
		}
		draw();

		while(XPending(xw.dpy)) {
			XNextEvent(xw.dpy, &ev);