Enter/return to view a file
authorLaurent MAZET <laurent.mazet@thalesgroup.com>
Tue, 21 Jan 2025 17:15:23 +0000 (18:15 +0100)
committerLaurent MAZET <laurent.mazet@thalesgroup.com>
Tue, 21 Jan 2025 17:15:23 +0000 (18:15 +0100)
display.c
fm.c
function.c
type.h

index 6fcb8f4f5a2bfb7cf40626959b4034147925353a..f6d543d9ab1fc13adba9940c304591a3f1e190a4 100644 (file)
--- a/display.c
+++ b/display.c
@@ -252,6 +252,7 @@ void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *in
                 break;
             case type_symb_e:
             case type_ldir_e:
+            case type_lreg_e:
                 set_color ((j == index) ? bcyan : cyan);
                 break;
             case type_reg_e:
diff --git a/fm.c b/fm.c
index a3014c9e1e8d8e77553a47d9bba539f64b03a264..801d339da48c8c373181be82e13d9e09c1e2022a 100644 (file)
--- a/fm.c
+++ b/fm.c
@@ -36,7 +36,7 @@ int width = 0;
 
 char *help =
     "alt Menu functions\n"
-    "ret Enter directory\n"
+    "ret Go dir/View file\n"
     "tab Change panel\n"
     "<I> Page up\n"
     "<K> Page down\n"
@@ -243,8 +243,8 @@ int main (int argc, char *argv[])
                 if (dir == NULL) {
                     char *msg = strdupcat ("Can't open directory '", _dirname, "'", NULL);
                     errorwindow (msg, winscreen);
-                   free (msg);
-                   free (_dirname);
+                    free (msg);
+                    free (_dirname);
                 } else {
                     closedir (dir);
                     free (dirname[panel]);
@@ -255,6 +255,22 @@ int main (int argc, char *argv[])
                     list[panel] = NULL;
                     page[panel] = 0;
                 }
+            } else if ((current->type == type_reg_e) || (current->type == type_lreg_e)) {
+                for (i = 0; i < MAXPANELS; i++) {
+                    elementwindow (winelem[i], "", NULL);
+                }
+                menuwindow (winmenu, "Help up(I) down(J) Quit", NULL);
+                char *src = newfilename (dirname[panel], current->name);
+                char *status = strdupcat ("Viewing file '", src, "'", NULL);
+                elementwindow (winelem[0], status, NULL);
+                free (status);
+                char *msg = filewindow (src, winscreen);
+                if (msg) {
+                    errorwindow (msg, winscreen);
+                    free (msg);
+                }
+                free (src);
+                menuwindow (winmenu, menu, &index_menu);
             }
             break;
         case '\t':
@@ -444,7 +460,7 @@ int main (int argc, char *argv[])
                 break;
             case ALT_V: /* view */
                 current = list[panel]->tab + windir[panel]->index;
-                if (strcmp (current->name, "..") != 0) {
+                if ((current->type == type_reg_e) || (current->type == type_lreg_e)) {
                     for (i = 0; i < MAXPANELS; i++) {
                         elementwindow (winelem[i], "", NULL);
                     }
@@ -572,7 +588,7 @@ int main (int argc, char *argv[])
 /* test: ln -s .b .a && { sleep 1; echo -en 'k\es'; sleep 1; echo -en '\ex'; sleep 1; echo; sleep 1; echo ; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe && rm .a */
 
 /* View */
-/* test: echo -ne 'Begin\n  This is a test\nEnd' > .a && { sleep 1; echo -n 'k'; sleep 1; echo -en '\ev'; sleep 1; echo -n kkk; sleep 1; echo -n iii; sleep 1; echo -n h; sleep 1; echo; sleep 1;  echo -n q; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -x 60 -y 20 && rm .a */
+/* test: echo -ne 'Begin\n  This is a test\nEnd' > .a && { sleep 1; echo -n 'k'; sleep 1; echo; sleep 1; echo -n kkk; sleep 1; echo -n iii; sleep 1; echo -n h; sleep 1; echo; sleep 1;  echo -n q; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -x 60 -y 20 && rm .a */
 /* test: cp fm.c .a && { sleep 1; echo -n 'k'; sleep 1; echo -en '\ev'; sleep 1; for i in $(seq 1 1000); do echo -n k; done; sleep 1; for i in $(seq 1 1000); do echo -n i; done; sleep 1; sleep 1;  echo -n q; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -x 60 -y 20 && rm .a */
 /* test: cp fm.c .a && { sleep 1; echo -n 'k'; sleep 1; echo -en '\ev'; sleep 1; echo -n KKKK; sleep 1; echo -n IIII; sleep 1; echo -n q; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -x 60 -y 20 && rm .a */
 /* test: cp debug.o .a && { sleep 1; echo -n 'k'; sleep 1; echo -en '\ev'; sleep 1; for i in $(seq 1 100); do echo -n k; done; sleep 1; for i in $(seq 1 100); do echo -n i; done; sleep 1; echo -n q; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -x 60 -y 20 && rm .a */
index e25228930e0808f8cdf19e21a6d822f5a81a4fb4..a8f9c4eb2bfbf9abd7edfca5465f91f1f7c841a9 100644 (file)
@@ -104,8 +104,7 @@ list_t *_addelement (list_t *list, char *dirname, char *filename, type_t type)
     char *name = newfilename (dirname, filename);
     STAT (name, &sb);
 
-    size_t size = 0;
-    if ((type == type_unkn_e) || (type == type_reg_e)) {
+    if (type == type_unkn_e) {
         switch (sb.st_mode & S_IFMT) {
         case S_IFBLK:
             type = type_block_e;
@@ -133,10 +132,11 @@ list_t *_addelement (list_t *list, char *dirname, char *filename, type_t type)
             break;
 #endif
         }
+    }
 
-        if (type == type_reg_e) {
-            size = sb.st_size;
-        }
+    size_t size = 0;
+    if (type == type_reg_e) {
+        size = sb.st_size;
     }
 
     list->nb++;
@@ -166,6 +166,8 @@ list_t *_addelement (list_t *list, char *dirname, char *filename, type_t type)
             type = type_erlk_e;
         } else if ((sb.st_mode & S_IFMT) == S_IFDIR) {
             type = type_ldir_e;
+        } else if ((sb.st_mode & S_IFMT) == S_IFREG) {
+            type = type_lreg_e;
         }
     }
 #endif
@@ -339,6 +341,9 @@ void createstatus (char *status, elem_t *elem)
     case type_ldir_e:
         strcat (status, "dir.link");
         break;
+    case type_lreg_e:
+        strcat (status, "file.link");
+        break;
     case type_erlk_e:
         strcat (status, "error.link");
         break;
diff --git a/type.h b/type.h
index 0f8d0b06bf40500f38a89ade7625592404d48450..c5ff5a05164d65c861706baaae3c5842973e4726 100644 (file)
--- a/type.h
+++ b/type.h
@@ -11,6 +11,7 @@ typedef enum {
     type_reg_e,
     type_socket_e,
     type_ldir_e,
+    type_lreg_e,
     type_erlk_e
 } type_t;