summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Friesel <derf@finalrewind.org>2017-08-22 22:29:47 +0200
committerDaniel Friesel <derf@finalrewind.org>2017-08-22 22:29:47 +0200
commitaaa67e2d28d74dac8592f9f3a8db6288929d19de (patch)
treead4201df2928e0c0af42463a2c72a3921269da84
parentfd524633c472db23e6a4111a81ba343d554abe26 (diff)
Add experimental support for (remote) control via stdin
-rw-r--r--src/feh.h1
-rw-r--r--src/keyevents.c15
-rw-r--r--src/main.c17
3 files changed, 33 insertions, 0 deletions
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 <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)