set_color (white);
}
-char *getwindow (char *msg, window_t *win, int length)
+char *getwindow (char *msg, window_t *win, int length, int size)
{
- char *name = (char *) calloc (1, length + 1);
+ int j;
+ char *name = (char *) calloc (1, size + 1);
CHECKALLOC (name);
- memset (name, ' ', length);
+ memset (name, ' ', size);
int xoffset = win->xoffset + (win->xsize - strlen (msg) - 1 - length) / 2;
if (xoffset < 1) {
mvaddch (yoffset, xoffset, ' ');
xoffset++;
set_color (byellow);
- mvaddstr (yoffset, xoffset, name);
+ for (j = 0; (j < length) && (name[j] != '\0'); j++) {
+ mvaddch (yoffset, xoffset + j, name[j]);
+ }
set_color (white);
- int i = 0, j;
+ int i = 0, l = 0;
int stop = 0;
while (!stop) {
- for (j = 0; j < length; j++) {
+ for (j = 0; (j < length) && (name[j + l] != '\0'); j++) {
set_color ((j == i) ? yellow : byellow);
- mvaddch (yoffset, xoffset + j, name[j]);
+ mvaddch (yoffset, xoffset + j, name[j + l]);
set_color (white);
}
int ch = getch ();
case KEY_DELETE:
case 127:
case '\b':
- name[i] = ' ';
- i--;
- break;
+ name[l + i] = ' ';
+ /* fallthrough */
case KEY_LEFT:
i--;
+ if (i < 0) {
+ if (l > 0) {
+ l--;
+ }
+ i = 0;
+ }
break;
case KEY_RIGHT:
i++;
+ if (i == length) {
+ if (l + i < size) {
+ l++;
+ }
+ i = length - 1;
+ }
break;
case KEY_ESC:
free (name);
break;
default:
if ((ch >= 32) && ( ch < 128)) {
- name[i] = ch;
+ name[l + i] = ch;
i++;
+ if (i == length) {
+ if (l + i < size) {
+ l++;
+ }
+ i = length - 1;
+ }
}
}
-
- if (i < 0) {
- i = 0;
- }
- if (i >= length) {
- i = length - 1;
- }
+ VERBOSE (DEBUG, fprintf (stderr, "i: %d l: %d\n", i, l));
}
if (name) {
VERBOSE (DEBUG, fprintf (stderr, "name: '%s'\n", name));
- for (j = length - 1; (j >= 0) && (name[j] == ' '); j--) {
+ for (j = size - 1; (j >= 0) && (name[j] == ' '); j--) {
name[j] = '\0';
}
for (i = 0; name[i] == ' '; i++);
void elementwindow (window_t *win, char *status, int *index);
-char *getwindow (char *msg, window_t *win, int length);
+char *getwindow (char *msg, window_t *win, int length, int size);
void msgwindow (char *msg, int xoffset, int yoffset, int length);
break;
case ALT_(F): /* filter */
VERBOSE(DEBUG, fprintf (stderr, "ALT F\n"));
- filter = getwindow ("Set filter", windir[pane], 16);
+ filter = getwindow ("Set filter", windir[pane], 8, 32);
if (filter) {
filterlist (list[pane], filter);
free (filter);