[BACK]Return to key-string.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / tmux

Annotation of src/usr.bin/tmux/key-string.c, Revision 1.1

1.1     ! nicm        1: /* $OpenBSD$ */
        !             2:
        !             3: /*
        !             4:  * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
        !             5:  *
        !             6:  * Permission to use, copy, modify, and distribute this software for any
        !             7:  * purpose with or without fee is hereby granted, provided that the above
        !             8:  * copyright notice and this permission notice appear in all copies.
        !             9:  *
        !            10:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
        !            11:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
        !            12:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
        !            13:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
        !            14:  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
        !            15:  * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
        !            16:  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
        !            17:  */
        !            18:
        !            19: #include <sys/types.h>
        !            20:
        !            21: #include <string.h>
        !            22:
        !            23: #include "tmux.h"
        !            24:
        !            25: int    key_string_search_table(const char *);
        !            26:
        !            27: struct {
        !            28:        const char *string;
        !            29:        int      key;
        !            30: } key_string_table[] = {
        !            31:        /* Function keys. */
        !            32:        { "F1",         KEYC_F1 },
        !            33:        { "F2",         KEYC_F2 },
        !            34:        { "F3",         KEYC_F3 },
        !            35:        { "F4",         KEYC_F4 },
        !            36:        { "F5",         KEYC_F5 },
        !            37:        { "F6",         KEYC_F6 },
        !            38:        { "F7",         KEYC_F7 },
        !            39:        { "F8",         KEYC_F8 },
        !            40:        { "F9",         KEYC_F9 },
        !            41:        { "F10",        KEYC_F10 },
        !            42:        { "F11",        KEYC_F11 },
        !            43:        { "F12",        KEYC_F12 },
        !            44:        { "F13",        KEYC_F13 },
        !            45:        { "F14",        KEYC_F14 },
        !            46:        { "F15",        KEYC_F15 },
        !            47:        { "F16",        KEYC_F16 },
        !            48:        { "F17",        KEYC_F17 },
        !            49:        { "F18",        KEYC_F18 },
        !            50:        { "F19",        KEYC_F19 },
        !            51:        { "F20",        KEYC_F20 },
        !            52:        { "IC",         KEYC_IC },
        !            53:        { "DC",         KEYC_DC },
        !            54:        { "Home",       KEYC_HOME },
        !            55:        { "End",        KEYC_END },
        !            56:        { "NPage",      KEYC_NPAGE },
        !            57:        { "PPage",      KEYC_PPAGE },
        !            58:        { "Tab",        '\011' },
        !            59:        { "BTab",       KEYC_BTAB },
        !            60:
        !            61:        /* Arrow keys. */
        !            62:        { "Up",         KEYC_UP },
        !            63:        { "Down",       KEYC_DOWN },
        !            64:        { "Left",       KEYC_LEFT },
        !            65:        { "Right",      KEYC_RIGHT },
        !            66:
        !            67:        /* Numeric keypad. */
        !            68:        { "KP/",        KEYC_KP0_1 },
        !            69:        { "KP*",        KEYC_KP0_2 },
        !            70:        { "KP-",        KEYC_KP0_3 },
        !            71:        { "KP7",        KEYC_KP1_0 },
        !            72:        { "KP8",        KEYC_KP1_1 },
        !            73:        { "KP9",        KEYC_KP1_2 },
        !            74:        { "KP+",        KEYC_KP1_3 },
        !            75:        { "KP4",        KEYC_KP2_0 },
        !            76:        { "KP5",        KEYC_KP2_1 },
        !            77:        { "KP6",        KEYC_KP2_2 },
        !            78:        { "KP1",        KEYC_KP3_0 },
        !            79:        { "KP2",        KEYC_KP3_1 },
        !            80:        { "KP3",        KEYC_KP3_2 },
        !            81:        { "KPEnter",    KEYC_KP3_3 },
        !            82:        { "KP0",        KEYC_KP4_0 },
        !            83:        { "KP.",        KEYC_KP4_2 },
        !            84: };
        !            85:
        !            86: int
        !            87: key_string_search_table(const char *string)
        !            88: {
        !            89:        u_int   i;
        !            90:
        !            91:        for (i = 0; i < nitems(key_string_table); i++) {
        !            92:                if (strcasecmp(string, key_string_table[i].string) == 0)
        !            93:                        return (key_string_table[i].key);
        !            94:        }
        !            95:        return (KEYC_NONE);
        !            96: }
        !            97:
        !            98: int
        !            99: key_string_lookup_string(const char *string)
        !           100: {
        !           101:        int              key;
        !           102:        const u_char    *ptr;
        !           103:
        !           104:        if (string[0] == '\0')
        !           105:                return (KEYC_NONE);
        !           106:        if (string[1] == '\0')
        !           107:                return (string[0]);
        !           108:
        !           109:        ptr = NULL;
        !           110:        if (string[0] == 'C' && string[1] == '-')
        !           111:                ptr = string + 2;
        !           112:        else if (string[0] == '^')
        !           113:                ptr = string + 1;
        !           114:        if (ptr != NULL) {
        !           115:                if (ptr[0] == '\0')
        !           116:                        return (KEYC_NONE);
        !           117:                if (ptr[1] == '\0') {
        !           118:                        if (ptr[0] == 32)
        !           119:                                return (0);
        !           120:                        if (ptr[0] >= 64 && ptr[0] <= 95)
        !           121:                                return (ptr[0] - 64);
        !           122:                        if (ptr[0] >= 97 && ptr[0] <= 122)
        !           123:                                return (ptr[0] - 96);
        !           124:                        return (KEYC_NONE);
        !           125:                }
        !           126:                key = key_string_search_table(ptr);
        !           127:                if (key != KEYC_NONE)
        !           128:                        return (KEYC_ADDCTL(key));
        !           129:                return (KEYC_NONE);
        !           130:        }
        !           131:
        !           132:        if (string[0] == 'M' && string[1] == '-') {
        !           133:                ptr = string + 2;
        !           134:                if (ptr[0] == '\0')
        !           135:                        return (KEYC_NONE);
        !           136:                if (ptr[1] == '\0') {
        !           137:                        if (ptr[0] < 32 || ptr[0] > 127)
        !           138:                                return (KEYC_NONE);
        !           139:                        return (KEYC_ADDESC(ptr[0]));
        !           140:                }
        !           141:                key = key_string_lookup_string(ptr);
        !           142:                if (key != KEYC_NONE)
        !           143:                        return (KEYC_ADDESC(key));
        !           144:                return (KEYC_NONE);
        !           145:        }
        !           146:
        !           147:        return (key_string_search_table(string));
        !           148: }
        !           149:
        !           150: const char *
        !           151: key_string_lookup_key(int key)
        !           152: {
        !           153:        static char tmp[24], tmp2[24];
        !           154:        const char *s;
        !           155:        u_int       i;
        !           156:
        !           157:        if (key == 127)
        !           158:                return (NULL);
        !           159:
        !           160:        if (KEYC_ISESC(key)) {
        !           161:                if ((s = key_string_lookup_key(KEYC_REMOVEESC(key))) == NULL)
        !           162:                        return (NULL);
        !           163:                xsnprintf(tmp2, sizeof tmp2, "M-%s", s);
        !           164:                return (tmp2);
        !           165:        }
        !           166:        if (KEYC_ISCTL(key)) {
        !           167:                if ((s = key_string_lookup_key(KEYC_REMOVECTL(key))) == NULL)
        !           168:                        return (NULL);
        !           169:                xsnprintf(tmp2, sizeof tmp2, "C-%s", s);
        !           170:                return (tmp2);
        !           171:        }
        !           172:        if (KEYC_ISSFT(key)) {
        !           173:                if ((s = key_string_lookup_key(KEYC_REMOVESFT(key))) == NULL)
        !           174:                        return (NULL);
        !           175:                xsnprintf(tmp2, sizeof tmp2, "S-%s", s);
        !           176:                return (tmp2);
        !           177:        }
        !           178:
        !           179:        if (key >= 32 && key <= 255) {
        !           180:                tmp[0] = key;
        !           181:                tmp[1] = '\0';
        !           182:                return (tmp);
        !           183:        }
        !           184:
        !           185:        if (key >= 0 && key <= 32) {
        !           186:                if (key == 0 || key > 26)
        !           187:                        xsnprintf(tmp, sizeof tmp, "C-%c", 64 + key);
        !           188:                else
        !           189:                        xsnprintf(tmp, sizeof tmp, "C-%c", 96 + key);
        !           190:                return (tmp);
        !           191:        }
        !           192:
        !           193:        for (i = 0; i < nitems(key_string_table); i++) {
        !           194:                if (key == key_string_table[i].key)
        !           195:                        return (key_string_table[i].string);
        !           196:        }
        !           197:        return (NULL);
        !           198: }