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) {
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);
/* global constants */
#define MAXPANES 2
+#define MAXFILTER 32
+#define MAXFNAME 64
#define MAXSTATUS 128
/* static variables */
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++) {
/* event loop */
int stop = 0;
while (!stop) {
+ int len = 0;
elem_t *current = NULL;
char *string = NULL;
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);
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]);
}
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;
#include <dirent.h>
#include <regex.h>
+#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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);