#include #include #include #include #include #include "Globals.h" #include "Terminal.h" #include "Input.h" int matches(const char *s) { if (input_len == 0) return 1; const char *p = s; if (opts.insensitive) { while (*p) { if (strncasecmp(p, input, input_len) == 0) return 1; p++; } } else { while (*p) { if (strncmp(p, input, input_len) == 0) return 1; p++; } } return 0; } void filter_items(void) { filtered.count = 0; for (size_t i = 0; i < all_items.count; i++) { if (matches(all_items.items[i])) { if (filtered.count >= filtered.capacity) { size_t new_cap = filtered.capacity == 0 ? INITIAL_CAPACITY : filtered.capacity * 2; filtered.items = realloc(filtered.items, new_cap * sizeof(char *)); filtered.capacity = new_cap; } filtered.items[filtered.count++] = all_items.items[i]; } } if ((size_t)cursor >= filtered.count) cursor = filtered.count > 0 ? (int)filtered.count - 1 : 0; if (scroll > cursor) scroll = cursor; if (scroll < cursor - DEFAULT_LINES + 1) scroll = cursor - DEFAULT_LINES + 1; if (scroll < 0) scroll = 0; needs_redraw = 1; } void handle_input(void) { char c; if (read(tty_fd, &c, 1) <= 0) return; if (c == 27) { char seq[3]; ssize_t n = read(tty_fd, &seq[0], 1); if (n > 0 && seq[0] == '[') { if (read(tty_fd, &seq[1], 1) > 0) { switch (seq[1]) { case 'A': if (cursor > 0) cursor--; break; case 'B': if (cursor < (int)filtered.count - 1) cursor++; break; case 'H': case 'F': cursor = 0; break; case 'G': cursor = filtered.count > 0 ? filtered.count - 1 : 0; break; case '5': case '6': if (read(tty_fd, &seq[2], 1) > 0 && seq[2] == '~') { int jump = DEFAULT_LINES; if (seq[1] == '5') { cursor -= jump; if (cursor < 0) cursor = 0; } else { cursor += jump; if (cursor >= (int)filtered.count) cursor = filtered.count > 0 ? (int)filtered.count - 1 : 0; } } break; } } } else { exit(1); } if (cursor < scroll) scroll = cursor; if (cursor > scroll + DEFAULT_LINES - 1) scroll = cursor - DEFAULT_LINES + 1; needs_redraw = 1; } else if (c == 127 || c == 8) { if (input_len > 0) input[--input_len] = '\0'; filter_items(); } else if (c == '\n' || c == '\r') { if (filtered.count > 0) { dprintf(tty_out_fd, "\033[?1049l\033[2J\033[?25h\033[0m"); dprintf(orig_stdout, "%s\n", filtered.items[cursor]); exit(0); } } else if (c == 4) { exit(1); } else if (c >= 32 && c < 127) { if ((int)input_len + 2 > (int)input_capacity) { size_t new_cap = input_capacity == 0 ? INITIAL_CAPACITY : input_capacity * 2; input = realloc(input, new_cap); memset(input + input_capacity, 0, new_cap - input_capacity); input_capacity = new_cap; } input[input_len++] = c; input[input_len] = '\0'; filter_items(); } }