[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.9

1.9     ! nicm        1: /* $OpenBSD: mode-key.c,v 1.8 2009/07/27 19:29:35 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 },
1.9     ! nicm       77:        { '\003' /* C-c */,     0, MODEKEYCOPY_CANCEL },
1.8       nicm       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 },
1.9     ! nicm       89:        { 'q',                  0, MODEKEYCOPY_CANCEL },
1.8       nicm       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 },
1.9     ! nicm      147:        { '\003' /* C-c */,     0, MODEKEYCOPY_CANCEL },
1.8       nicm      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 },
1.9     ! nicm      155:        { '\033' /* Escape */,  0, MODEKEYCOPY_CANCEL },
1.8       nicm      156:        { 'b' | KEYC_ESCAPE,    0, MODEKEYCOPY_PREVIOUSWORD },
                    157:        { 'f' | KEYC_ESCAPE,    0, MODEKEYCOPY_NEXTWORD },
                    158:        { 'm' | KEYC_ESCAPE,    0, MODEKEYCOPY_BACKTOINDENTATION },
1.9     ! nicm      159:        { 'q',                  0, MODEKEYCOPY_CANCEL },
1.8       nicm      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: }