From aaa67e2d28d74dac8592f9f3a8db6288929d19de Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Tue, 22 Aug 2017 22:29:47 +0200 Subject: Add experimental support for (remote) control via stdin --- src/feh.h | 1 + src/keyevents.c | 15 +++++++++++++++ src/main.c | 17 +++++++++++++++++ 3 files changed, 33 insertions(+) (limited to 'src') diff --git a/src/feh.h b/src/feh.h index 53d3894..4572652 100644 --- a/src/feh.h +++ b/src/feh.h @@ -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; diff --git a/src/main.c b/src/main.c index 46ab73d..ba6e57c 100644 --- a/src/main.c +++ b/src/main.c @@ -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 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) -- cgit v1.2.3