static void ui_keymap_query(const char *title, int row) { char tmp[1024]; int mode = OPT(rogue_like_commands) ? KEYMAP_MODE_ROGUE : KEYMAP_MODE_ORIG; struct keypress c; const struct keypress *act; prt(title, 13, 0); prt("Key: ", 14, 0); /* Get a keymap trigger & mapping */ c = keymap_get_trigger(); act = keymap_find(mode, c); /* Keymap found? */ if (!act) { /* Prompt */ prt("No keymap with that trigger. Press any key to continue.", 16, 0); inkey(); } else { /* Analyze the current action */ keypress_to_text(tmp, sizeof(tmp), act, false); /* Display the current action */ prt("Found: ", 15, 0); Term_addstr(-1, COLOUR_WHITE, tmp); prt("Press any key to continue.", 17, 0); inkey(); } }
/** * This ugly piece of code exists to figure out what keycodes the user has * been generating. */ static void do_cmd_keylog(void) { int i; char buf[50]; char buf2[12]; struct keypress keys[2] = {{EVT_NONE, 0}, {EVT_NONE, 0}}; screen_save(); prt("Previous keypresses (top most recent):", 0, 0); for (i = 0; i < KEYLOG_SIZE; i++) { if (i < log_size) { /* find the keypress from our log */ int j = (log_i + i) % KEYLOG_SIZE; struct keypress k = keylog[j]; /* ugh. it would be nice if there was a verion of keypress_to_text * which took only one keypress. */ keys[0] = k; keypress_to_text(buf2, sizeof(buf2), keys, TRUE); /* format this line of output */ strnfmt(buf, sizeof(buf), " %-12s (code=%u mods=%u)", buf2, k.code, k.mods); } else { /* create a blank line of output */ strnfmt(buf, sizeof(buf), "%40s", ""); } prt(buf, i + 1, 0); } prt("Press any key to continue.", KEYLOG_SIZE + 1, 0); inkey(); screen_load(); }
static void keymap_browse_hook(int oid, void *db, const region *loc) { char tmp[1024]; event_signal(EVENT_MESSAGE_FLUSH); clear_from(13); /* Show current action */ prt("Current action (if any) shown below:", 13, 0); keypress_to_text(tmp, sizeof(tmp), keymap_buffer, false); prt(tmp, 14, 0); }
static void keymap_browse_hook(int oid, void *db, const region *loc) { char tmp[1024]; message_flush(); clear_from(13); /* Show current action */ prt("Current action (if any) shown below:", 13, 0); keypress_to_text(tmp, sizeof(tmp), keymap_buffer, false); prt(tmp, 14, 0); }
/** * Ask for, and display, a keymap trigger. * * Returns the trigger input. * * Note that both "event_signal(EVENT_INPUT_FLUSH)" calls are extremely * important. This may * no longer be true, since "util.c" is much simpler now. XXX XXX XXX */ static struct keypress keymap_get_trigger(void) { char tmp[80]; struct keypress buf[2] = { KEYPRESS_NULL, KEYPRESS_NULL }; /* Flush */ event_signal(EVENT_INPUT_FLUSH); /* Get a key */ buf[0] = inkey(); /* Convert to ascii */ keypress_to_text(tmp, sizeof(tmp), buf, false); /* Hack -- display the trigger */ Term_addstr(-1, COLOUR_WHITE, tmp); /* Flush */ event_signal(EVENT_INPUT_FLUSH); /* Return trigger */ return buf[0]; }
/* * Ask for, and display, a keymap trigger. * * Returns the trigger input. * * Note that both "flush()" calls are extremely important. This may * no longer be true, since "util.c" is much simpler now. XXX XXX XXX */ static struct keypress keymap_get_trigger(void) { char tmp[80]; struct keypress buf[2] = { { 0 }, { 0 } }; /* Flush */ flush(); /* Get a key */ buf[0] = inkey(); /* Convert to ascii */ keypress_to_text(tmp, sizeof(tmp), buf, false); /* Hack -- display the trigger */ Term_addstr(-1, TERM_WHITE, tmp); /* Flush */ flush(); /* Return trigger */ return buf[0]; }
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(); } }