diff options
author | 2018-03-16 04:24:29 +0530 | |
---|---|---|
committer | 2018-03-16 04:39:49 +0530 | |
commit | 70c39a063d1097d33b8967b9a31618b5f826db72 (patch) | |
tree | e53c322b094a6a73428941ecfa7d28c1a12ee277 /nnn.c | |
parent | 9a359b06f0987e2a1d9b734119a04bf152acfea4 (diff) | |
download | nnn-70c39a063d1097d33b8967b9a31618b5f826db72.tar.gz |
Fix #81: GUI programs shouldn't exit on closing the parent terminal
Issue reproduction steps:
1. Spawn a GUI program e.g. open a PDF file in zathura or evince.
2. Without quitting `nnn` close the terminal.
3. Notice that the application quits too.
Can be a nagging issue if someone is not using a drop-down terminal.
Fix: detach a GUI child and start it in a new session.
There are 2 aspects to this commit:
- It fixes #81: in cases where we do not wait for a spawned child we can assume
that the child is a GUI process. We detach and spawn the child in a new session.
- It changes the behaviour to @Rahi374's suggestion in PR #40 i.e. invoke the DE
opener in F_NOWAIT mode.
Diffstat (limited to 'nnn.c')
-rw-r--r-- | nnn.c | 14 |
1 files changed, 8 insertions, 6 deletions
@@ -248,7 +248,6 @@ static char *player; static char *copier; static char *editor; static char *desktop_manager; -static char nowait = F_NOTRACE; static blkcnt_t ent_blocks; static blkcnt_t dir_blocks; static ulong num_files; @@ -759,6 +758,12 @@ spawn(const char *file, const char *arg1, const char *arg2, const char *dir, uch close(fd); } + if (flag & F_NOWAIT) { + signal(SIGHUP, SIG_IGN); + signal(SIGPIPE, SIG_IGN); + setsid(); + } + if (flag & F_SIGINT) signal(SIGINT, SIG_DFL); execlp(file, file, arg1, arg2, NULL); @@ -2520,7 +2525,7 @@ nochange: } /* Invoke desktop opener as last resort */ - spawn(utils[OPENER], newpath, NULL, NULL, nowait); + spawn(utils[OPENER], newpath, NULL, NULL, F_NOWAIT | F_NOTRACE); continue; } default: @@ -2878,7 +2883,7 @@ nochange: goto nochange; } - spawn(desktop_manager, path, NULL, path, F_NOTRACE | F_NOWAIT); + spawn(desktop_manager, path, NULL, path, F_NOWAIT | F_NOTRACE); break; case SEL_FSIZE: cfg.sizeorder ^= 1; @@ -3341,9 +3346,6 @@ main(int argc, char *argv[]) /* Get the default copier, if set */ copier = getenv("NNN_COPIER"); - /* Get nowait flag */ - nowait |= getenv("NNN_NOWAIT") ? F_NOWAIT : 0; - /* Enable quotes if opted */ if (getenv("NNN_QUOTE_ON")) cfg.quote = 1; |