aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGravatar Arun Prakash Jana <engineerarun@gmail.com>2018-11-12 22:13:35 +0530
committerGravatar Arun Prakash Jana <engineerarun@gmail.com>2018-11-12 22:13:35 +0530
commit07e643b10fb8c1abb41c6381f6e0c563e9a34881 (patch)
tree216122585538e62d09326f3cd93bbcbb22ddc24d /src
parentfabcc488ea3323cab5e4dcc983af18f1e334633d (diff)
downloadnnn-07e643b10fb8c1abb41c6381f6e0c563e9a34881.tar.gz
Confirm program quit whan multiple contexts are active
Diffstat (limited to 'src')
-rw-r--r--src/nnn.c66
1 files changed, 37 insertions, 29 deletions
diff --git a/src/nnn.c b/src/nnn.c
index 0cf0392..c49a195 100644
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -434,10 +434,20 @@ static void printerr(int linenum)
}
/* Print prompt on the last line */
-static void printprompt(char *str)
+static void printprompt(const char *str)
{
clearprompt();
- printw(str);
+ if (str)
+ printw(str);
+}
+
+static int get_input(const char *prompt)
+{
+ printprompt(prompt);
+ cleartimeout();
+ int r = getch();
+ settimeout();
+ return r;
}
/* Increase the limit on open file descriptors, if possible */
@@ -3123,10 +3133,7 @@ nochange:
}
if (sel == SEL_OPEN) {
- printprompt("press 'c' for cli mode");
- cleartimeout();
- r = getch();
- settimeout();
+ r = get_input("press 'c' for cli mode");
if (r == 'c')
r = F_NORMAL;
else
@@ -3195,10 +3202,7 @@ nochange:
}
/* Check if it's a dir or file */
- printprompt("press 'f'(ile) or 'd'(ir)");
- cleartimeout();
- r = getch();
- settimeout();
+ r = get_input("press 'f'(ile) or 'd'(ir)");
if (r == 'f') {
r = openat(fd, tmp, O_CREAT, 0666);
close(r);
@@ -3246,11 +3250,7 @@ nochange:
/* Check if another file with same name exists */
if (faccessat(fd, tmp, F_OK, AT_SYMLINK_NOFOLLOW) != -1) {
/* File with the same name exists */
- printprompt("press 'y' to overwrite");
- cleartimeout();
- r = getch();
- settimeout();
- if (r != 'y') {
+ if (get_input("press 'y' to overwrite") != 'y') {
close(fd);
break;
}
@@ -3361,24 +3361,32 @@ nochange:
dentfree(dents);
return;
}
- case SEL_CDQUIT:
- {
- tmp = getenv("NNN_TMPFILE");
- if (!tmp) {
- printmsg("set NNN_TMPFILE");
- goto nochange;
- }
+ case SEL_CDQUIT: // fallthrough
+ case SEL_QUIT:
+ for (r = 0; r < MAX_CTX; ++r)
+ if (r != cfg.curctx && g_ctx[r].c_cfg.ctxactive) {
+ r = get_input("press 'y' to quit all contexts");
+ break;
+ }
+
+ if (!(r == MAX_CTX || r == 'y'))
+ break;
- FILE *fp = fopen(tmp, "w");
+ if (sel == SEL_CDQUIT) {
+ tmp = getenv("NNN_TMPFILE");
+ if (!tmp) {
+ printmsg("set NNN_TMPFILE");
+ goto nochange;
+ }
+
+ FILE *fp = fopen(tmp, "w");
- if (fp) {
- fprintf(fp, "cd \"%s\"", path);
- fclose(fp);
+ if (fp) {
+ fprintf(fp, "cd \"%s\"", path);
+ fclose(fp);
+ }
}
- /* Fall through to exit */
- } // fallthrough
- case SEL_QUIT:
dentfree(dents);
return;
} /* switch (sel) */