diff --git a/interactions.c b/interactions.c index 97b7ccb..455f867 100644 --- a/interactions.c +++ b/interactions.c @@ -13,6 +13,9 @@ extern pthread_mutex_t mutex_mid; +extern pthread_mutex_t mutex_render; +extern WINDOW *win_b; +extern WINDOW *win_m; extern dir mid_dir; extern unsigned int terminal_height; @@ -356,13 +359,93 @@ void paste(){ TODO; } void search(){ - TODO; + echo(); + unsigned long i; + for (i = 0; i < terminal_width -1; i++) { + mvwaddch(win_b, 0, i, ' '); + } + mvwaddch(win_b, 0, 0, '/'); + + curs_set(1); + echo(); + + timeout(-1); /* negative numbers block until enter is pressed */ + + unsigned int pass = 0; + char ch; + char err = 0; + + wmove(win_b, 0, 1); + while(1) { + ch = wgetch(win_b); + if (ch == '\n') { + err = 0; + break; + } else if (ch == '\t') { /* tab */ + memcpy(search_buffer + pass, mid_dir.current_file->file_name, strlen(mid_dir.current_file->file_name)); + mvwaddstr(win_b, 0, pass+1, mid_dir.current_file->file_name); + pass += strlen(mid_dir.current_file->file_name); + } else if (ch == 127) { /* backspace */ + if (pass > 0) { + pass--; + mvwdelch(win_b, 0, pass+1); + } + } else if (ch == 27) { /* esc key */ + err = 1; + break; + } + if (ch) { + mvwaddch(win_b, 0, pass+1, ch); + search_buffer[pass] = ch; + pass++; + + unsigned long index = (mid_dir.current_file - mid_dir.file_list); + unsigned long x = getmaxx(win_b); + for (; &mid_dir.file_list[index] < mid_dir.file_list + mid_dir.file_count; index++) { + if (strstr(mid_dir.file_list[index].file_name, search_buffer)) { + mid_dir.current_file = &mid_dir.file_list[index]; + + /* re-render current dir */ + pthread_mutex_lock(&mutex_render); + + werase(win_m); + print_dir(win_m, 1, &mid_dir); + + wnoutrefresh(win_m); + pthread_mutex_unlock(&mutex_render); + break; + } + } + + } + } + search_buffer[pass] = '\0'; + + noecho(); + curs_set(0); + + status |= (STATUS_RUN_BACKEND); + } void search_next(){ - TODO; + long index = (mid_dir.current_file - mid_dir.file_list) + 1; + for (; &mid_dir.file_list[index] < mid_dir.file_list + mid_dir.file_count; index++) { + if (strstr(mid_dir.file_list[index].file_name, search_buffer)) { + mid_dir.current_file = &mid_dir.file_list[index]; + break; + } + } + status |= (STATUS_RUN_BACKEND); } void search_previous(){ - TODO; + long index = (mid_dir.current_file - mid_dir.file_list) - 1; + for (; &mid_dir.file_list[index] >= mid_dir.file_list; index--) { + if (strstr(mid_dir.file_list[index].file_name, search_buffer)) { + mid_dir.current_file = &mid_dir.file_list[index]; + break; + } + } + status |= (STATUS_RUN_BACKEND); } void jmp_file_index(){ TODO;