add rename function
authorLaurent Mazet <mazet@softndesign.org>
Sat, 11 Jan 2025 23:00:24 +0000 (00:00 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Sat, 11 Jan 2025 23:00:24 +0000 (00:00 +0100)
display.c
display.h
fm.c
function.c
function.h

index 50c92dd8ef9f5d7be58c6151ffd76669f7ccfd86..7a3e3b8cf7c44108250c2a9f9a548dcae28f3ec8 100644 (file)
--- a/display.c
+++ b/display.c
@@ -296,12 +296,15 @@ void elementwindow (window_t *win, char *status, int *index)
     set_color (white);
 }
 
-char *getwindow (char *msg, window_t *win, int length, int size)
+char *getwindow (char *msg, window_t *win, int length, int size, char *init)
 {
     int j;
-    char *name = (char *) calloc (1, size + 1);
+    char *name = (char *) calloc (size + 1, 1);
     CHECKALLOC (name);
     memset (name, ' ', size);
+    if (init) {
+        memcpy (name, init, strlen (init));
+    }
 
     int xoffset = win->xoffset + (win->xsize - strlen (msg) - 1 - length) / 2;
     if (xoffset < 1) {
index 98a5bf1dd37235660755402191ad9a4266142331..d4e4c60f878d74020718f4005d05af64702d35bc 100644 (file)
--- a/display.h
+++ b/display.h
@@ -11,7 +11,7 @@ void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *in
 
 void elementwindow (window_t *win, char *status, int *index);
 
-char *getwindow (char *msg, window_t *win, int length, int size);
+char *getwindow (char *msg, window_t *win, int length, int size, char *init);
 
 void msgwindow (char *msg, window_t *win, int length);
 
diff --git a/fm.c b/fm.c
index d3a9ef0548cd8961ca7340d8fde8e5a6cde2a9e4..38e0425bf79124b95c353c930bc96c83cd882d11 100644 (file)
--- a/fm.c
+++ b/fm.c
@@ -18,6 +18,8 @@
 /* global constants */
 
 #define MAXPANES 2
+#define MAXFILTER 32
+#define MAXFNAME 64
 #define MAXSTATUS 128
 
 /* static variables */
@@ -166,6 +168,13 @@ int main (int argc, char *argv[])
         windir[i]->ysize = height - 2 * yoffset;
     }
 
+    /* init screen window */
+    window_t *winscreen = allocwindow ();
+    winscreen->xoffset = xoffset;
+    winscreen->xsize = width - 2 * xoffset;
+    winscreen->yoffset = yoffset;
+    winscreen->ysize = height - 2 * yoffset;
+
     /* init status windows */
     window_t *winelem[MAXPANES] = {0};
     for (i = 0; i < MAXPANES; i++) {
@@ -186,6 +195,7 @@ int main (int argc, char *argv[])
     /* event loop */
     int stop = 0;
     while (!stop) {
+        int len = 0;
         elem_t *current  = NULL;
         char *string = NULL;
 
@@ -301,7 +311,7 @@ int main (int argc, char *argv[])
             case ALT_E: /* edit */
                 break;
             case ALT_F: /* filter */
-                string = getwindow ("Set filter", windir[pane], 8, 32);
+                string = getwindow ("Set filter", winscreen, MAXFILTER / 2, MAXFILTER, NULL);
                 if (string) {
                     filterlist (list[pane], string);
                     free (string);
@@ -316,14 +326,14 @@ int main (int argc, char *argv[])
             case ALT_M: /* move */
                 break;
             case ALT_N: /* new dir */
-                string = getwindow ("New directory", windir[pane], 8, 32);
+                string = getwindow ("New directory", winscreen, MAXFNAME / 2, MAXFNAME, NULL);
                 if (string) {
 #ifdef WIN32
                     if (mkdir (string) != 0) {
 #else
                     if (mkdir (string, 0750) != 0) {
 #endif
-                        msgwindow ("Can't create directory", windir[pane], 0);
+                        msgwindow ("Can't create directory", winscreen, 0);
                         getch ();
                     }
                     freelist (list[pane]);
@@ -332,11 +342,26 @@ int main (int argc, char *argv[])
                 }
                 break;
             case ALT_Q: /* quit */
-                if (askwindow (" Restart (Y/N) ", windir[pane], "Yy", "Nn") == 1) {
+                if (askwindow (" Restart (Y/N) ", winscreen, "Yy", "Nn") == 1) {
                     stop = 1;
                 }
                 break;
             case ALT_R: /* rename */
+                current = list[pane]->tab + windir[pane]->index;
+                len = (strlen (current->name) > MAXFNAME * 80 / 100) ? 2 * MAXFNAME + 1: MAXFNAME + 1;
+                string = getwindow ("Rename", winscreen, MAXFNAME / 2, len, current->name);
+                if (string) {
+                    struct stat sb;
+                    if ((stat (string, &sb) == 0) || (rename (current->name, string) != 0)) {
+                        char *buf = strdupcat ("Can't rename file to '", string, "'", NULL);
+                        msgwindow (buf, winscreen, 0);
+                        getch ();
+                        free (buf);
+                    }
+                    freelist (list[pane]);
+                    list[pane] = NULL;
+                    free (string);
+                }
                 break;
             case ALT_S: /* select */
                 current = list[pane]->tab + windir[pane]->index;
index f18804d8f3d519a69e86ee8e7a7822ab9aab2634..5bf83e9b6768bf8f12a7234bd47fc8584465c96c 100644 (file)
@@ -1,5 +1,6 @@
 #include <dirent.h>
 #include <regex.h>
+#include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -32,6 +33,26 @@ int strmaxlen (char *str, char ch)
     return len;
 }
 
+char *strdupcat (char *init, ...)
+{
+    va_list va;
+    va_start (va, init);
+
+    char *string = strdup (init);
+    for (;;) {
+        char *buf = va_arg (va, char *);
+        if (buf == NULL) {
+            break;
+        }
+        string = (char *) realloc (string, strlen (string) + strlen (buf) + 1);
+        strcat (string, buf);
+    }
+
+    va_end (va);
+
+    return string;
+}
+
 char *newfilename (char *dirname, char *filename)
 {
     char *name = (char *) calloc (strlen (dirname) + strlen (SEPARATOR) + strlen (filename) + 1, 1);
index 99be0a88d6bf5e6ecf29afaefc0bc74eef8bbcb3..838f0ce8a8ac17ef751efb5e437caba3d8c2071d 100644 (file)
@@ -17,6 +17,8 @@
 
 int strmaxlen (char *str, char ch);
 
+char *strdupcat (char *init, ...);
+
 char *newfilename (char *dirname, char *filename);
 
 list_t *alloclist (void);