示例#1
0
文件: kui_term.c 项目: rsenn/cgdb
/* 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;
}
示例#2
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;
}
示例#3
0
文件: kui_term.c 项目: rsenn/cgdb
/** 
 * 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;
}
示例#4
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;
}
示例#5
0
文件: kui.c 项目: ArnaudValensi/cgdb
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;
}
示例#6
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;
}