]> Sergey Matveev's repositories - nnn.git/commitdiff
Shared previewer and explorer
authorArun Prakash Jana <engineerarun@gmail.com>
Sun, 20 Jun 2021 07:19:24 +0000 (12:49 +0530)
committerArun Prakash Jana <engineerarun@gmail.com>
Sun, 20 Jun 2021 08:28:33 +0000 (13:58 +0530)
nnn.1
src/nnn.c

diff --git a/nnn.1 b/nnn.1
index 19e5ba760331922f07bfd48b1a2ba9fabd442699..ce813e6d6db3f6a1a28dfed2057b5bc94170be97 100644 (file)
--- a/nnn.1
+++ b/nnn.1
@@ -6,8 +6,10 @@
 .Nd The unorthodox terminal file manager.
 .Sh SYNOPSIS
 .Nm
-.Op Ar -aAcCdDeEfgHJKlnQrRSuUVwxXh
+.Op Ar -aAcCdDeEfgHJKnQrRSuUVwxh
 .Op Ar -b key
+.Op Ar -F val
+.Op Ar -l val
 .Op Ar -p file
 .Op Ar -P key
 .Op Ar -s name
@@ -72,6 +74,10 @@ supports the following options:
 .Fl f
         use readline history file
 .Pp
+.Fl "F val"
+        fifo notification mode
+        0: notify as previewer, 1: notify as explorer, 2: both
+.Pp
 .Fl g
         use regex filters instead of substring match
 .Pp
@@ -139,9 +145,6 @@ supports the following options:
         copy path to system clipboard on select
         show xterm title (if non-picker mode)
 .Pp
-.Fl "X fifo"
-        run in explorer mode, where file path is sent to 'fifo' on 'Enter' or '^M'
-.Pp
 .Fl h
         show program help and exit
 .Sh CONFIGURATION
index a54ea93c9f11595d7507c37eb0d1bdebfed44d5e..f2af560c8536cfa45b7abe20229f8ae6720ff748 100644 (file)
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -331,7 +331,6 @@ typedef struct {
        uint_t dircolor   : 1;  /* Current status of dir color */
        uint_t picker     : 1;  /* Write selection to user-specified file */
        uint_t picked     : 1;  /* Plugin has picked files */
-       uint_t explorer   : 1;  /* Explorer mode: send picked files to FIFO without exiting */
        uint_t runplugin  : 1;  /* Choose plugin mode */
        uint_t runctx     : 3;  /* The context in which plugin is to be run */
        uint_t selmode    : 1;  /* Set when selecting files */
@@ -341,7 +340,8 @@ typedef struct {
        uint_t uidgid     : 1;  /* Show owner and group info */
        uint_t prstssn    : 1;  /* Persistent session */
        uint_t duinit     : 1;  /* Initialize disk usage */
-       uint_t reserved   : 7;  /* Adjust when adding/removing a field */
+       uint_t fifobits   : 2;  /* b00: notify previewer, b01: notify explorer, b10: notify both */
+       uint_t reserved   : 6;  /* Adjust when adding/removing a field */
 } runstate;
 
 /* Contexts or workspaces */
@@ -402,8 +402,7 @@ static context g_ctx[CTX_MAX] __attribute__ ((aligned));
 static int ndents, cur, last, curscroll, last_curscroll, total_dents = ENTRY_INCR, scroll_lines = 1;
 static int nselected;
 #ifndef NOFIFO
-static int hfifofd = -1; /* FIFO used in hover (NNN_FIFO) */
-static int efifofd = -1; /* FIFO used in explorer mode (-X) */
+static int fifofd = -1;
 #endif
 static uint_t idletimeout, selbufpos, lastappendpos, selbuflen;
 static ushort_t xlines, xcols;
@@ -426,8 +425,7 @@ static char *plgpath;
 static char *pnamebuf, *pselbuf;
 static char *mark;
 #ifndef NOFIFO
-static char *hfifopath; /* FIFO used in hover (NNN_FIFO) */
-static char *efifopath; /* FIFO used in explorer mode (-X) */
+static char *fifopath;
 #endif
 static ullong_t *ihashbmp;
 static struct entry *pdents;
@@ -813,7 +811,7 @@ static void move_cursor(int target, int ignore_scrolloff);
 static char *load_input(int fd, const char *path);
 static int set_sort_flags(int r);
 #ifndef NOFIFO
-static void notify_fifo(bool force, bool explorer);
+static void notify_fifo(bool force);
 #endif
 
 /* Functions */
@@ -2760,8 +2758,8 @@ try_quit:
                                c = CONTROL('Q');
                        } else {
 #ifndef NOFIFO
-                               /* Send hovered path to NNN_FIFO */
-                               notify_fifo(TRUE, FALSE);
+                               if (!(g_state.fifobits & 1))
+                                       notify_fifo(TRUE); /* Send hovered path to NNN_FIFO */
 #endif
                                escaped = TRUE;
                                settimeout();
@@ -5414,22 +5412,18 @@ static void populate(char *path, char *lastname)
 }
 
 #ifndef NOFIFO
-static void notify_fifo(bool force, bool explorer)
+static void notify_fifo(bool force)
 {
-       /* refer to the explorer fifo instead of the hover fifo if explorer is true */
-       char **ppath = explorer ? &efifopath : &hfifopath;
-       int *pptr = explorer ? &efifofd : &hfifofd;
-
-       if (!(*ppath))
+       if (!fifopath)
                return;
 
-       if (*pptr == -1) {
-               *pptr = open(*ppath, O_WRONLY|O_NONBLOCK|O_CLOEXEC);
-               if (*pptr == -1) {
+       if (fifofd == -1) {
+               fifofd = open(fifopath, O_WRONLY|O_NONBLOCK|O_CLOEXEC);
+               if (fifofd == -1) {
                        if (errno != ENXIO)
                                /* Unexpected error, the FIFO file might have been removed */
                                /* We give up FIFO notification */
-                               *ppath = NULL;
+                               fifopath = NULL;
                        return;
                }
        }
@@ -5446,7 +5440,7 @@ static void notify_fifo(bool force, bool explorer)
 
        path[len - 1] = '\n';
 
-       ssize_t ret = write(*pptr, path, len);
+       ssize_t ret = write(fifofd, path, len);
 
        if (ret != (ssize_t)len && !(ret == -1 && (errno == EAGAIN || errno == EPIPE))) {
                DPRINTF_S(strerror(errno));
@@ -5482,7 +5476,8 @@ static void move_cursor(int target, int ignore_scrolloff)
        curscroll = MAX(curscroll, MAX(cur - (onscreen - 1), 0));
 
 #ifndef NOFIFO
-       notify_fifo(FALSE, FALSE);
+       if (!(g_state.fifobits & 1))
+               notify_fifo(FALSE); /* Send hovered path to NNN_FIFO */
 #endif
 }
 
@@ -6347,8 +6342,9 @@ nochange:
                                if (r != cur)
                                        move_cursor(r, 1);
 #ifndef NOFIFO
-                               else if (event.bstate == BUTTON1_PRESSED)
-                                       notify_fifo(TRUE, FALSE);
+                               else if ((event.bstate == BUTTON1_PRESSED) && !(g_state.fifobits & 1)) {
+                                       notify_fifo(TRUE); /* Send clicked path to NNN_FIFO */
+                               }
 #endif
                                /* Handle right click selection */
                                if (event.bstate == BUTTON3_PRESSED) {
@@ -6420,8 +6416,8 @@ nochange:
                                goto nochange;
                         }
 #ifndef NOFIFO
-                       if (g_state.explorer && sel == SEL_OPEN) {
-                               notify_fifo(TRUE, TRUE);
+                       if (g_state.fifobits && sel == SEL_OPEN) {
+                               notify_fifo(TRUE); /* Send opened path to NNN_FIFO */
                                goto nochange;
                        }
 #endif
@@ -7630,6 +7626,9 @@ static void usage(void)
                " -E      internal edits in EDITOR\n"
 #ifndef NORL
                " -f      use readline history file\n"
+#endif
+#ifndef NOFIFO
+               " -F val  fifo mode [0:preview 1:explore 2:both]\n"
 #endif
                " -g      regex filters\n"
                " -H      show hidden files\n"
@@ -7638,7 +7637,7 @@ static void usage(void)
                " -l val  set scroll lines\n"
                " -n      type-to-nav mode\n"
                " -o      open files only on Enter\n"
-               " -p file selection file [stdout if '-']\n"
+               " -p file selection file [-:stdout]\n"
                " -P key  run plugin key\n"
                " -Q      no quit confirmation\n"
                " -r      use advcpmv patched cp, mv\n"
@@ -7657,9 +7656,6 @@ static void usage(void)
                " -w      place HW cursor on hovered\n"
 #ifndef NOX11
                " -x      notis, selection sync, xterm title\n"
-#endif
-#ifndef NOFIFO
-               " -X fifo explorer mode\n"
 #endif
                " -h      show help\n\n"
                "v%s\n%s\n", __func__, VERSION, GENERAL_INFO);
@@ -7785,9 +7781,7 @@ static void cleanup(void)
        free(plug);
 #ifndef NOFIFO
        if (g_state.autofifo)
-               unlink(hfifopath);
-       if (g_state.explorer)
-               unlink(efifopath);
+               unlink(fifopath);
 #endif
        if (g_state.pluginit)
                unlink(g_pipepath);
@@ -7819,7 +7813,7 @@ int main(int argc, char *argv[])
 
        while ((opt = (env_opts_id > 0
                       ? env_opts[--env_opts_id]
-                      : getopt(argc, argv, "aAb:cCdDeEfgHJKl:nop:P:QrRs:St:T:uUVwxX:h"))) != -1) {
+                      : getopt(argc, argv, "aAb:cCdDeEfF:gHJKl:nop:P:QrRs:St:T:uUVwxh"))) != -1) {
                switch (opt) {
 #ifndef NOFIFO
                case 'a':
@@ -7856,6 +7850,12 @@ int main(int argc, char *argv[])
                        rlhist = TRUE;
 #endif
                        break;
+#ifndef NOFIFO
+               case 'F':
+                       if (env_opts_id < 0)
+                               g_state.fifobits = atoi(optarg);
+                       break;
+#endif
                case 'g':
                        cfg.regex = 1;
                        filterfn = &visible_re;
@@ -7946,12 +7946,6 @@ int main(int argc, char *argv[])
                case 'x':
                        cfg.x11 = 1;
                        break;
-               case 'X':
-#ifndef NOFIFO
-                       g_state.explorer = TRUE;
-                       efifopath = optarg;
-#endif
-                       break;
                case 'h':
                        usage();
                        return EXIT_SUCCESS;
@@ -8107,18 +8101,9 @@ int main(int argc, char *argv[])
                setenv("NNN_FIFO", g_buf, TRUE);
        }
 
-       hfifopath = xgetenv("NNN_FIFO", NULL);
-       if (hfifopath) {
-               if (mkfifo(hfifopath, 0600) != 0 && !(errno == EEXIST && access(hfifopath, W_OK) == 0)) {
-                       xerror();
-                       return EXIT_FAILURE;
-               }
-
-               sigaction(SIGPIPE, &(struct sigaction){.sa_handler = SIG_IGN}, NULL);
-       }
-
-       if (g_state.explorer) {
-               if (mkfifo(efifopath, 0600) != 0 && !(errno == EEXIST && access(efifopath, W_OK) == 0)) {
+       fifopath = xgetenv("NNN_FIFO", NULL);
+       if (fifopath) {
+               if (mkfifo(fifopath, 0600) != 0 && !(errno == EEXIST && access(fifopath, W_OK) == 0)) {
                        xerror();
                        return EXIT_FAILURE;
                }
@@ -8273,11 +8258,9 @@ int main(int argc, char *argv[])
 #endif
 
 #ifndef NOFIFO
-       notify_fifo(FALSE, FALSE);
-       if (hfifofd != -1)
-               close(hfifofd);
-       if (efifofd != -1)
-               close(efifofd);
+       notify_fifo(FALSE);
+       if (fifofd != -1)
+               close(fifofd);
 #endif
 
        return opt;