diff options
| author | Daniel Friesel <derf@finalrewind.org> | 2017-08-22 22:29:47 +0200 | 
|---|---|---|
| committer | Daniel Friesel <derf@finalrewind.org> | 2017-08-22 22:29:47 +0200 | 
| commit | aaa67e2d28d74dac8592f9f3a8db6288929d19de (patch) | |
| tree | ad4201df2928e0c0af42463a2c72a3921269da84 | |
| parent | fd524633c472db23e6a4111a81ba343d554abe26 (diff) | |
Add experimental support for (remote) control via stdin
| -rw-r--r-- | src/feh.h | 1 | ||||
| -rw-r--r-- | src/keyevents.c | 15 | ||||
| -rw-r--r-- | src/main.c | 17 | 
3 files changed, 33 insertions, 0 deletions
| @@ -142,6 +142,7 @@ char *thumbnail_create_name(feh_file * file, winwidget winwid);  void init_keyevents(void);  void init_buttonbindings(void);  void feh_event_handle_keypress(XEvent * ev); +void feh_event_handle_stdin();  void feh_event_handle_generic(winwidget winwid, unsigned int state, KeySym keysym, unsigned int button);  fehkey *feh_str_to_kb(char * action);  void feh_action_run(feh_file * file, char *action, winwidget winwid); diff --git a/src/keyevents.c b/src/keyevents.c index 861a7a7..f10ce43 100644 --- a/src/keyevents.c +++ b/src/keyevents.c @@ -266,6 +266,21 @@ void feh_event_invoke_action(winwidget winwid, unsigned char action)  	return;  } +void feh_event_handle_stdin() +{ +	char stdin_buf[2]; +	if (read(STDIN_FILENO, &stdin_buf, 1) == -1) { +		weprintf("reading a command from stdin failed"); +		return; +	} +	stdin_buf[1] = '\0'; + +	KeySym keysym = XStringToKeysym(stdin_buf); + +	if (window_num) +		feh_event_handle_generic(windows[0], 0, keysym, 0); +} +  void feh_event_handle_keypress(XEvent * ev)  {  	int state; @@ -32,6 +32,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  #include "events.h"  #include "signals.h"  #include "wallpaper.h" +#include <termios.h>  char **cmdargv = NULL;  int cmdargc = 0; @@ -91,6 +92,7 @@ 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; @@ -107,6 +109,15 @@ int feh_main_iteration(int block)  		fdsize = xfd + 1;  		pt = feh_get_time();  		first = 0; +		if (isatty(STDIN_FILENO)) { +			read_stdin = 1; +			struct termios ctrl; +			if (tcgetattr(STDIN_FILENO, &ctrl) == -1) +				eprintf("tcgetattr failed"); +			ctrl.c_lflag &= ~ICANON; +			if (tcsetattr(STDIN_FILENO, TCSANOW, &ctrl) == -1) +				eprintf("tcsetattr failed"); +		}  	}  	/* Timers */ @@ -127,6 +138,8 @@ int feh_main_iteration(int block)  	FD_ZERO(&fdset);  	FD_SET(xfd, &fdset); +	if (read_stdin) +		FD_SET(STDIN_FILENO, &fdset);  	/* Timers */  	ft = first_timer; @@ -170,6 +183,8 @@ int feh_main_iteration(int block)  				   in that */  				feh_handle_timer();  			} +			else if (count && (FD_ISSET(0, &fdset))) +				feh_event_handle_stdin();  		}  	} else {  		/* Don't block if there are events in the queue. That's a bit rude ;-) */ @@ -181,6 +196,8 @@ int feh_main_iteration(int block)  					&& ((errno == ENOMEM) || (errno == EINVAL)  						|| (errno == EBADF)))  				eprintf("Connection to X display lost"); +			else if (count && (FD_ISSET(0, &fdset))) +				feh_event_handle_stdin();  		}  	}  	if (window_num == 0) | 
