add options to setup screen
authorLaurent Mazet <mazet@softndesign.org>
Mon, 6 Jan 2025 20:31:34 +0000 (21:31 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Mon, 6 Jan 2025 20:31:34 +0000 (21:31 +0100)
fm.c

diff --git a/fm.c b/fm.c
index fdbf63d05e140fb19f137e135a618d2854f68d3e..9e213d27f080fb97cac6135ce708bd6a9c8bfbc5 100644 (file)
--- a/fm.c
+++ b/fm.c
@@ -24,9 +24,11 @@ char *progname = NULL;
 char *version = "0.1";
 
 char *dirname[MAXPANES] = {0};
+int height = 0;
 int pane = 0;
 int xoffset = 1;
 int yoffset = 2;
+int width = 0;
 
 char *help =
     "ret Enter directory\n"
@@ -49,6 +51,8 @@ int usage (int ret)
     fprintf (fd, "usage: %s [-d dir] [-h] [-w]\n", progname);
     fprintf (fd, " -d: dir name (%s)\n", (dirname[0]) ? dirname[0] : ".");
     fprintf (fd, " -h: help message\n");
+    fprintf (fd, " -x: screen height (%d)\n", (height) ? height : LINES);
+    fprintf (fd, " -x: screen width (%d)\n", (width) ? width : COLS);
     fprintf (fd, "%s version %s\n", progname, version);
 
     return ret;
@@ -97,6 +101,22 @@ int main (int argc, char *argv[])
             }
             verbose = atoi (arg);
             break;
+        case 'x':
+            arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
+            if (arg == NULL) {
+                VERBOSE (ERROR, fprintf (stderr, "%s: no width specified\n", progname));
+                return usage (1);
+            }
+            width = atoi (arg);
+            break;
+        case 'y':
+            arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
+            if (arg == NULL) {
+                VERBOSE (ERROR, fprintf (stderr, "%s: no height specified\n", progname));
+                return usage (1);
+            }
+            height = atoi (arg);
+            break;
         case 'h':
         default:
             return usage (c != 'h');
@@ -117,23 +137,31 @@ int main (int argc, char *argv[])
     curs_set (0);
     start_color ();
 
+    /* check screen size */
+    if ((height == 0) || (height > LINES)) {
+        height = LINES;
+    }
+    if ((width == 0) || (width > COLS)) {
+        width = COLS;
+    }
+
     /* init pane windows */
     window_t *windir[MAXPANES] = {0};
     for (i = 0; i < MAXPANES; i++) {
         windir[i] = allocwindow ();
         windir[i]->active = (pane == i);
-        windir[i]->xoffset = xoffset + COLS / 2 * i;
-        windir[i]->xsize = COLS / 2 - 2 * xoffset;
+        windir[i]->xoffset = xoffset + width / 2 * i;
+        windir[i]->xsize = width / 2 - 2 * xoffset;
         windir[i]->yoffset = yoffset;
-        windir[i]->ysize = LINES - 2 * yoffset;
+        windir[i]->ysize = height - 2 * yoffset;
     }
 
     /* init status windows */
     window_t *winelem[MAXPANES] = {0};
     for (i = 0; i < MAXPANES; i++) {
         winelem[i] = allocwindow ();
-        winelem[i]->xoffset = xoffset + COLS / 2 * i;
-        winelem[i]->xsize = COLS / 2 - 2 * xoffset;
+        winelem[i]->xoffset = xoffset + width / 2 * i;
+        winelem[i]->xsize = width / 2 - 2 * xoffset;
         winelem[i]->yoffset = windir[i]->yoffset + windir[i]->ysize + 1;
         winelem[i]->ysize = 1;
     }
@@ -214,7 +242,7 @@ int main (int argc, char *argv[])
             }
             break;
         case 'h':
-            helpwindow (help, (COLS - strmaxlen (help, '\n')) / 2, 3 * yoffset);
+            helpwindow (help, (width - strmaxlen (help, '\n')) / 2, 3 * yoffset);
             while (getch () == ERR) {
                 usleep (200 * 1000);
             }
@@ -277,11 +305,14 @@ int main (int argc, char *argv[])
 /* test: fm.exe -d not_directory 2>&1 | grep "can't read directory" */
 /* test: fm.exe -h | grep usage */
 /* test: fm.exe -v 2>&1 | grep missing */
+/* test: fm.exe -x 2>&1 | grep width */
+/* test: fm.exe -y 2>&1 | grep height */
 /* test: fm.exe _ 2>&1 | grep invalid */
 /* test: { sleep 1; echo -n q; sleep 1; echo -n y; } | fm.exe -d . -d /dev -d .. -v 1 */
 /* test: { sleep 1; echo  h; sleep 1; echo -n q; sleep 1; echo -n y; } | fm.exe -d . -d /dev -d .. */
 /* test: { sleep 1; echo ; sleep 1; echo; sleep 1; echo -en '\tjikkkkklljllll'; sleep 1; echo -n ilk; sleep 1; echo -n q; sleep 1; echo -n y; } | fm.exe */
 /* test: { sleep 1; echo -n KKKKK; sleep 1; echo -n IIIII; sleep 1; echo -n q; sleep 1; echo -n y; } | fm.exe -d /dev -d . */
 /* test: { sleep 1; echo -n kkkkkkkkkkkkkkkkkkkkkkkk; sleep 1; echo -n iiiiiiiiiiiiiiiiiiiii; sleep 1; echo -n q; sleep 1; echo -n y; } | fm.exe -d /dev -d . */
+/* test: { sleep 1; echo -n kkkkkkkkk; sleep 1; echo -n ooo; sleep 1; echo -n uu; sleep 1; echo -n q; sleep 1; echo -n y; } | fm.exe -x 60 -y 20 */
 
 /* vim: set ts=4 sw=4 et: */