Annotation of src/usr.bin/tmux/mode-key.c, Revision 1.6
1.6 ! nicm 1: /* $OpenBSD: mode-key.c,v 1.5 2009/07/26 21:42:08 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:
23: enum mode_key_cmd mode_key_lookup_vi(struct mode_key_data *, int);
24: enum mode_key_cmd mode_key_lookup_emacs(struct mode_key_data *, int);
25:
26: void
27: mode_key_init(struct mode_key_data *mdata, int type, int flags)
28: {
29: mdata->type = type;
30:
31: if (flags & MODEKEY_CANEDIT)
32: flags |= MODEKEY_EDITMODE;
33: mdata->flags = flags;
34: }
35:
36: void
37: mode_key_free(unused struct mode_key_data *mdata)
38: {
39: }
40:
41: enum mode_key_cmd
42: mode_key_lookup(struct mode_key_data *mdata, int key)
43: {
44: switch (mdata->type) {
45: case MODEKEY_VI:
46: return (mode_key_lookup_vi(mdata, key));
47: case MODEKEY_EMACS:
48: return (mode_key_lookup_emacs(mdata, key));
49: default:
50: fatalx("unknown mode key type");
51: }
52: }
53:
54: enum mode_key_cmd
55: mode_key_lookup_vi(struct mode_key_data *mdata, int key)
56: {
1.3 nicm 57: if (key & KEYC_ESCAPE) {
58: key &= ~KEYC_ESCAPE;
1.1 nicm 59: if (mdata->flags & MODEKEY_CANEDIT)
60: mdata->flags ^= MODEKEY_EDITMODE;
61: }
62:
63:
64: if (mdata->flags & MODEKEY_EDITMODE) {
65: switch (key) {
66: case '\003':
67: return (MODEKEYCMD_QUIT);
68: case '\033':
69: if (mdata->flags & MODEKEY_CANEDIT)
70: mdata->flags &= ~MODEKEY_EDITMODE;
71: return (MODEKEYCMD_NONE);
72: case '\010':
1.5 nicm 73: case KEYC_BSPACE:
1.1 nicm 74: return (MODEKEYCMD_BACKSPACE);
75: case '\011':
76: return (MODEKEYCMD_COMPLETE);
77: case KEYC_DC:
78: return (MODEKEYCMD_DELETE);
79: case '\r':
80: return (MODEKEYCMD_CHOOSE);
81: }
82: return (MODEKEYCMD_OTHERKEY);
83: }
84:
85: switch (key) {
86: case '\010':
1.5 nicm 87: case KEYC_BSPACE:
1.1 nicm 88: return (MODEKEYCMD_LEFT);
89: case KEYC_DC:
90: return (MODEKEYCMD_DELETE);
91: case '\011':
92: return (MODEKEYCMD_COMPLETE);
93: case 'i':
94: if (mdata->flags & MODEKEY_CANEDIT)
95: mdata->flags |= MODEKEY_EDITMODE;
96: break;
97: case 'a':
98: if (mdata->flags & MODEKEY_CANEDIT) {
99: mdata->flags |= MODEKEY_EDITMODE;
100: return (MODEKEYCMD_RIGHT);
101: }
102: break;
103: case '\r':
104: if (mdata->flags & (MODEKEY_CANEDIT|MODEKEY_CHOOSEMODE))
105: return (MODEKEYCMD_CHOOSE);
106: return (MODEKEYCMD_COPYSELECTION);
107: case '0':
1.2 nicm 108: return (MODEKEYCMD_STARTOFLINE);
1.1 nicm 109: case '^':
1.2 nicm 110: return (MODEKEYCMD_BACKTOINDENTATION);
1.1 nicm 111: case '\033':
112: return (MODEKEYCMD_CLEARSELECTION);
1.6 ! nicm 113: case 'C':
! 114: if (mdata->flags & MODEKEY_CANEDIT)
! 115: mdata->flags |= MODEKEY_EDITMODE;
! 116: return (MODEKEYCMD_DELETETOENDOFLINE);
! 117: case 'D':
! 118: return (MODEKEYCMD_DELETETOENDOFLINE);
1.1 nicm 119: case 'j':
120: case KEYC_DOWN:
121: return (MODEKEYCMD_DOWN);
122: case '$':
123: return (MODEKEYCMD_ENDOFLINE);
124: case 'h':
125: case KEYC_LEFT:
126: return (MODEKEYCMD_LEFT);
127: case '\006':
128: case KEYC_NPAGE:
129: return (MODEKEYCMD_NEXTPAGE);
130: case 'w':
131: return (MODEKEYCMD_NEXTWORD);
132: case '\025':
133: case KEYC_PPAGE:
134: return (MODEKEYCMD_PREVIOUSPAGE);
135: case 'b':
136: return (MODEKEYCMD_PREVIOUSWORD);
137: case 'q':
138: case '\003':
139: return (MODEKEYCMD_QUIT);
140: case 'l':
141: case KEYC_RIGHT:
142: return (MODEKEYCMD_RIGHT);
143: case ' ':
144: return (MODEKEYCMD_STARTSELECTION);
145: case 'k':
146: case KEYC_UP:
147: return (MODEKEYCMD_UP);
148: case 'p':
149: return (MODEKEYCMD_PASTE);
150: }
151:
152: return (MODEKEYCMD_NONE);
153: }
154:
155: enum mode_key_cmd
156: mode_key_lookup_emacs(struct mode_key_data *mdata, int key)
157: {
158: switch (key) {
159: case '\010':
1.5 nicm 160: case KEYC_BSPACE:
1.1 nicm 161: return (MODEKEYCMD_BACKSPACE);
1.4 nicm 162: case '\004':
1.1 nicm 163: case KEYC_DC:
164: return (MODEKEYCMD_DELETE);
165: case '\011':
166: return (MODEKEYCMD_COMPLETE);
167: case '\r':
168: return (MODEKEYCMD_CHOOSE);
169: case '\001':
170: return (MODEKEYCMD_STARTOFLINE);
1.3 nicm 171: case 'm' | KEYC_ESCAPE:
1.2 nicm 172: return (MODEKEYCMD_BACKTOINDENTATION);
1.1 nicm 173: case '\007':
174: return (MODEKEYCMD_CLEARSELECTION);
175: case '\027':
1.3 nicm 176: case 'w' | KEYC_ESCAPE:
1.1 nicm 177: return (MODEKEYCMD_COPYSELECTION);
1.6 ! nicm 178: case '\013':
! 179: return (MODEKEYCMD_DELETETOENDOFLINE);
1.1 nicm 180: case '\016':
181: case KEYC_DOWN:
182: return (MODEKEYCMD_DOWN);
183: case '\005':
184: return (MODEKEYCMD_ENDOFLINE);
185: case '\002':
186: case KEYC_LEFT:
187: return (MODEKEYCMD_LEFT);
188: case ' ':
189: if (mdata->flags & MODEKEY_CANEDIT)
190: break;
191: /* FALLTHROUGH */
192: case '\026':
193: case KEYC_NPAGE:
194: return (MODEKEYCMD_NEXTPAGE);
1.3 nicm 195: case 'f' | KEYC_ESCAPE:
1.1 nicm 196: return (MODEKEYCMD_NEXTWORD);
197: case '\031':
198: return (MODEKEYCMD_PASTE);
1.3 nicm 199: case 'v' | KEYC_ESCAPE:
1.1 nicm 200: case KEYC_PPAGE:
201: return (MODEKEYCMD_PREVIOUSPAGE);
1.3 nicm 202: case 'b' | KEYC_ESCAPE:
1.1 nicm 203: return (MODEKEYCMD_PREVIOUSWORD);
204: case '\006':
205: case KEYC_RIGHT:
206: return (MODEKEYCMD_RIGHT);
207: case '\000':
208: return (MODEKEYCMD_STARTSELECTION);
209: case '\020':
210: case KEYC_UP:
211: return (MODEKEYCMD_UP);
212: case 'q':
213: if (mdata->flags & MODEKEY_CANEDIT)
214: break;
215: /* FALLTHROUGH */
216: case '\003':
217: case '\033':
218: return (MODEKEYCMD_QUIT);
219: }
220:
221: return (MODEKEYCMD_OTHERKEY);
222: }