/* Convert a key code into string format, with prefix if necessary. */ const char * key_string_lookup_key(int key) { static char tmp[24], tmp2[24]; const char *s; u_int i; if (key == 127) return (NULL); if (key & KEYC_ESCAPE) { if ((s = key_string_lookup_key(key & ~KEYC_ESCAPE)) == NULL) return (NULL); xsnprintf(tmp2, sizeof tmp2, "M-%s", s); return (tmp2); } if (key & KEYC_CTRL) { if ((s = key_string_lookup_key(key & ~KEYC_CTRL)) == NULL) return (NULL); xsnprintf(tmp2, sizeof tmp2, "C-%s", s); return (tmp2); } if (key & KEYC_SHIFT) { if ((s = key_string_lookup_key(key & ~KEYC_SHIFT)) == NULL) return (NULL); xsnprintf(tmp2, sizeof tmp2, "S-%s", s); return (tmp2); } for (i = 0; i < nitems(key_string_table); i++) { if (key == key_string_table[i].key) return (key_string_table[i].string); } if (key >= 32 && key <= 255) { tmp[0] = (char) key; tmp[1] = '\0'; return (tmp); } if (key >= 0 && key <= 32) { if (key == 0 || key > 26) xsnprintf(tmp, sizeof tmp, "C-%c", 64 + key); else xsnprintf(tmp, sizeof tmp, "C-%c", 96 + key); return (tmp); } return (NULL); }
size_t cmd_bind_key_print(struct cmd *self, char *buf, size_t len) { struct cmd_bind_key_data *data = self->data; size_t off = 0; const char *skey; off += xsnprintf(buf, len, "%s", self->entry->name); if (data == NULL) return (off); if (off < len && data->command_key) off += xsnprintf(buf + off, len - off, " -c"); if (off < len && !(data->key & KEYC_PREFIX)) off += xsnprintf(buf + off, len - off, " -n"); if (off < len && data->can_repeat) off += xsnprintf(buf + off, len - off, " -r"); if (off < len && data->tablename != NULL) off += cmd_prarg(buf + off, len - off, " -t ", data->tablename); if (off < len) { skey = key_string_lookup_key(data->key & ~KEYC_PREFIX); off += xsnprintf(buf + off, len - off, " %s ", skey); } if (off < len) off += cmd_list_print(data->cmdlist, buf + off, len - off); return (off); }
void tty_keys_add(struct tty *tty, const char *s, int key) { struct tty_key *tk; size_t size; const char *keystr; keystr = key_string_lookup_key(key); if ((tk = tty_keys_find(tty, s, strlen(s), &size)) == NULL) { log_debug("new key %s: 0x%x (%s)", s, key, keystr); tty_keys_add1(&tty->key_tree, s, key); } else { log_debug("replacing key %s: 0x%x (%s)", s, key, keystr); tk->key = key; } }
const char * cmd_set_option_print( const struct set_option_entry *entry, struct options_entry *o) { static char out[BUFSIZ]; const char *s; struct keylist *keylist; u_int i; *out = '\0'; switch (entry->type) { case SET_OPTION_STRING: xsnprintf(out, sizeof out, "\"%s\"", o->str); break; case SET_OPTION_NUMBER: xsnprintf(out, sizeof out, "%lld", o->num); break; case SET_OPTION_KEYS: keylist = o->data; for (i = 0; i < ARRAY_LENGTH(keylist); i++) { strlcat(out, key_string_lookup_key( ARRAY_ITEM(keylist, i)), sizeof out); if (i != ARRAY_LENGTH(keylist) - 1) strlcat(out, ",", sizeof out); } break; case SET_OPTION_COLOUR: s = colour_tostring(o->num); xsnprintf(out, sizeof out, "%s", s); break; case SET_OPTION_ATTRIBUTES: s = attributes_tostring(o->num); xsnprintf(out, sizeof out, "%s", s); break; case SET_OPTION_FLAG: if (o->num) strlcpy(out, "on", sizeof out); else strlcpy(out, "off", sizeof out); break; case SET_OPTION_CHOICE: s = entry->choices[o->num]; xsnprintf(out, sizeof out, "%s", s); break; } return (out); }
/* Print an option using its type from the table. */ const char * options_table_print_entry(const struct options_table_entry *oe, struct options_entry *o, int no_quotes) { static char out[BUFSIZ]; const char *s; *out = '\0'; switch (oe->type) { case OPTIONS_TABLE_STRING: if (no_quotes) xsnprintf(out, sizeof out, "%s", o->str); else xsnprintf(out, sizeof out, "\"%s\"", o->str); break; case OPTIONS_TABLE_NUMBER: xsnprintf(out, sizeof out, "%lld", o->num); break; case OPTIONS_TABLE_KEY: xsnprintf(out, sizeof out, "%s", key_string_lookup_key(o->num)); break; case OPTIONS_TABLE_COLOUR: s = colour_tostring(o->num); xsnprintf(out, sizeof out, "%s", s); break; case OPTIONS_TABLE_ATTRIBUTES: s = attributes_tostring(o->num); xsnprintf(out, sizeof out, "%s", s); break; case OPTIONS_TABLE_FLAG: if (o->num) strlcpy(out, "on", sizeof out); else strlcpy(out, "off", sizeof out); break; case OPTIONS_TABLE_CHOICE: s = oe->choices[o->num]; xsnprintf(out, sizeof out, "%s", s); break; case OPTIONS_TABLE_STYLE: s = style_tostring(&o->style); xsnprintf(out, sizeof out, "%s", s); break; } return (out); }
size_t cmd_send_keys_print(struct cmd *self, char *buf, size_t len) { struct cmd_send_keys_data *data = self->data; size_t off = 0; u_int i; off += xsnprintf(buf, len, "%s", self->entry->name); if (data == NULL) return (off); if (off < len && data->target != NULL) off += cmd_prarg(buf + off, len - off, " -t ", data->target); for (i = 0; i < data->nkeys; i++) { if (off >= len) break; off += xsnprintf(buf + off, len - off, " %s", key_string_lookup_key(data->keys[i])); } return (off); }
/* Translate a key code into an output key sequence. */ void input_key(struct window_pane *wp, key_code key, struct mouse_event *m) { const struct input_key_ent *ike; u_int i; size_t dlen; char *out; key_code justkey; struct utf8_data ud; log_debug("writing key 0x%llx (%s) to %%%u", key, key_string_lookup_key(key), wp->id); /* If this is a mouse key, pass off to mouse function. */ if (KEYC_IS_MOUSE(key)) { if (m != NULL && m->wp != -1 && (u_int)m->wp == wp->id) input_key_mouse(wp, m); return; } /* * If this is a normal 7-bit key, just send it, with a leading escape * if necessary. If it is a UTF-8 key, split it and send it. */ justkey = (key & ~KEYC_ESCAPE); if (justkey <= 0x7f) { if (key & KEYC_ESCAPE) bufferevent_write(wp->event, "\033", 1); ud.data[0] = justkey; bufferevent_write(wp->event, &ud.data[0], 1); return; } if (justkey > 0x7f && justkey < KEYC_BASE) { if (utf8_split(justkey, &ud) != UTF8_DONE) return; if (key & KEYC_ESCAPE) bufferevent_write(wp->event, "\033", 1); bufferevent_write(wp->event, ud.data, ud.size); return; } /* * Then try to look this up as an xterm key, if the flag to output them * is set. */ if (options_get_number(wp->window->options, "xterm-keys")) { if ((out = xterm_keys_lookup(key)) != NULL) { bufferevent_write(wp->event, out, strlen(out)); free(out); return; } } /* Otherwise look the key up in the table. */ for (i = 0; i < nitems(input_keys); i++) { ike = &input_keys[i]; if ((ike->flags & INPUTKEY_KEYPAD) && !(wp->screen->mode & MODE_KKEYPAD)) continue; if ((ike->flags & INPUTKEY_CURSOR) && !(wp->screen->mode & MODE_KCURSOR)) continue; if ((key & KEYC_ESCAPE) && (ike->key | KEYC_ESCAPE) == key) break; if (ike->key == key) break; } if (i == nitems(input_keys)) { log_debug("key 0x%llx missing", key); return; } dlen = strlen(ike->data); log_debug("found key 0x%llx: \"%s\"", key, ike->data); /* Prefix a \033 for escape. */ if (key & KEYC_ESCAPE) bufferevent_write(wp->event, "\033", 1); bufferevent_write(wp->event, ike->data, dlen); }
int cmd_show_options_exec(struct cmd *self, struct cmd_ctx *ctx) { struct cmd_target_data *data = self->data; struct session *s; struct options *oo; const struct set_option_entry *entry; u_int i; char *vs; long long vn; if (data->flags & CMD_GFLAG) oo = &global_options; else { if ((s = cmd_find_session(ctx, data->target)) == NULL) return (-1); oo = &s->options; } for (i = 0; i < NSETOPTION; i++) { entry = &set_option_table[i]; if (options_find1(oo, entry->name) == NULL) continue; switch (entry->type) { case SET_OPTION_STRING: vs = options_get_string(oo, entry->name); ctx->print(ctx, "%s \"%s\"", entry->name, vs); break; case SET_OPTION_NUMBER: vn = options_get_number(oo, entry->name); ctx->print(ctx, "%s %lld", entry->name, vn); break; case SET_OPTION_KEY: vn = options_get_number(oo, entry->name); ctx->print(ctx, "%s %s", entry->name, key_string_lookup_key(vn)); break; case SET_OPTION_COLOUR: vn = options_get_number(oo, entry->name); ctx->print(ctx, "%s %s", entry->name, colour_tostring(vn)); break; case SET_OPTION_ATTRIBUTES: vn = options_get_number(oo, entry->name); ctx->print(ctx, "%s %s", entry->name, attributes_tostring(vn)); break; case SET_OPTION_FLAG: vn = options_get_number(oo, entry->name); if (vn) ctx->print(ctx, "%s on", entry->name); else ctx->print(ctx, "%s off", entry->name); break; case SET_OPTION_CHOICE: vn = options_get_number(oo, entry->name); ctx->print(ctx, "%s %s", entry->name, entry->choices[vn]); break; } } return (0); }
/* Translate a key code into an output key sequence. */ void input_key(struct window_pane *wp, int key, struct mouse_event *m) { const struct input_key_ent *ike; u_int i; size_t dlen; char *out; u_char ch; log_debug("writing key 0x%x (%s)", key, key_string_lookup_key(key)); /* If this is a mouse key, pass off to mouse function. */ if (KEYC_IS_MOUSE(key)) { if (m != NULL && m->wp != -1 && (u_int)m->wp == wp->id) input_key_mouse(wp, m); return; } /* * If this is a normal 7-bit key, just send it, with a leading escape * if necessary. */ if (key != KEYC_NONE && (key & ~KEYC_ESCAPE) < 0x100) { if (key & KEYC_ESCAPE) bufferevent_write(wp->event, "\033", 1); ch = key & ~KEYC_ESCAPE; bufferevent_write(wp->event, &ch, 1); return; } /* * Then try to look this up as an xterm key, if the flag to output them * is set. */ if (options_get_number(&wp->window->options, "xterm-keys")) { if ((out = xterm_keys_lookup(key)) != NULL) { bufferevent_write(wp->event, out, strlen(out)); free(out); return; } } /* Otherwise look the key up in the table. */ for (i = 0; i < nitems(input_keys); i++) { ike = &input_keys[i]; if ((ike->flags & INPUTKEY_KEYPAD) && !(wp->screen->mode & MODE_KKEYPAD)) continue; if ((ike->flags & INPUTKEY_CURSOR) && !(wp->screen->mode & MODE_KCURSOR)) continue; if ((key & KEYC_ESCAPE) && (ike->key | KEYC_ESCAPE) == key) break; if (ike->key == key) break; } if (i == nitems(input_keys)) { log_debug("key 0x%x missing", key); return; } dlen = strlen(ike->data); log_debug("found key 0x%x: \"%s\"", key, ike->data); /* Prefix a \033 for escape. */ if (key & KEYC_ESCAPE) bufferevent_write(wp->event, "\033", 1); bufferevent_write(wp->event, ike->data, dlen); }