Enable blinking in st.
This commit is contained in:
		@@ -20,6 +20,9 @@ static bool allowaltscreen = true;
 | 
			
		||||
static unsigned int xfps = 60;
 | 
			
		||||
static unsigned int actionfps = 30;
 | 
			
		||||
 | 
			
		||||
/* blinking timeout (set to 0 to disable blinking) */
 | 
			
		||||
static unsigned int blinktimeout = 800;
 | 
			
		||||
 | 
			
		||||
/* TERM value */
 | 
			
		||||
static char termname[] = "st-256color";
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										83
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										83
									
								
								st.c
									
									
									
									
									
								
							@@ -116,6 +116,8 @@ enum term_mode {
 | 
			
		||||
	MODE_APPCURSOR	 = 2048,
 | 
			
		||||
	MODE_MOUSESGR    = 4096,
 | 
			
		||||
	MODE_8BIT	 = 8192,
 | 
			
		||||
	MODE_BLINK	 = 16384,
 | 
			
		||||
	MODE_FBLINK	 = 32768,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum escape_state {
 | 
			
		||||
@@ -313,6 +315,7 @@ static void strhandle(void);
 | 
			
		||||
static void strparse(void);
 | 
			
		||||
static void strreset(void);
 | 
			
		||||
 | 
			
		||||
static int tattrset(int);
 | 
			
		||||
static void tclearregion(int, int, int, int);
 | 
			
		||||
static void tcursor(int);
 | 
			
		||||
static void tdeletechar(int);
 | 
			
		||||
@@ -334,6 +337,7 @@ static void tsetchar(char *, Glyph *, int, int);
 | 
			
		||||
static void tsetscroll(int, int);
 | 
			
		||||
static void tswapscreen(void);
 | 
			
		||||
static void tsetdirt(int, int);
 | 
			
		||||
static void tsetdirtattr(int);
 | 
			
		||||
static void tsetmode(bool, bool, int *, int);
 | 
			
		||||
static void tfulldirt(void);
 | 
			
		||||
static void techo(char *, int);
 | 
			
		||||
@@ -1175,6 +1179,20 @@ ttyresize(void) {
 | 
			
		||||
		fprintf(stderr, "Couldn't set window size: %s\n", SERRNO);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
tattrset(int attr) {
 | 
			
		||||
	int i, j;
 | 
			
		||||
 | 
			
		||||
	for(i = 0; i < term.row-1; i++) {
 | 
			
		||||
		for(j = 0; j < term.col-1; j++) {
 | 
			
		||||
			if(term.line[i][j].mode & attr)
 | 
			
		||||
				return 1;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
tsetdirt(int top, int bot) {
 | 
			
		||||
	int i;
 | 
			
		||||
@@ -1186,6 +1204,20 @@ tsetdirt(int top, int bot) {
 | 
			
		||||
		term.dirty[i] = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
tsetdirtattr(int attr) {
 | 
			
		||||
	int i, j;
 | 
			
		||||
 | 
			
		||||
	for(i = 0; i < term.row-1; i++) {
 | 
			
		||||
		for(j = 0; j < term.col-1; j++) {
 | 
			
		||||
			if(term.line[i][j].mode & attr) {
 | 
			
		||||
				tsetdirt(i, i);
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
tfulldirt(void) {
 | 
			
		||||
	tsetdirt(0, term.row-1);
 | 
			
		||||
@@ -2838,6 +2870,9 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {
 | 
			
		||||
		bg = temp;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(base.mode & ATTR_BLINK && term.mode & MODE_BLINK)
 | 
			
		||||
		fg = bg;
 | 
			
		||||
 | 
			
		||||
	/* Intelligent cleaning up of the borders. */
 | 
			
		||||
	if(x == 0) {
 | 
			
		||||
		xclear(0, (y == 0)? 0 : winy, borderpx,
 | 
			
		||||
@@ -3345,34 +3380,55 @@ void
 | 
			
		||||
run(void) {
 | 
			
		||||
	XEvent ev;
 | 
			
		||||
	fd_set rfd;
 | 
			
		||||
	int xfd = XConnectionNumber(xw.dpy), xev;
 | 
			
		||||
	struct timeval drawtimeout, *tv = NULL, now, last;
 | 
			
		||||
	int xfd = XConnectionNumber(xw.dpy), xev, blinkset = 0, dodraw = 0;
 | 
			
		||||
	struct timeval drawtimeout, *tv = NULL, now, last, lastblink;
 | 
			
		||||
 | 
			
		||||
	gettimeofday(&lastblink, NULL);
 | 
			
		||||
	gettimeofday(&last, NULL);
 | 
			
		||||
 | 
			
		||||
	for(xev = actionfps;;) {
 | 
			
		||||
		FD_ZERO(&rfd);
 | 
			
		||||
		FD_SET(cmdfd, &rfd);
 | 
			
		||||
		FD_SET(xfd, &rfd);
 | 
			
		||||
		if(select(MAX(xfd, cmdfd)+1, &rfd, NULL, NULL, tv) < 0) {
 | 
			
		||||
 | 
			
		||||
		switch(select(MAX(xfd, cmdfd)+1, &rfd, NULL, NULL, tv) < 0) {
 | 
			
		||||
		case -1:
 | 
			
		||||
			if(errno == EINTR)
 | 
			
		||||
				continue;
 | 
			
		||||
			die("select failed: %s\n", SERRNO);
 | 
			
		||||
		}
 | 
			
		||||
		default:
 | 
			
		||||
			if(FD_ISSET(cmdfd, &rfd)) {
 | 
			
		||||
				ttyread();
 | 
			
		||||
				if(blinktimeout) {
 | 
			
		||||
					blinkset = tattrset(ATTR_BLINK);
 | 
			
		||||
					if(!blinkset && term.mode & ATTR_BLINK)
 | 
			
		||||
						term.mode &= ~(MODE_BLINK);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if(FD_ISSET(xfd, &rfd))
 | 
			
		||||
				xev = actionfps;
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
		gettimeofday(&now, NULL);
 | 
			
		||||
		drawtimeout.tv_sec = 0;
 | 
			
		||||
		drawtimeout.tv_usec = (1000/xfps) * 1000;
 | 
			
		||||
		tv = &drawtimeout;
 | 
			
		||||
 | 
			
		||||
		if(FD_ISSET(cmdfd, &rfd))
 | 
			
		||||
			ttyread();
 | 
			
		||||
		dodraw = 0;
 | 
			
		||||
		if(blinktimeout && TIMEDIFF(now, lastblink) > blinktimeout) {
 | 
			
		||||
			tsetdirtattr(ATTR_BLINK);
 | 
			
		||||
			term.mode ^= MODE_BLINK;
 | 
			
		||||
			gettimeofday(&lastblink, NULL);
 | 
			
		||||
			dodraw = 1;
 | 
			
		||||
		}
 | 
			
		||||
		if(TIMEDIFF(now, last) \
 | 
			
		||||
				> (xev? (1000/xfps) : (1000/actionfps))) {
 | 
			
		||||
			dodraw = 1;
 | 
			
		||||
			last = now;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if(FD_ISSET(xfd, &rfd))
 | 
			
		||||
			xev = actionfps;
 | 
			
		||||
 | 
			
		||||
		if(TIMEDIFF(now, last) > \
 | 
			
		||||
				(xev ? (1000/xfps) : (1000/actionfps))) {
 | 
			
		||||
		if(dodraw) {
 | 
			
		||||
			while(XPending(xw.dpy)) {
 | 
			
		||||
				XNextEvent(xw.dpy, &ev);
 | 
			
		||||
				if(XFilterEvent(&ev, None))
 | 
			
		||||
@@ -3383,12 +3439,13 @@ run(void) {
 | 
			
		||||
 | 
			
		||||
			draw();
 | 
			
		||||
			XFlush(xw.dpy);
 | 
			
		||||
			last = now;
 | 
			
		||||
 | 
			
		||||
			if(xev && !FD_ISSET(xfd, &rfd))
 | 
			
		||||
				xev--;
 | 
			
		||||
			if(!FD_ISSET(cmdfd, &rfd) && !FD_ISSET(xfd, &rfd))
 | 
			
		||||
			if(!FD_ISSET(cmdfd, &rfd) && !FD_ISSET(xfd, &rfd) \
 | 
			
		||||
					&& !blinkset) {
 | 
			
		||||
				tv = NULL;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user