1 | #include <ctype.h> |
---|
2 | #include <string.h> |
---|
3 | #include "owl.h" |
---|
4 | |
---|
5 | static struct _owl_keypress_specialmap { |
---|
6 | int kj; |
---|
7 | char *ks; |
---|
8 | } specialmap[] = { |
---|
9 | #ifdef KEY_CODE_YES |
---|
10 | { KEY_CODE_YES, "CODE_YES" }, |
---|
11 | #endif |
---|
12 | { KEY_MIN, "MIN" }, |
---|
13 | { KEY_BREAK, "BREAK" }, |
---|
14 | { KEY_DOWN, "DOWN" }, |
---|
15 | { KEY_UP, "UP" }, |
---|
16 | { KEY_LEFT, "LEFT" }, |
---|
17 | { KEY_RIGHT, "RIGHT" }, |
---|
18 | { KEY_HOME, "HOME" }, |
---|
19 | { KEY_BACKSPACE, "BACKSPACE" }, |
---|
20 | { KEY_F0, "F0" }, |
---|
21 | { KEY_F(1), "F1" }, |
---|
22 | { KEY_F(2), "F2" }, |
---|
23 | { KEY_F(3), "F3" }, |
---|
24 | { KEY_F(4), "F4" }, |
---|
25 | { KEY_F(5), "F5" }, |
---|
26 | { KEY_F(6), "F6" }, |
---|
27 | { KEY_F(7), "F7" }, |
---|
28 | { KEY_F(8), "F8" }, |
---|
29 | { KEY_F(9), "F9" }, |
---|
30 | { KEY_F(10), "F10" }, |
---|
31 | { KEY_F(11), "F11" }, |
---|
32 | { KEY_F(12), "F12" }, |
---|
33 | { KEY_DL, "DL" }, |
---|
34 | { KEY_IL, "IL" }, |
---|
35 | { KEY_DC, "DC" }, |
---|
36 | { KEY_IC, "IC" }, |
---|
37 | { KEY_EIC, "EIC" }, |
---|
38 | { KEY_CLEAR, "CLEAR" }, |
---|
39 | { KEY_EOS, "EOS" }, |
---|
40 | { KEY_EOL, "EOL" }, |
---|
41 | { KEY_SF, "SF" }, |
---|
42 | { KEY_SR, "SR" }, |
---|
43 | { KEY_NPAGE, "NPAGE" }, |
---|
44 | { KEY_PPAGE, "PPAGE" }, |
---|
45 | { KEY_STAB, "STAB" }, |
---|
46 | { KEY_CTAB, "CTAB" }, |
---|
47 | { KEY_CATAB, "CATAB" }, |
---|
48 | { KEY_ENTER, "ENTER" }, |
---|
49 | { KEY_SRESET, "SRESET" }, |
---|
50 | { KEY_RESET, "RESET" }, |
---|
51 | { KEY_PRINT, "PRINT" }, |
---|
52 | { KEY_LL, "LL" }, |
---|
53 | { KEY_A1, "A1" }, |
---|
54 | { KEY_A3, "A3" }, |
---|
55 | { KEY_B2, "B2" }, |
---|
56 | { KEY_C1, "C1" }, |
---|
57 | { KEY_C3, "C3" }, |
---|
58 | { KEY_BTAB, "BTAB" }, |
---|
59 | { KEY_BEG, "BEG" }, |
---|
60 | { KEY_CANCEL, "CANCEL" }, |
---|
61 | { KEY_CLOSE, "CLOSE" }, |
---|
62 | { KEY_COMMAND, "COMMAND" }, |
---|
63 | { KEY_COPY, "COPY" }, |
---|
64 | { KEY_CREATE, "CREATE" }, |
---|
65 | { KEY_END, "END" }, |
---|
66 | { KEY_EXIT, "EXIT" }, |
---|
67 | { KEY_FIND, "FIND" }, |
---|
68 | { KEY_HELP, "HELP" }, |
---|
69 | { KEY_MARK, "MARK" }, |
---|
70 | { KEY_MESSAGE, "MESSAGE" }, |
---|
71 | { KEY_MOVE, "MOVE" }, |
---|
72 | { KEY_NEXT, "NEXT" }, |
---|
73 | { KEY_OPEN, "OPEN" }, |
---|
74 | { KEY_OPTIONS, "OPTIONS" }, |
---|
75 | { KEY_PREVIOUS, "PREVIOUS" }, |
---|
76 | { KEY_REDO, "REDO" }, |
---|
77 | { KEY_REFERENCE, "REFERENCE" }, |
---|
78 | { KEY_REFRESH, "REFRESH" }, |
---|
79 | { KEY_REPLACE, "REPLACE" }, |
---|
80 | { KEY_RESTART, "RESTART" }, |
---|
81 | { KEY_RESUME, "RESUME" }, |
---|
82 | { KEY_SAVE, "SAVE" }, |
---|
83 | { KEY_SBEG, "SBEG" }, |
---|
84 | { KEY_SCANCEL, "SCANCEL" }, |
---|
85 | { KEY_SCOMMAND, "SCOMMAND" }, |
---|
86 | { KEY_SCOPY, "SCOPY" }, |
---|
87 | { KEY_SCREATE, "SCREATE" }, |
---|
88 | { KEY_SDC, "SDC" }, |
---|
89 | { KEY_SDL, "SDL" }, |
---|
90 | { KEY_SELECT, "SELECT" }, |
---|
91 | { KEY_SEND, "SEND" }, |
---|
92 | { KEY_SEOL, "SEOL" }, |
---|
93 | { KEY_SEXIT, "SEXIT" }, |
---|
94 | { KEY_SFIND, "SFIND" }, |
---|
95 | { KEY_SHELP, "SHELP" }, |
---|
96 | { KEY_SHOME, "SHOME" }, |
---|
97 | { KEY_SIC, "SIC" }, |
---|
98 | { KEY_SLEFT, "SLEFT" }, |
---|
99 | { KEY_SMESSAGE, "SMESSAGE" }, |
---|
100 | { KEY_SMOVE, "SMOVE" }, |
---|
101 | { KEY_SNEXT, "SNEXT" }, |
---|
102 | { KEY_SOPTIONS, "SOPTIONS" }, |
---|
103 | { KEY_SPREVIOUS, "SPREVIOUS" }, |
---|
104 | { KEY_SPRINT, "SPRINT" }, |
---|
105 | { KEY_SREDO, "SREDO" }, |
---|
106 | { KEY_SREPLACE, "SREPLACE" }, |
---|
107 | { KEY_SRIGHT, "SRIGHT" }, |
---|
108 | { KEY_SRSUME, "SRSUME" }, |
---|
109 | { KEY_SSAVE, "SSAVE" }, |
---|
110 | { KEY_SSUSPEND, "SSUSPEND" }, |
---|
111 | { KEY_SUNDO, "SUNDO" }, |
---|
112 | { KEY_SUSPEND, "SUSPEND" }, |
---|
113 | { KEY_UNDO, "UNDO" }, |
---|
114 | { KEY_MOUSE, "MOUSE" }, |
---|
115 | #ifdef KEY_RESIZE |
---|
116 | { KEY_RESIZE, "RESIZE" }, |
---|
117 | #endif |
---|
118 | { KEY_MAX, "MAX" }, |
---|
119 | { ' ', "SPACE" }, |
---|
120 | { 27, "ESCAPE" }, |
---|
121 | { 127, "DELETE" }, |
---|
122 | { '\r', "CR" }, |
---|
123 | { '\n', "LF" }, |
---|
124 | { 0, NULL } |
---|
125 | }; |
---|
126 | |
---|
127 | #define OWL_CTRL(key) ((key)&037) |
---|
128 | /* OWL_META is definied in owl.h */ |
---|
129 | |
---|
130 | /* returns 0 on success */ |
---|
131 | int owl_keypress_tostring(int j, int esc, char *buff, int bufflen) |
---|
132 | { |
---|
133 | char kb[64], kb2[2]; |
---|
134 | struct _owl_keypress_specialmap *sm; |
---|
135 | |
---|
136 | *kb = '\0'; |
---|
137 | for (sm = specialmap; sm->kj!=0; sm++) { |
---|
138 | if (j == OWL_META(sm->kj) || (esc && j == sm->kj)) { |
---|
139 | strcat(kb, "M-"); |
---|
140 | strcat(kb, sm->ks); |
---|
141 | break; |
---|
142 | } else if (j == sm->kj) { |
---|
143 | strcat(kb, sm->ks); |
---|
144 | break; |
---|
145 | } |
---|
146 | } |
---|
147 | if (!*kb) { |
---|
148 | if (j & OWL_META(0)) { |
---|
149 | strcat(kb, "M-"); |
---|
150 | j &= ~OWL_META(0); |
---|
151 | } |
---|
152 | if ((OWL_CTRL(j) == j)) { |
---|
153 | strcat(kb, "C-"); |
---|
154 | j |= 0x40; |
---|
155 | if (isupper(j)) j = tolower(j); |
---|
156 | |
---|
157 | } |
---|
158 | if (isascii(j)) { |
---|
159 | kb2[0] = j; |
---|
160 | kb2[1] = 0; |
---|
161 | strcat(kb, kb2); |
---|
162 | } |
---|
163 | |
---|
164 | } |
---|
165 | if (!*kb) { |
---|
166 | /* not a valid key */ |
---|
167 | strncpy(buff, "INVALID", bufflen); |
---|
168 | return(-1); |
---|
169 | } |
---|
170 | strncpy(buff, kb, bufflen); |
---|
171 | return(0); |
---|
172 | } |
---|
173 | |
---|
174 | |
---|
175 | /* returns ERR on failure, else a keycode */ |
---|
176 | int owl_keypress_fromstring(char *kb) |
---|
177 | { |
---|
178 | struct _owl_keypress_specialmap *sm; |
---|
179 | int ismeta=0, isctrl=0; |
---|
180 | int j = ERR; |
---|
181 | |
---|
182 | while (*kb && kb[1] == '-' && (kb[0] == 'C' || kb[0] == 'M')) { |
---|
183 | if ((kb[0] == 'C') && (kb[1] == '-')) { |
---|
184 | isctrl = 1; |
---|
185 | kb+=2; |
---|
186 | } |
---|
187 | if ((kb[0] == 'M') && (kb[1] == '-')) { |
---|
188 | ismeta = 1; |
---|
189 | kb+=2; |
---|
190 | } |
---|
191 | } |
---|
192 | if (isascii(kb[0]) && !kb[1]) { |
---|
193 | j = kb[0]; |
---|
194 | } else { |
---|
195 | for (sm = specialmap; sm->kj!=0; sm++) { |
---|
196 | if (!strcmp(sm->ks, kb)) { |
---|
197 | j = sm->kj; |
---|
198 | } |
---|
199 | } |
---|
200 | } |
---|
201 | if (j==ERR) return(ERR); |
---|
202 | if (isctrl) { |
---|
203 | j = OWL_CTRL(j); |
---|
204 | } |
---|
205 | if (ismeta) { |
---|
206 | j = OWL_META(j); |
---|
207 | } |
---|
208 | return(j); |
---|
209 | } |
---|
210 | |
---|