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

Annotation of src/usr.bin/tmux/mode-key.c, Revision 1.8

1.8     ! nicm        1: /* $OpenBSD: mode-key.c,v 1.7 2009/07/27 18:51:46 nicm Exp $ */
1.1       nicm        2:
                      3: /*
                      4:  * Copyright (c) 2008 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 "tmux.h"
                     22:
1.8     ! nicm       23: /* vi editing keys. */
        !            24: const struct mode_key_entry mode_key_vi_edit[] = {
        !            25:        { '\003' /* C-c */,     0, MODEKEYEDIT_CANCEL },
        !            26:        { '\010' /* C-h */,     0, MODEKEYEDIT_BACKSPACE },
        !            27:        { '\011' /* Tab */,     0, MODEKEYEDIT_COMPLETE },
        !            28:        { '\033' /* Escape */,  0, MODEKEYEDIT_SWITCHMODE },
        !            29:        { '\r',                 0, MODEKEYEDIT_ENTER },
        !            30:        { KEYC_BSPACE,          0, MODEKEYEDIT_BACKSPACE },
        !            31:        { KEYC_DC,              0, MODEKEYEDIT_DELETE },
        !            32:
        !            33:        { '$',                  1, MODEKEYEDIT_ENDOFLINE },
        !            34:        { '0',                  1, MODEKEYEDIT_STARTOFLINE },
        !            35:        { 'D',                  1, MODEKEYEDIT_DELETETOENDOFLINE },
        !            36:        { '\003' /* C-c */,     1, MODEKEYEDIT_CANCEL },
        !            37:        { '\010' /* C-h */,     1, MODEKEYEDIT_BACKSPACE },
        !            38:        { '\r',                 1, MODEKEYEDIT_ENTER },
        !            39:        { '^',                  1, MODEKEYEDIT_STARTOFLINE },
        !            40:        { 'a',                  1, MODEKEYEDIT_SWITCHMODEAPPEND },
        !            41:        { 'h',                  1, MODEKEYEDIT_CURSORLEFT },
        !            42:        { 'i',                  1, MODEKEYEDIT_SWITCHMODE },
        !            43:        { 'j',                  1, MODEKEYEDIT_HISTORYDOWN },
        !            44:        { 'k',                  1, MODEKEYEDIT_HISTORYUP },
        !            45:        { 'l',                  1, MODEKEYEDIT_CURSORRIGHT },
        !            46:        { 'p',                  1, MODEKEYEDIT_PASTE },
        !            47:        { KEYC_BSPACE,          1, MODEKEYEDIT_BACKSPACE },
        !            48:        { KEYC_DC,              1, MODEKEYEDIT_DELETE },
        !            49:        { KEYC_DOWN,            1, MODEKEYEDIT_HISTORYDOWN },
        !            50:        { KEYC_LEFT,            1, MODEKEYEDIT_CURSORLEFT },
        !            51:        { KEYC_RIGHT,           1, MODEKEYEDIT_CURSORRIGHT },
        !            52:        { KEYC_UP,              1, MODEKEYEDIT_HISTORYUP },
        !            53:
        !            54:        { 0,                   -1, 0 }
        !            55: };
        !            56:
        !            57: /* vi choice selection keys. */
        !            58: const struct mode_key_entry mode_key_vi_choice[] = {
        !            59:        { '\003' /* C-c */,     0, MODEKEYCHOICE_CANCEL },
        !            60:        { '\r',                 0, MODEKEYCHOICE_CHOOSE },
        !            61:        { 'j',                  0, MODEKEYCHOICE_DOWN },
        !            62:        { 'k',                  0, MODEKEYCHOICE_UP },
        !            63:        { 'q',                  0, MODEKEYCHOICE_CANCEL },
        !            64:        { KEYC_DOWN,            0, MODEKEYCHOICE_DOWN },
        !            65:        { KEYC_NPAGE,           0, MODEKEYCHOICE_PAGEDOWN },
        !            66:        { KEYC_PPAGE,           0, MODEKEYCHOICE_PAGEUP },
        !            67:        { KEYC_UP,              0, MODEKEYCHOICE_UP },
        !            68:
        !            69:        { 0,                    -1, 0 }
        !            70: };
        !            71:
        !            72: /* vi copy mode keys. */
        !            73: const struct mode_key_entry mode_key_vi_copy[] = {
        !            74:        { ' ',                  0, MODEKEYCOPY_STARTSELECTION },
        !            75:        { '$',                  0, MODEKEYCOPY_ENDOFLINE },
        !            76:        { '0',                  0, MODEKEYCOPY_STARTOFLINE },
        !            77:        { '\003' /* C-c */,     0, MODEKEYCOPY_QUIT },
        !            78:        { '\006' /* C-f */,     0, MODEKEYCOPY_NEXTPAGE },
        !            79:        { '\010' /* C-h */,     0, MODEKEYCOPY_LEFT },
        !            80:        { '\025' /* C-u */,     0, MODEKEYCOPY_PREVIOUSPAGE },
        !            81:        { '\033' /* Escape */,  0, MODEKEYCOPY_CLEARSELECTION },
        !            82:        { '\r',                 0, MODEKEYCOPY_COPYSELECTION },
        !            83:        { '^',                  0, MODEKEYCOPY_BACKTOINDENTATION },
        !            84:        { 'b',                  0, MODEKEYCOPY_PREVIOUSWORD },
        !            85:        { 'h',                  0, MODEKEYCOPY_LEFT },
        !            86:        { 'j',                  0, MODEKEYCOPY_DOWN },
        !            87:        { 'k',                  0, MODEKEYCOPY_UP },
        !            88:        { 'l',                  0, MODEKEYCOPY_RIGHT },
        !            89:        { 'q',                  0, MODEKEYCOPY_QUIT },
        !            90:        { 'w',                  0, MODEKEYCOPY_NEXTWORD },
        !            91:        { KEYC_BSPACE,          0, MODEKEYCOPY_LEFT },
        !            92:        { KEYC_DOWN,            0, MODEKEYCOPY_DOWN },
        !            93:        { KEYC_LEFT,            0, MODEKEYCOPY_LEFT },
        !            94:        { KEYC_NPAGE,           0, MODEKEYCOPY_NEXTPAGE },
        !            95:        { KEYC_PPAGE,           0, MODEKEYCOPY_PREVIOUSPAGE },
        !            96:        { KEYC_RIGHT,           0, MODEKEYCOPY_RIGHT },
        !            97:        { KEYC_UP,              0, MODEKEYCOPY_UP },
        !            98:
        !            99:        { 0,                    -1, 0 }
        !           100: };
        !           101:
        !           102: /* emacs editing keys. */
        !           103: const struct mode_key_entry mode_key_emacs_edit[] = {
        !           104:        { '\001' /* C-a */,     0, MODEKEYEDIT_STARTOFLINE },
        !           105:        { '\002' /* C-p */,     0, MODEKEYEDIT_CURSORLEFT },
        !           106:        { '\004' /* C-d */,     0, MODEKEYEDIT_DELETE },
        !           107:        { '\005' /* C-e */,     0, MODEKEYEDIT_ENDOFLINE },
        !           108:        { '\006' /* C-f */,     0, MODEKEYEDIT_CURSORRIGHT },
        !           109:        { '\010' /* C-H */,     0, MODEKEYEDIT_BACKSPACE },
        !           110:        { '\011' /* Tab */,     0, MODEKEYEDIT_COMPLETE },
        !           111:        { '\013' /* C-k */,     0, MODEKEYEDIT_DELETETOENDOFLINE },
        !           112:        { '\016' /* C-n */,     0, MODEKEYEDIT_HISTORYDOWN },
        !           113:        { '\020' /* C-p */,     0, MODEKEYEDIT_HISTORYUP },
        !           114:        { '\031' /* C-y */,     0, MODEKEYEDIT_PASTE },
        !           115:        { '\r',                 0, MODEKEYEDIT_ENTER },
        !           116:        { 'm' | KEYC_ESCAPE,    0, MODEKEYEDIT_STARTOFLINE },
        !           117:        { KEYC_BSPACE,          0, MODEKEYEDIT_BACKSPACE },
        !           118:        { KEYC_DC,              0, MODEKEYEDIT_DELETE },
        !           119:        { KEYC_DOWN,            0, MODEKEYEDIT_HISTORYDOWN },
        !           120:        { KEYC_LEFT,            0, MODEKEYEDIT_CURSORLEFT },
        !           121:        { KEYC_RIGHT,           0, MODEKEYEDIT_CURSORRIGHT },
        !           122:        { KEYC_UP,              0, MODEKEYEDIT_HISTORYUP },
        !           123:
        !           124:        { 0,                   -1, 0 }
        !           125: };
        !           126:
        !           127: /* emacs choice selection keys. */
        !           128: const struct mode_key_entry mode_key_emacs_choice[] = {
        !           129:        { '\003' /* C-c */,     0, MODEKEYCHOICE_CANCEL },
        !           130:        { '\033' /* Escape */,  0, MODEKEYCHOICE_CANCEL },
        !           131:        { '\r',                 0, MODEKEYCHOICE_CHOOSE },
        !           132:        { 'q',                  0, MODEKEYCHOICE_CANCEL },
        !           133:        { KEYC_DOWN,            0, MODEKEYCHOICE_DOWN },
        !           134:        { KEYC_NPAGE,           0, MODEKEYCHOICE_PAGEDOWN },
        !           135:        { KEYC_PPAGE,           0, MODEKEYCHOICE_PAGEUP },
        !           136:        { KEYC_UP,              0, MODEKEYCHOICE_UP },
        !           137:
        !           138:        { 0,                    -1, 0 }
        !           139: };
        !           140:
        !           141: /* emacs copy mode keys. */
        !           142: const struct mode_key_entry mode_key_emacs_copy[] = {
        !           143:        { ' ',                  0, MODEKEYCOPY_NEXTPAGE },
        !           144:        { '\000' /* C-Space */, 0, MODEKEYCOPY_STARTSELECTION },
        !           145:        { '\001' /* C-a */,     0, MODEKEYCOPY_STARTOFLINE },
        !           146:        { '\002' /* C-b */,     0, MODEKEYCOPY_LEFT },
        !           147:        { '\003' /* C-c */,     0, MODEKEYCOPY_QUIT },
        !           148:        { '\005' /* C-e */,     0, MODEKEYCOPY_ENDOFLINE },
        !           149:        { '\006' /* C-f */,     0, MODEKEYCOPY_RIGHT },
        !           150:        { '\007' /* C-g */,     0, MODEKEYCOPY_CLEARSELECTION },
        !           151:        { '\016' /* C-n */,     0, MODEKEYCOPY_DOWN },
        !           152:        { '\020' /* C-p */,     0, MODEKEYCOPY_UP },
        !           153:        { '\026' /* C-v */,     0, MODEKEYCOPY_NEXTPAGE },
        !           154:        { '\027' /* C-w */,     0, MODEKEYCOPY_COPYSELECTION },
        !           155:        { '\033' /* Escape */,  0, MODEKEYCOPY_QUIT },
        !           156:        { 'b' | KEYC_ESCAPE,    0, MODEKEYCOPY_PREVIOUSWORD },
        !           157:        { 'f' | KEYC_ESCAPE,    0, MODEKEYCOPY_NEXTWORD },
        !           158:        { 'm' | KEYC_ESCAPE,    0, MODEKEYCOPY_BACKTOINDENTATION },
        !           159:        { 'q',                  0, MODEKEYCOPY_QUIT },
        !           160:        { 'v' | KEYC_ESCAPE,    0, MODEKEYCOPY_PREVIOUSPAGE },
        !           161:        { 'w' | KEYC_ESCAPE,    0, MODEKEYCOPY_COPYSELECTION },
        !           162:        { KEYC_DOWN,            0, MODEKEYCOPY_DOWN },
        !           163:        { KEYC_LEFT,            0, MODEKEYCOPY_LEFT },
        !           164:        { KEYC_NPAGE,           0, MODEKEYCOPY_NEXTPAGE },
        !           165:        { KEYC_PPAGE,           0, MODEKEYCOPY_PREVIOUSPAGE },
        !           166:        { KEYC_RIGHT,           0, MODEKEYCOPY_RIGHT },
        !           167:        { KEYC_UP,              0, MODEKEYCOPY_UP },
        !           168:
        !           169:        { 0,                    -1, 0 }
        !           170: };
1.1       nicm      171:
                    172: void
1.8     ! nicm      173: mode_key_init(struct mode_key_data *mdata, const struct mode_key_entry *table)
1.1       nicm      174: {
1.8     ! nicm      175:        mdata->table = table;
        !           176:        mdata->mode = 0;
1.1       nicm      177: }
                    178:
                    179: enum mode_key_cmd
                    180: mode_key_lookup(struct mode_key_data *mdata, int key)
                    181: {
1.8     ! nicm      182:        const struct mode_key_entry     *ment;
        !           183:        int                              mode;
1.1       nicm      184:
1.8     ! nicm      185:        mode = mdata->mode;
        !           186:        for (ment = mdata->table; ment->mode != -1; ment++) {
        !           187:                if (ment->mode == mode && key == ment->key) {
        !           188:                        switch (ment->cmd) {
        !           189:                        case MODEKEYEDIT_SWITCHMODE:
        !           190:                        case MODEKEYEDIT_SWITCHMODEAPPEND:
        !           191:                                mdata->mode = 1 - mdata->mode;
        !           192:                                /* FALLTHROUGH */
        !           193:                        default:
        !           194:                                return (ment->cmd);
        !           195:                        }
1.1       nicm      196:                }
                    197:        }
1.8     ! nicm      198:        if (mode != 0)
        !           199:                return (MODEKEY_NONE);
        !           200:        return (MODEKEY_OTHER);
1.1       nicm      201: }