=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/key-string.c,v retrieving revision 1.52 retrieving revision 1.53 diff -u -r1.52 -r1.53 --- src/usr.bin/tmux/key-string.c 2019/11/14 07:55:01 1.52 +++ src/usr.bin/tmux/key-string.c 2020/02/19 14:25:00 1.53 @@ -1,4 +1,4 @@ -/* $OpenBSD: key-string.c,v 1.52 2019/11/14 07:55:01 nicm Exp $ */ +/* $OpenBSD: key-string.c,v 1.53 2020/02/19 14:25:00 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -242,56 +242,93 @@ const char * key_string_lookup_key(key_code key) { - static char out[32]; - char tmp[8]; - u_int i; - struct utf8_data ud; - size_t off; + static char out[32]; + char tmp[8]; + const char *s; + u_int i; + struct utf8_data ud; + size_t off; *out = '\0'; + /* Literal keys are themselves. */ + if (key & KEYC_LITERAL) { + snprintf(out, sizeof out, "%c", (int)(key & 0xff)); + return (out); + } + + /* Fill in the modifiers. */ + if (key & KEYC_CTRL) + strlcat(out, "C-", sizeof out); + if (key & KEYC_ESCAPE) + strlcat(out, "M-", sizeof out); + if (key & KEYC_SHIFT) + strlcat(out, "S-", sizeof out); + key &= KEYC_MASK_KEY; + /* Handle no key. */ if (key == KEYC_NONE) return ("None"); /* Handle special keys. */ - if (key == KEYC_UNKNOWN) - return ("Unknown"); - if (key == KEYC_ANY) - return ("Any"); - if (key == KEYC_FOCUS_IN) - return ("FocusIn"); - if (key == KEYC_FOCUS_OUT) - return ("FocusOut"); - if (key == KEYC_PASTE_START) - return ("PasteStart"); - if (key == KEYC_PASTE_END) - return ("PasteEnd"); - if (key == KEYC_MOUSE) - return ("Mouse"); - if (key == KEYC_DRAGGING) - return ("Dragging"); - if (key == KEYC_MOUSEMOVE_PANE) - return ("MouseMovePane"); - if (key == KEYC_MOUSEMOVE_STATUS) - return ("MouseMoveStatus"); - if (key == KEYC_MOUSEMOVE_STATUS_LEFT) - return ("MouseMoveStatusLeft"); - if (key == KEYC_MOUSEMOVE_STATUS_RIGHT) - return ("MouseMoveStatusRight"); - if (key == KEYC_MOUSEMOVE_BORDER) - return ("MouseMoveBorder"); + if (key == KEYC_UNKNOWN) { + s = "Unknown"; + goto append; + } + if (key == KEYC_ANY) { + s = "Any"; + goto append; + } + if (key == KEYC_FOCUS_IN) { + s = "FocusIn"; + goto append; + } + if (key == KEYC_FOCUS_OUT) { + s = "FocusOut"; + goto append; + } + if (key == KEYC_PASTE_START) { + s = "PasteStart"; + goto append; + } + if (key == KEYC_PASTE_END) { + s = "PasteEnd"; + goto append; + } + if (key == KEYC_MOUSE) { + s = "Mouse"; + goto append; + } + if (key == KEYC_DRAGGING) { + s = "Dragging"; + goto append; + } + if (key == KEYC_MOUSEMOVE_PANE) { + s = "MouseMovePane"; + goto append; + } + if (key == KEYC_MOUSEMOVE_STATUS) { + s = "MouseMoveStatus"; + goto append; + } + if (key == KEYC_MOUSEMOVE_STATUS_LEFT) { + s = "MouseMoveStatusLeft"; + goto append; + } + if (key == KEYC_MOUSEMOVE_STATUS_RIGHT) { + s = "MouseMoveStatusRight"; + goto append; + } + if (key == KEYC_MOUSEMOVE_BORDER) { + s = "MouseMoveBorder"; + goto append; + } if (key >= KEYC_USER && key < KEYC_USER + KEYC_NUSER) { - snprintf(out, sizeof out, "User%u", (u_int)(key - KEYC_USER)); + snprintf(tmp, sizeof tmp, "User%u", (u_int)(key - KEYC_USER)); + strlcat(out, tmp, sizeof out); return (out); } - /* Literal keys are themselves. */ - if (key & KEYC_LITERAL) { - snprintf(out, sizeof out, "%c", (int)(key & 0xff)); - return (out); - } - /* * Special case: display C-@ as C-Space. Could do this below in * the (key >= 0 && key <= 32), but this way we let it be found @@ -301,15 +338,6 @@ if ((key & KEYC_MASK_KEY) == 0) key = ' ' | KEYC_CTRL | (key & KEYC_MASK_MOD); - /* Fill in the modifiers. */ - if (key & KEYC_CTRL) - strlcat(out, "C-", sizeof out); - if (key & KEYC_ESCAPE) - strlcat(out, "M-", sizeof out); - if (key & KEYC_SHIFT) - strlcat(out, "S-", sizeof out); - key &= KEYC_MASK_KEY; - /* Try the key against the string table. */ for (i = 0; i < nitems(key_string_table); i++) { if (key == key_string_table[i].key) @@ -351,5 +379,9 @@ xsnprintf(tmp, sizeof tmp, "\\%llo", key); strlcat(out, tmp, sizeof out); + return (out); + +append: + strlcat(out, s, sizeof out); return (out); }