set_color (white);
}
-void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *index_y, int *index_f)
+void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *index_y, int *index_f, char *search)
{
int i, j;
}
int maxpos = 0;
+ int slen = (search) ? strlen (search) : 0;
for (i = j = 0; i < list->nb; i++, j++) {
if ((j + 1 ) % n == 0) {
if (rem > 0) {
attron (A_UNDERLINE);
}
- if ((int)strlen (elem->name) <= win->width) {
- mvaddstr (win->yoffset + (j % n) - page, win->xoffset + (j / n) * win->width, elem->name);
+ int len = strlen (elem->name);
+ if (len <= win->width) {
+ int highlight = 0;
+ int k;
+ for (k = 0; k < len; k++) {
+ if ((slen) && (strncmp (elem->name + k, search, slen) == 0)) {
+ highlight = slen;
+ }
+ if (highlight) {
+ attron (A_BOLD);
+ }
+ mvaddch (win->yoffset + (j % n) - page, win->xoffset + (j / n) * win->width + k, elem->name[k]);
+ if (highlight) {
+ attroff (A_BOLD);
+ highlight--;
+ }
+ }
} else {
- int pos = ((int)strlen (elem->name) - _index_f < win->width) ? (int)strlen (elem->name) - win->width : _index_f;
+ int highlight = 0;
+ int pos = (len - _index_f < win->width) ? len - win->width : _index_f;
if (maxpos < pos) {
maxpos = pos;
}
int k;
for (k = 0; k < win->width; k++) {
+ if ((slen) && (strncmp (elem->name + k + pos, search, slen) == 0)) {
+ highlight = slen;
+ }
+ if (highlight) {
+ attron (A_BOLD);
+ }
mvaddch (win->yoffset + (j % n) - page, win->xoffset + k, elem->name[k + pos]);
+ if (highlight) {
+ attroff (A_BOLD);
+ highlight--;
+ }
}
set_color (blue);
if (pos > 0) {
mvaddch (win->yoffset + (j % n) - page, win->xoffset, ACS_LARROW);
}
- if ((int)strlen (elem->name) - pos > win->width) {
+ if (len - pos > win->width) {
mvaddch (win->yoffset + (j % n) - page, win->xoffset + win->width - 1, ACS_RARROW);
}
}
void menuwindow (window_t *win, char *status, int *index);
-void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *index_y, int *index);
+void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *index_y, int *index, char *search);
void elementwindow (window_t *win, char *status, int *index);
/* event loop */
int stop = 0;
+ int mode = 0;
+ char *search[2] = {0};
while (!stop) {
int len = 0;
elem_t *current = NULL;
}
/* display panel */
- displaywindow (windir[i], list[i], page[i], &index_x[i], &index_y[i], &index_f[i]);
+ displaywindow (windir[i], list[i], page[i], &index_x[i], &index_y[i], &index_f[i], search[i]);
/* display info */
current = list[i]->tab + windir[i]->index;
}
int ch = getch ();
+
+ /* search mode */
+ if (mode) {
+ int len = (search[panel]) ? strlen (search[panel]) : 0;
+ switch (ch) {
+ case KEY_ESC:
+ case '\n':
+ case '\t':
+ case '\r':
+ mode = 0;
+ free (search[panel]);
+ search[panel] = NULL;
+ break;
+ case KEY_BACKSPACE:
+ case KEY_DELETE:
+ case 127:
+ case '\b':
+ if (len) {
+ search[panel][len - 1] = '\0';
+ }
+ break;
+ default:
+ search[panel] = (char *) realloc (search[panel], len + 2);
+ CHECKALLOC (search[panel]);
+ search[panel][len] = ch;
+ search[panel][len + 1] = 0;
+ break;
+ }
+ continue;
+ }
+
+ /* command mode */
switch (ch) {
case '\n':
case '\r':
index_x[panel]++;
}
break;
+ case '/':
+ case 'f':
+ mode = 1;
+ break;
case 'o':
index_f[panel]++;
index_m++;