#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
#include "debug.h"
#include "function.h"
int j = 2;
j += _helpwindow (msg, xoffset, yoffset + j, length);
_dobound (length, j, xoffset, yoffset);
+ set_color (black);
return j;
}
mvaddch (win->yoffset, win->xoffset + i, ' ');
}
- if (*index < 0) {
- *index = 0;
+ int _index = (index) ? *index : 0;
+ if (_index < 0) {
+ _index = 0;
}
- if ((int)strlen (menu) - *index < win->xsize) {
- *index = strlen (menu) - win->xsize;
+ if ((int)strlen (menu) - _index < win->xsize) {
+ _index = strlen (menu) - win->xsize;
}
- if (*index < 0) {
- *index = 0;
+ if (_index < 0) {
+ _index = 0;
+ }
+ if (index) {
+ *index = _index;
}
- for (i = 0; (i < win->xsize) && (menu[*index + i] != 0); i++) {
- set_color (((menu[*index + i] >= 'A') && (menu[*index + i] <= 'Z')) ? iblue : black);
- mvaddch (win->yoffset, win->xoffset + i, menu[*index + i]);
+ for (i = 0; (i < win->xsize) && (menu[_index + i] != 0); i++) {
+ set_color (((menu[_index + i] >= 'A') && (menu[_index + i] <= 'Z')) ? iblue : black);
+ mvaddch (win->yoffset, win->xoffset + i, menu[_index + i]);
}
set_color (white);
set_color (blue);
- if (*index > 0) {
+ if (_index > 0) {
mvaddch (win->yoffset, win->xoffset, ACS_LARROW);
}
- if ((int)strlen (menu) - *index > win->xsize) {
+ if ((int)strlen (menu) - _index > win->xsize) {
mvaddch (win->yoffset, win->xoffset + win->xsize - 1, ACS_RARROW);
}
set_color (white);
}
VERBOSE (DEBUG, fprintf (stderr, "rem: %d\n", rem));
- if ((page + *index_y == n - 1) && (*index_x > rem - 1)) {
- *index_x = rem - 1;
+ int _index_x = (index_x) ? *index_x : 0;
+ int _index_y = (index_y) ? *index_y : 0;
+ if ((page + _index_y == n - 1) && (_index_x > rem - 1)) {
+ _index_x = rem - 1;
+ }
+ int index = page + _index_y + n * _index_x;
+ if (index_x) {
+ *index_x = _index_x;
+ }
+ if (index_y) {
+ *index_y = _index_y;
}
- int index = page + *index_y + n * *index_x;
VERBOSE (DEBUG, fprintf (stderr, "index: %d\n", index));
set_color (white);
if (_index < 0) {
_index = 0;
}
+ if (index) {
+ *index = _index;
+ }
for (i = 0; (i < win->xsize) && (status[_index + i] != 0); i++) {
mvaddch (win->yoffset, win->xoffset + i, status[_index + i]);
mvaddch (win->yoffset, win->xoffset + win->xsize - 1, ACS_RARROW);
}
set_color (white);
-
- if (index) {
- *index = _index;
- }
}
char *getwindow (char *msg, window_t *win, int length, int size, char *init)
char *filewindow (char *name, window_t *win)
{
+ static char *_help =
+ "<h> Help message\n"
+ "<i> Move up\n"
+ "<k> Move down\n"
+ "<q> Quit view mode\n"
+ ;
+
char *buffer = loadfile (name);
if (buffer == NULL) {
return strdupcat ("Can't open file '", name, "'", NULL);
free (buffer);
char *title = strdupcat ("File: ", name, NULL);
- set_color (white);
+ set_color (black);
_dobound (win->xsize, win->ysize, win->xoffset, win->yoffset);
_displaytitle (title, win->xoffset, win->yoffset, win->xsize);
case 'q':
stop = 1;
break;
+ case 'h':
+ helpwindow (_help, (win->xsize - strmaxlen (_help, '\n')) / 2, 3 * win->yoffset);
+ while (getch () == ERR) {
+ usleep (200 * 1000);
+ }
+ break;
case 'i':
case KEY_UP:
if (skip > 0) {
break;
}
}
- set_color (black);
+ set_color (white);
freelines (lines);
free (title);
int usage (int ret)
{
FILE *fd = ret ? stderr : stdout;
- fprintf (fd, "usage: %s [-d dir] [-h] [-w]\n", progname);
+ fprintf (fd, "usage: %s [-d dir] [-h] [-x width] [-y height]\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, " -y: screen height (%d)\n", (height) ? height : LINES);
fprintf (fd, "%s version %s\n", progname, version);
return ret;
page[panel]++;
}
break;
+ case 'H':
+ case 'h':
+ helpwindow (help, (width - strmaxlen (help, '\n')) / 2, 3 * yoffset);
+ while (getch () == ERR) {
+ usleep (200 * 1000);
+ }
+ break;
case KEY_UP:
case 'i':
if (index_y[panel]> 0) {
for (i = 0; i < MAXPANELS; i++) {
elementwindow (winelem[i], "", NULL);
}
+ menuwindow (winmenu, "Help up(I) down(J) Quit", NULL);
elementwindow (winelem[0], current->name, NULL);
- string = filewindow (current->name, winscreen);
- if (string) {
- msgwindow (string, winscreen, 0);
- getch ();
- free (string);
+ {
+ char *src = strdupcat (dirname[panel], SEPARATOR, current->name, NULL);
+ char *msg = filewindow (src, winscreen);
+ if (msg) {
+ msgwindow (msg, winscreen, 0);
+ getch ();
+ free (msg);
+ }
+ free (src);
}
+ menuwindow (winmenu, menu, &index_menu);
break;
case ALT_X: /* chmod */
string = getwindow ("Change to mode", winscreen, 4, 4, "0644");
/* test: { sleep 1; echo -en '\eq'; sleep 1; echo -en '\e'; sleep 1; echo -en '\eq'; sleep 1; echo; } | fm.exe */
/* Help */
+/* test: { sleep 1; echo -n 'h'; sleep 1; echo ""; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -d . -d /dev -d .. */
/* test: { sleep 1; echo -en '\eh'; sleep 1; echo ""; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -d . -d /dev -d .. */
/* Navigation */
/* Chmod */
/* test: touch .a && { sleep 1; echo -en 'k\es'; sleep 1; echo -en '\ex'; sleep 1; echo -n 0640; sleep 1; echo; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe && rm .a */
-/* test: mkdir .a && { sleep 1; echo -en 'k\es'; sleep 1; echo -en '\ex'; sleep 1; echo -n 0750; sleep 1; echo; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe && rmdir .a */
+/* test: mkdir .a .a/b && { sleep 1; echo -en 'k\es'; sleep 1; echo -en '\ex'; sleep 1; echo -n 0750; sleep 1; echo; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe && rmdir .a/b .a */
+/* test: touch .a && { sleep 1; echo -en 'k\es'; sleep 1; echo -en '\ex'; sleep 1; echo -n 0649; sleep 1; echo; sleep 1; echo; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe && rm .a */
/* test: touch .a && { sleep 1; echo -en 'k\es'; sleep 1; echo -en '\ex'; sleep 1; echo -n 0649; sleep 1; echo; sleep 1; echo; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe && rm .a */
-/* test: touch .a && { sleep 1; echo -en 'k\es'; sleep 1; echo -en '\ex'; sleep 1; echo -en '\e'; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe && rm .a */
+/* 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: cp fm.c .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 110); do echo -n i; done; 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: mkdir .a && { sleep 1; echo -n 'k'; sleep 1; echo -en '\ev'; sleep 1; echo; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -x 60 -y 20 && rmdir .a */
+/* test: ln -s .b .a && { sleep 1; echo -n 'k'; sleep 1; echo -en '\ev'; sleep 1; echo; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -x 60 -y 20 && rm .a */
/* vim: set ts=4 sw=4 et: */
if (msg == NULL) {
VERBOSE (DEBUG, fprintf (stderr, "rmdir '%s'\n", name));
if (rmdir (name) != 0) {
- msg = strdupcat ("Can't remove directory '", name, "'");
+ msg = strdupcat ("Can't remove directory '", name, "'", NULL);
}
}
} else {
- msg = strdupcat ("Can't open directory '", name, "'");
+ msg = strdupcat ("Can't open directory '", name, "'", NULL);
}
} else {
VERBOSE (DEBUG, fprintf (stderr, "unlink '%s'\n", name));
if (unlink (name) != 0) {
- msg = strdupcat ("Can't remove file '", name, "'");
+ msg = strdupcat ("Can't remove file '", name, "'", NULL);
}
}
} else {
if (msg == NULL) {
VERBOSE (DEBUG, fprintf (stderr, "chmod '%s' to 0%o\n", name, mode));
if (chmod (name, mode) != 0) {
- msg = strdupcat ("Can't change mode ", octal, " for directory '", name, "'");
+ msg = strdupcat ("Can't change mode ", octal, " for directory '", name, "'", NULL);
}
}
} else {
- msg = strdupcat ("Can't open directory '", name, "'");
+ msg = strdupcat ("Can't open directory '", name, "'", NULL);
}
} else {
VERBOSE (DEBUG, fprintf (stderr, "chmod '%s' to 0%o\n", name, mode));
if (chmod (name, mode) != 0) {
- msg = strdupcat ("Can't change mode ", octal, " for file '", name, "'");
+ msg = strdupcat ("Can't change mode ", octal, " for file '", name, "'", NULL);
}
}
free (octal);