summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Friesel <derf@finalrewind.org>2017-08-29 12:35:22 +0200
committerDaniel Friesel <derf@finalrewind.org>2017-08-29 12:35:22 +0200
commitcbf6925bba7c10cc662e375e1ab6cd47c3b1d481 (patch)
tree8dee45035fb6cc3f528fbec794ded4c857235de0
parent9e146eb61690404a33c80645fbb46b696d48d484 (diff)
Handle detaching the controlling tty from a feh process
-rw-r--r--src/feh.h2
-rw-r--r--src/keyevents.c3
-rw-r--r--src/main.c2
-rw-r--r--src/signals.c10
4 files changed, 13 insertions, 4 deletions
diff --git a/src/feh.h b/src/feh.h
index 4572652..fb9fefe 100644
--- a/src/feh.h
+++ b/src/feh.h
@@ -201,4 +201,6 @@ extern char *mode; /* label for the current mode */
/* to terminate long-running children with SIGALRM */
extern int childpid;
+extern int control_via_stdin;
+
#endif
diff --git a/src/keyevents.c b/src/keyevents.c
index b5c1949..2e49676 100644
--- a/src/keyevents.c
+++ b/src/keyevents.c
@@ -271,7 +271,8 @@ void feh_event_handle_stdin()
char stdin_buf[2];
KeySym keysym = NoSymbol;
if (read(STDIN_FILENO, &stdin_buf, 1) == -1) {
- weprintf("reading a command from stdin failed");
+ if (control_via_stdin)
+ weprintf("reading a command from stdin failed");
return;
}
stdin_buf[1] = '\0';
diff --git a/src/main.c b/src/main.c
index b3f121c..cb2964f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -234,7 +234,7 @@ void feh_clean_exit(void)
if(disp)
XCloseDisplay(disp);
- if (control_via_stdin)
+ if (control_via_stdin && isatty(STDIN_FILENO))
if (tcsetattr(STDIN_FILENO, TCSANOW, &old_term_settings) == -1)
eprintf("tcsetattr failed");
diff --git a/src/signals.c b/src/signals.c
index 0b18aac..8a3a8f7 100644
--- a/src/signals.c
+++ b/src/signals.c
@@ -40,7 +40,8 @@ void setup_signal_handlers()
(sigaddset(&feh_ss, SIGALRM) == -1) ||
(sigaddset(&feh_ss, SIGTERM) == -1) ||
(sigaddset(&feh_ss, SIGQUIT) == -1) ||
- (sigaddset(&feh_ss, SIGINT) == -1))
+ (sigaddset(&feh_ss, SIGINT) == -1) ||
+ (sigaddset(&feh_ss, SIGTTIN) == -1))
{
weprintf("Failed to set up signal masks");
return;
@@ -56,7 +57,8 @@ void setup_signal_handlers()
(sigaction(SIGALRM, &feh_sh, NULL) == -1) ||
(sigaction(SIGTERM, &feh_sh, NULL) == -1) ||
(sigaction(SIGQUIT, &feh_sh, NULL) == -1) ||
- (sigaction(SIGINT, &feh_sh, NULL) == -1))
+ (sigaction(SIGINT, &feh_sh, NULL) == -1) ||
+ (sigaction(SIGTTIN, &feh_sh, NULL) == -1))
{
weprintf("Failed to set up signal handler");
return;
@@ -75,6 +77,10 @@ void feh_handle_signal(int signo)
if (childpid)
killpg(childpid, SIGINT);
return;
+ case SIGTTIN:
+ // we were probably backgrounded while we were running
+ control_via_stdin = 0;
+ return;
case SIGINT:
case SIGTERM:
case SIGQUIT: