void keybind_cmd_bind (GArray * keymap, const char *keybind, long action) { char *caption = NULL; long key; key = lookup_key (keybind, &caption); keymap_add (keymap, key, action, caption); g_free (caption); }
static enum parser_error parse_prefs_c(struct parser *p) { int mode; struct keypress tmp[2]; struct prefs_data *d = parser_priv(p); assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; mode = parser_getint(p, "mode"); if (mode < 0 || mode >= KEYMAP_MODE_MAX) return PARSE_ERROR_OUT_OF_BOUNDS; keypress_from_text(tmp, N_ELEMENTS(tmp), parser_getstr(p, "key")); if (tmp[0].type != EVT_KBRD || tmp[1].type != EVT_NONE) return PARSE_ERROR_FIELD_TOO_LONG; keymap_add(mode, tmp[0], d->keymap_buffer); return PARSE_ERROR_NONE; }
/* label <number> <command> <label> */ static gboolean cmd_label(config_t *cfg, int argc, char *argv[]) { const name_map_t *cmd = command_names; const char *command, *label; int fn; if (argc != 4) { snprintf(error_msg, sizeof(error_msg), _("%s: Syntax: %s <n> <command> <label>"), argv[0], argv[0]); return FALSE; } fn = strtol(argv[1], NULL, 0); command = argv[2]; label = argv[3]; while (cmd->name && strcasecmp(cmd->name, command) != 0) cmd++; if (!cmd->name) { snprintf(error_msg, sizeof(error_msg), _("%s: Unknown command: `%s'"), argv[0], command); return FALSE; } if (fn < 1 || fn > 10) { snprintf(error_msg, sizeof(error_msg), _("%s: fn should be 1-10"), argv[0]); return FALSE; } keymap_add(cfg->keymap, KEY_F(fn), cmd->val); cfg->labels[fn - 1] = g_strdup(label); return TRUE; }
static void ui_keymap_create(const char *title, int row) { bool done = false; size_t n = 0; struct keypress c; char tmp[1024]; int mode = OPT(rogue_like_commands) ? KEYMAP_MODE_ROGUE : KEYMAP_MODE_ORIG; prt(title, 13, 0); prt("Key: ", 14, 0); c = keymap_get_trigger(); if (c.code == '$') { c_prt(COLOUR_L_RED, "The '$' key is reserved.", 16, 2); prt("Press any key to continue.", 18, 0); inkey(); return; } /* Get an encoded action, with a default response */ while (!done) { struct keypress kp = {EVT_NONE, 0, 0}; int color = COLOUR_WHITE; if (n == 0) color = COLOUR_YELLOW; if (n == KEYMAP_ACTION_MAX) color = COLOUR_L_RED; keypress_to_text(tmp, sizeof(tmp), keymap_buffer, false); c_prt(color, format("Action: %s", tmp), 15, 0); c_prt(COLOUR_L_BLUE, " Press '$' when finished.", 17, 0); c_prt(COLOUR_L_BLUE, " Use 'CTRL-U' to reset.", 18, 0); c_prt(COLOUR_L_BLUE, format("(Maximum keymap length is %d keys.)", KEYMAP_ACTION_MAX), 19, 0); kp = inkey(); if (kp.code == '$') { done = true; continue; } switch (kp.code) { case KC_DELETE: case KC_BACKSPACE: { if (n > 0) { n -= 1; keymap_buffer[n].type = 0; keymap_buffer[n].code = 0; keymap_buffer[n].mods = 0; } break; } case KTRL('U'): { memset(keymap_buffer, 0, sizeof keymap_buffer); n = 0; break; } default: { if (n == KEYMAP_ACTION_MAX) continue; if (n == 0) { memset(keymap_buffer, 0, sizeof keymap_buffer); } keymap_buffer[n++] = kp; break; } } } if (c.code && get_check("Save this keymap? ")) { keymap_add(mode, c, keymap_buffer, true); prt("Keymap added. Press any key to continue.", 17, 0); inkey(); } }
/* bind <key> <command> */ static gboolean cmd_bind(config_t *cfg, int argc, char *argv[]) { char *keyname, *command; const name_map_t *key = key_names; const name_map_t *cmd = command_names; int mod = 0, k = -1, m = 0; if (argc != 3) { snprintf(error_msg, sizeof(error_msg), _("bind: Wrong argument number, bind <key> <command>")); return FALSE; } keyname = argv[1]; command = argv[2]; while (*keyname) { switch (*keyname++) { case 'C': m = KEY_M_CTRL; continue; case 'M': case 'A': m = KEY_M_ALT; continue; case 'S': m = KEY_M_SHIFT; continue; case '-': if (!m) { /* incorrect key */ snprintf(error_msg, sizeof(error_msg), _("bind: Bad key value `%s'"), keyname); return FALSE; } mod |= m; m = 0; continue; } keyname--; break; } /* no key */ if (keyname[0] == '\0') { snprintf(error_msg, sizeof(error_msg), _("bind: Ehh...no key?")); return FALSE; } /* ordinary key */ if (keyname[1] == '\0') { k = keyname[0]; } else { while (key->name && strcasecmp(key->name, keyname) != 0) key++; } if (k < 0 && !key->name) { snprintf(error_msg, sizeof(error_msg), _("bind: Unknown key: `%s'"), keyname); return FALSE; } while (cmd->name && strcasecmp(cmd->name, command) != 0) cmd++; if (!cmd->name) { snprintf(error_msg, sizeof(error_msg), _("bind: Unknown command: `%s'"), command); return FALSE; } if (mod & KEY_M_CTRL) { if (k < 256) k = XCTRL(k); else k |= KEY_M_CTRL; } if (mod & KEY_M_ALT) k |= KEY_M_ALT; if (mod & KEY_M_SHIFT) k |= KEY_M_SHIFT; if (!strcasecmp("bind-ext", argv[0])) keymap_add(cfg->ext_keymap, k, cmd->val); else keymap_add(cfg->keymap, k, cmd->val); return TRUE; }
void keybind_cmd_bind(GArray *keymap, char *keybind, int action) { keymap_add(keymap, lookup_key(keybind), action); }