/* Gets a single key sequence */ static int import_keyseq (struct tlist *list, struct kui_map_set *map) { int ret; static char *term_buffer = (char *)NULL; static char *buffer = (char *)NULL; char *env; if (term_buffer == 0) { term_buffer = (char *)malloc(4080); buffer = (char *)malloc(4080); } env = getenv("TERM"); if (!env) return -1; ret = tgetent (term_buffer, env); if (ret == 0) return -1; else if (ret == -1) return -1; /* Set up the termcap seq */ list->tname_seq = tgetstr (list->tname, &buffer); if (list->tname_seq == 0) { /*fprintf ( stderr, "CAPNAME (%s) is not present in this TERM's termcap description\n", i->tname);*/ } else if (list->tname_seq == (char*)-1 ) { /* fprintf ( stderr, "CAPNAME (%s) is not a termcap string capability\n", i->tname); */ } else { const char *keycode; keycode = kui_term_get_keycode_from_cgdb_key (list->key); ret = kui_ms_register_map (map, list->tname_seq, keycode); if (ret == -1) return -1; } /* Set up the terminfo seq */ list->tiname_seq = tigetstr(list->tiname); if (list->tiname_seq == 0) { /* fprintf ( stderr, "CAPNAME (%s) is not present in this TERM's terminfo description\n", i->tiname);*/ } else if (list->tiname_seq == (char*)-1){ /* fprintf ( stderr, "CAPNAME (%s) is not a terminfo string capability\n", i->tiname); */ } else { const char *keycode; keycode = kui_term_get_keycode_from_cgdb_key (list->key); ret = kui_ms_register_map (map, list->tiname_seq, keycode); if (ret == -1 ) return -1; } return 0; }
/** * Capture a regular expression from the user, one key at a time. * This modifies the global variables regex_cur and regex_last. * * \param sview * The source viewer. * * \return * 0 if user gave a regex, otherwise 1. */ static int status_bar_regex_input(struct sviewer *sview, int key) { int regex_icase = cgdbrc_get(CGDBRC_IGNORECASE)->variant.int_val; /* Flag to indicate we're done with regex mode, need to switch back */ int done = 0; /* Recieve a regex from the user. */ switch (key) { case '\r': case '\n': case CGDB_KEY_CTRL_M: /* Save for future searches via 'n' or 'N' */ if (regex_last != NULL) { ibuf_free(regex_last); } regex_last = ibuf_dup(regex_cur); regex_direction_last = regex_direction_cur; source_search_regex(sview, ibuf_get(regex_last), 2, regex_direction_last, regex_icase); if_draw(); done = 1; break; case 8: case 127: /* Backspace or DEL key */ if (ibuf_length(regex_cur) == 0) { done = 1; } else { ibuf_delchar(regex_cur); source_search_regex(sview, ibuf_get(regex_cur), 1, regex_direction_cur, regex_icase); if_draw(); update_status_win(); } break; default: if (kui_term_is_cgdb_key(key)) { const char *keycode = kui_term_get_keycode_from_cgdb_key(key); int length = strlen(keycode), i; for (i = 0; i < length; i++) ibuf_addchar(regex_cur, keycode[i]); } else { ibuf_addchar(regex_cur, key); } source_search_regex(sview, ibuf_get(regex_cur), 1, regex_direction_cur, regex_icase); if_draw(); update_status_win(); }; if (done) { ibuf_free(regex_cur); regex_cur = NULL; if_set_focus(CGDB); } return 0; }
/** * This adds key bindings that many terminals use. * * @return * 0 on success, or -1 on error */ static int add_keybindings (struct kui_map_set *map) { int i, val; const char *keycode; for (i = 0; hard_coded_bindings[i].key != CGDB_KEY_ERROR; ++i) { keycode = kui_term_get_keycode_from_cgdb_key (hard_coded_bindings[i].key); val = kui_ms_register_map (map, hard_coded_bindings[i].key_seq, keycode); if (val == -1) return -1; } return 0; }
static int status_bar_normal_input(int key) { /* Flag to indicate we're done with status mode, need to switch back */ int done = 0; /* The goal of this state is to recieve a command from the user. */ switch (key) { case '\r': case '\n': case CGDB_KEY_CTRL_M: /* Found a command */ if_run_command(src_win, cur_sbc); done = 1; break; case 8: case 127: /* Backspace or DEL key */ if (ibuf_length(cur_sbc) == 0) { done = 1; } else { ibuf_delchar(cur_sbc); update_status_win(); } break; default: if (kui_term_is_cgdb_key(key)) { const char *keycode = kui_term_get_keycode_from_cgdb_key(key); int length = strlen(keycode), i; for (i = 0; i < length; i++) ibuf_addchar(cur_sbc, keycode[i]); } else { ibuf_addchar(cur_sbc, key); } update_status_win(); break; }; if (done) { ibuf_free(cur_sbc); cur_sbc = NULL; if_set_focus(CGDB); } return 0; }
int kui_manager_get_terminal_keys_kui_map(struct kui_manager *kuim, enum cgdb_key key, std_list kui_map_set) { struct kui_map_set *map_set; struct kuictx *terminalkeys; std_list map_sets; std_list_iterator iter, kui_map_set_iter; void *data; const char *keycode_str; if (!kuim) return -1; keycode_str = kui_term_get_keycode_from_cgdb_key(key); if (keycode_str == NULL) return -1; /* The first map set in the terminal_keys */ terminalkeys = kuim->terminal_keys; map_sets = kui_get_map_sets(terminalkeys); if (std_list_length(map_sets) > 0) { iter = std_list_begin(map_sets); if (std_list_get_data(iter, &data) == -1) { return -1; } map_set = (struct kui_map_set *) data; } /* At this point, the kui_map_set is available * Add each kui_map_set into it. */ for (kui_map_set_iter = std_list_begin(kui_map_set); kui_map_set_iter != std_list_end(kui_map_set); kui_map_set_iter = std_list_next(kui_map_set_iter)) { if (std_list_get_data(kui_map_set_iter, &data) == -1) return -1; kui_ms_register_map(map_set, data, keycode_str); } return 0; }
/** * Capture a regular expression from the user, one key at a time. * This modifies the global variables regex_cur and regex_last. * * \param sview * The source viewer. * * \return * 0 if user gave a regex, otherwise 1. */ static int gdb_input_regex_input(struct scroller *scr, int key) { int regex_icase = cgdbrc_get_int(CGDBRC_IGNORECASE); /* Flag to indicate we're done with regex mode, need to switch back */ int done = 0; /* Receive a regex from the user. */ switch (key) { case '\r': case '\n': case CGDB_KEY_CTRL_M: /* Save for future searches via 'n' or 'N' */ ibuf_free(regex_last); regex_last = ibuf_dup(regex_cur); regex_direction_last = regex_direction_cur; scr_search_regex(scr, ibuf_get(regex_last), 2, regex_direction_last, regex_icase); if_draw(); done = 1; break; case 8: case 127: /* Backspace or DEL key */ if (ibuf_length(regex_cur) == 0) { done = 1; scr_search_regex(scr, "", 2, regex_direction_cur, regex_icase); } else { ibuf_delchar(regex_cur); scr_search_regex(scr, ibuf_get(regex_cur), 1, regex_direction_cur, regex_icase); if_draw(); update_status_win(WIN_REFRESH); } break; default: if (kui_term_is_cgdb_key(key)) { const char *keycode = kui_term_get_keycode_from_cgdb_key(key); int length = strlen(keycode), i; for (i = 0; i < length; i++) ibuf_addchar(regex_cur, keycode[i]); } else { ibuf_addchar(regex_cur, key); } scr_search_regex(scr, ibuf_get(regex_cur), 1, regex_direction_cur, regex_icase); if_draw(); update_status_win(WIN_REFRESH); }; if (done) { gdb_scroller->in_search_mode = 0; ibuf_free(regex_cur); regex_cur = NULL; sbc_kind = SBC_NORMAL; if_set_focus(GDB); } return 0; }