Annotation of src/usr.bin/tmux/mode-key.c, Revision 1.2
1.2 ! nicm 1: /* $OpenBSD: mode-key.c,v 1.1 2009/06/01 22:58:49 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: {
57: if (KEYC_ISESC(key)) {
58: key = KEYC_REMOVEESC(key);
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':
73: case '\177':
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':
87: case '\177':
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);
113: case 'j':
114: case KEYC_DOWN:
115: return (MODEKEYCMD_DOWN);
116: case '$':
117: return (MODEKEYCMD_ENDOFLINE);
118: case 'h':
119: case KEYC_LEFT:
120: return (MODEKEYCMD_LEFT);
121: case '\006':
122: case KEYC_NPAGE:
123: return (MODEKEYCMD_NEXTPAGE);
124: case 'w':
125: return (MODEKEYCMD_NEXTWORD);
126: case '\025':
127: case KEYC_PPAGE:
128: return (MODEKEYCMD_PREVIOUSPAGE);
129: case 'b':
130: return (MODEKEYCMD_PREVIOUSWORD);
131: case 'q':
132: case '\003':
133: return (MODEKEYCMD_QUIT);
134: case 'l':
135: case KEYC_RIGHT:
136: return (MODEKEYCMD_RIGHT);
137: case ' ':
138: return (MODEKEYCMD_STARTSELECTION);
139: case 'k':
140: case KEYC_UP:
141: return (MODEKEYCMD_UP);
142: case 'p':
143: return (MODEKEYCMD_PASTE);
144: }
145:
146: return (MODEKEYCMD_NONE);
147: }
148:
149: enum mode_key_cmd
150: mode_key_lookup_emacs(struct mode_key_data *mdata, int key)
151: {
152: switch (key) {
153: case '\010':
154: case '\177':
155: return (MODEKEYCMD_BACKSPACE);
156: case KEYC_DC:
157: return (MODEKEYCMD_DELETE);
158: case '\011':
159: return (MODEKEYCMD_COMPLETE);
160: case '\r':
161: return (MODEKEYCMD_CHOOSE);
162: case '\001':
163: return (MODEKEYCMD_STARTOFLINE);
1.2 ! nicm 164: case KEYC_ADDESC('m'):
! 165: return (MODEKEYCMD_BACKTOINDENTATION);
1.1 nicm 166: case '\007':
167: return (MODEKEYCMD_CLEARSELECTION);
168: case '\027':
169: case KEYC_ADDESC('w'):
170: return (MODEKEYCMD_COPYSELECTION);
171: case '\016':
172: case KEYC_DOWN:
173: return (MODEKEYCMD_DOWN);
174: case '\005':
175: return (MODEKEYCMD_ENDOFLINE);
176: case '\002':
177: case KEYC_LEFT:
178: return (MODEKEYCMD_LEFT);
179: case ' ':
180: if (mdata->flags & MODEKEY_CANEDIT)
181: break;
182: /* FALLTHROUGH */
183: case '\026':
184: case KEYC_NPAGE:
185: return (MODEKEYCMD_NEXTPAGE);
186: case KEYC_ADDESC('f'):
187: return (MODEKEYCMD_NEXTWORD);
188: case '\031':
189: return (MODEKEYCMD_PASTE);
190: case KEYC_ADDESC('v'):
191: case KEYC_PPAGE:
192: return (MODEKEYCMD_PREVIOUSPAGE);
193: case KEYC_ADDESC('b'):
194: return (MODEKEYCMD_PREVIOUSWORD);
195: case '\006':
196: case KEYC_RIGHT:
197: return (MODEKEYCMD_RIGHT);
198: case '\000':
199: return (MODEKEYCMD_STARTSELECTION);
200: case '\020':
201: case KEYC_UP:
202: return (MODEKEYCMD_UP);
203: case 'q':
204: if (mdata->flags & MODEKEY_CANEDIT)
205: break;
206: /* FALLTHROUGH */
207: case '\003':
208: case '\033':
209: return (MODEKEYCMD_QUIT);
210: }
211:
212: return (MODEKEYCMD_OTHERKEY);
213: }