diff options
| author | Daniel Friesel <derf@finalrewind.org> | 2017-08-23 17:58:48 +0200 | 
|---|---|---|
| committer | Daniel Friesel <derf@finalrewind.org> | 2017-08-23 17:58:48 +0200 | 
| commit | 84c27062d8035b634d13e96858cfa34fa7e67173 (patch) | |
| tree | dbe6b9c5380286cc7d502260ee8f57873474dba0 | |
| parent | aaa67e2d28d74dac8592f9f3a8db6288929d19de (diff) | |
Put terminal into (mostly) raw mode when reading commands from stdin
Also, restore the previous terminal mode on exit
| -rw-r--r-- | src/main.c | 21 | 
1 files changed, 17 insertions, 4 deletions
| @@ -38,6 +38,9 @@ char **cmdargv = NULL;  int cmdargc = 0;  char *mode = NULL; +struct termios old_term_settings; +int control_via_stdin = 0; +  int main(int argc, char **argv)  {  	atexit(feh_clean_exit); @@ -92,7 +95,6 @@ int feh_main_iteration(int block)  	static int xfd = 0;  	static int fdsize = 0;  	static double pt = 0.0; -	static int read_stdin = 0;  	XEvent ev;  	struct timeval tval;  	fd_set fdset; @@ -110,11 +112,18 @@ int feh_main_iteration(int block)  		pt = feh_get_time();  		first = 0;  		if (isatty(STDIN_FILENO)) { -			read_stdin = 1; +			control_via_stdin = 1;  			struct termios ctrl; +			if (tcgetattr(STDIN_FILENO, &old_term_settings) == -1) +				eprintf("tcgetattr failed");  			if (tcgetattr(STDIN_FILENO, &ctrl) == -1)  				eprintf("tcgetattr failed"); -			ctrl.c_lflag &= ~ICANON; +			ctrl.c_iflag &= ~(PARMRK | ISTRIP +					| INLCR | IGNCR | ICRNL | IXON); +			ctrl.c_oflag &= ~OPOST; +			ctrl.c_lflag &= ~(ECHO | ICANON | IEXTEN); +			ctrl.c_cflag &= ~(CSIZE | PARENB); +			ctrl.c_cflag |= CS8;  			if (tcsetattr(STDIN_FILENO, TCSANOW, &ctrl) == -1)  				eprintf("tcsetattr failed");  		} @@ -138,7 +147,7 @@ int feh_main_iteration(int block)  	FD_ZERO(&fdset);  	FD_SET(xfd, &fdset); -	if (read_stdin) +	if (control_via_stdin)  		FD_SET(STDIN_FILENO, &fdset);  	/* Timers */ @@ -216,6 +225,10 @@ void feh_clean_exit(void)  	if(disp)  		XCloseDisplay(disp); +	if (control_via_stdin) +		if (tcsetattr(STDIN_FILENO, TCSANOW, &old_term_settings) == -1) +			eprintf("tcsetattr failed"); +  	if (opt.filelistfile)  		feh_write_filelist(filelist, opt.filelistfile); | 
