/* capture_regex: Captures a regular expression from the user. * --------------- * Side Effect: * * regex_line: The regex the user has entered. * regex_line_pos: The next available index into regex_line. * * Return Value: 0 if user gave a regex, otherwise 1. */ static int capture_regex(struct filedlg *fd) { int c; extern struct kui_manager *kui_ctx; /* Initialize the function for finding a regex and tell user */ regex_search = 1; regex_line_pos = 0; regex_line[regex_line_pos] = '\0'; filedlg_display(fd); do { c = kui_manager_getkey_blocking(kui_ctx); if (regex_line_pos == (MAX_LINE - 1) && !(c == CGDB_KEY_ESC || c == 8 || c == 127)) continue; /* Quit the search if the user hit escape */ if (c == CGDB_KEY_ESC) { regex_line_pos = 0; regex_line[regex_line_pos] = '\0'; regex_search = 0; filedlg_search_regex(fd, regex_line, 2, regex_direction, 1); filedlg_display(fd); return 1; } /* If the user hit enter, then a successful regex has been recieved */ if (c == '\r' || c == '\n' || c == CGDB_KEY_CTRL_M) { regex_line[regex_line_pos] = '\0'; break; } /* If the user hit backspace or delete remove a char */ if (CGDB_BACKSPACE_KEY(c)) { if (regex_line_pos > 0) --regex_line_pos; regex_line[regex_line_pos] = '\0'; filedlg_search_regex(fd, regex_line, 1, regex_direction, 1); filedlg_display(fd); continue; } /* Add a char, search and draw */ regex_line[regex_line_pos++] = c; regex_line[regex_line_pos] = '\0'; filedlg_search_regex(fd, regex_line, 1, regex_direction, 1); filedlg_display(fd); } while (1); /* Finished */ regex_search = 0; filedlg_search_regex(fd, regex_line, 2, regex_direction, 1); filedlg_display(fd); return 0; }
/* if_draw: Draws the interface on the screen. * -------- */ void if_draw(void) { /* Only redisplay the filedlg if it is up */ if (focus == FILE_DLG) { filedlg_display(fd); return; } update_status_win(); if (get_src_height() != 0 && get_gdb_height() != 0) wrefresh(status_win); if (tty_win_on) wrefresh(tty_status_win); if (get_src_height() > 0) source_display(src_win, focus == CGDB); if (tty_win_on && get_tty_height() > 0) scr_refresh(tty_win, focus == TTY); if (get_gdb_height() > 0) scr_refresh(gdb_win, focus == GDB); /* This check is here so that the cursor goes to the * cgdb window. The cursor would stay in the gdb window * on cygwin */ if (get_src_height() > 0 && focus == CGDB) wrefresh(src_win->win); }
/* if_draw: Draws the interface on the screen. * -------- */ void if_draw(void) { if (!curses_initialized) return; /* Only redisplay the filedlg if it is up */ if (focus == FILE_DLG) { filedlg_display(fd); return; } update_status_win(WIN_NO_REFRESH); if (get_src_height() != 0 && get_gdb_height() != 0) swin_wnoutrefresh(status_win); if (get_src_height() > 0) source_display(src_viewer, focus == CGDB, WIN_NO_REFRESH); separator_display(cur_split_orientation == WSO_VERTICAL); if (get_gdb_height() > 0) scr_refresh(gdb_scroller, focus == GDB, WIN_NO_REFRESH); /* This check is here so that the cursor goes to the * cgdb window. The cursor would stay in the gdb window * on cygwin */ if (get_src_height() > 0 && focus == CGDB) swin_wnoutrefresh(src_viewer->win); swin_doupdate(); }
int filedlg_recv_char(struct filedlg *fd, int key, char *file) { int height, width; /* Initialize size variables */ getmaxyx(fd->win, height, width); filedlg_display(fd); switch (key) { case 'q': return -1; /* Vertical scrolling */ case CGDB_KEY_DOWN: case 'j': filedlg_vscroll(fd, 1); break; case CGDB_KEY_NPAGE: case CGDB_KEY_CTRL_F: /* VI-style page down */ filedlg_vscroll(fd, height - 1); break; case CGDB_KEY_UP: case 'k': filedlg_vscroll(fd, -1); break; case CGDB_KEY_PPAGE: case CGDB_KEY_CTRL_B: /* VI-style page up */ filedlg_vscroll(fd, -(height - 1)); break; /* Horizontal scrolling */ case CGDB_KEY_RIGHT: case 'l': filedlg_hscroll(fd, 1); break; case CGDB_KEY_LEFT: case 'h': filedlg_hscroll(fd, -1); break; case '/': case '?': regex_direction = ('/' == key); /* Capturing regular expressions */ filedlg_search_regex_init(fd); capture_regex(fd); break; case 'n': filedlg_search_regex(fd, regex_line, 2, regex_direction, 1); break; case 'N': filedlg_search_regex(fd, regex_line, 2, !regex_direction, 1); break; /* User selected a file */ case '\n': case '\r': case CGDB_KEY_CTRL_M: strcpy(file, fd->buf->files[fd->buf->sel_line]); return 1; default: break; } filedlg_display(fd); return 0; }
int filedlg_recv_char(struct filedlg *fd, int key, char *file, int last_key_pressed) { /* Initialize size variables */ int height = swin_getmaxy(fd->win); filedlg_display(fd); switch (key) { case 'q': return -1; /* Vertical scrolling */ case CGDB_KEY_DOWN: case 'j': filedlg_vscroll(fd, 1); break; case CGDB_KEY_NPAGE: case CGDB_KEY_CTRL_F: /* VI-style page down */ filedlg_vscroll(fd, height - 1); break; case CGDB_KEY_CTRL_D: /* VI-style 1/2 page down */ filedlg_vscroll(fd, height / 2); break; case CGDB_KEY_CTRL_U: /* VI-style 1/2 page up */ filedlg_vscroll(fd, -height / 2); break; case CGDB_KEY_UP: case 'k': filedlg_vscroll(fd, -1); break; case CGDB_KEY_PPAGE: case CGDB_KEY_CTRL_B: /* VI-style page up */ filedlg_vscroll(fd, -(height - 1)); break; /* Horizontal scrolling */ case CGDB_KEY_RIGHT: case 'l': filedlg_hscroll(fd, 1); break; case CGDB_KEY_LEFT: case 'h': filedlg_hscroll(fd, -1); break; case '/': case '?': regex_direction = ('/' == key); /* Capturing regular expressions */ filedlg_search_regex_init(fd); capture_regex(fd); break; case 'n': filedlg_search_regex(fd, regex_line, 2, regex_direction, 1); break; case 'N': filedlg_search_regex(fd, regex_line, 2, !regex_direction, 1); break; /* User selected a file */ case '\n': case '\r': case CGDB_KEY_CTRL_M: strcpy(file, fd->buf->files[fd->buf->sel_line]); return 1; case 'g': /* beginning of file */ if (last_key_pressed == 'g') filedlg_set_sel_line(fd, 0); break; case 'G': { /* end of file, or a line number*/ int lineno = -1, result; result = cgdb_string_to_int(ibuf_get(fd->G_line_number), &lineno); if (result == 0) { filedlg_set_sel_line(fd, lineno -1); } break; } default: break; } /* Store digits into G_line_number for 'G' command. */ if (key >= '0' && key <= '9') { ibuf_addchar(fd->G_line_number, key); } else { ibuf_clear(fd->G_line_number); } filedlg_display(fd); return 0; }