3
|
1 /* $Id: keymap.c,v 1.1.1.1 1997/12/06 05:41:29 darius Exp $ */
|
|
2
|
|
3 /*
|
|
4 * keymap.c
|
|
5 * Bill Dyess, 10/20/93
|
|
6 */
|
|
7
|
|
8 #include "copyright.h"
|
|
9 #include <stdio.h>
|
|
10 /*#include <sys/types.h>
|
|
11 #ifdef RS6K
|
|
12 #include <sys/select.h>
|
|
13 #endif
|
|
14 #include <signal.h>
|
|
15 #include <errno.h>
|
|
16 #include "packets.h"*/
|
|
17 #include "Wlib.h"
|
|
18 #include "defs.h"
|
|
19 #include "struct.h"
|
|
20 #include "data.h"
|
|
21 #include "proto.h"
|
|
22
|
|
23 #define control(x) (x)+128
|
|
24
|
|
25 int
|
|
26 doKeymap(data)
|
|
27 W_Event *data;
|
|
28 {
|
|
29 int key = data->key;
|
|
30
|
|
31 #ifdef MACROS
|
|
32 if (macroState) { /* macro needed a destination or in macro
|
|
33 mode */
|
|
34 if (key > 256 && data->type != W_EV_BUTTON) { /* an alt-key will exit
|
|
35 the macro mode */
|
|
36 /*
|
|
37 but let mouse buttons do macros! button conversion is done by
|
|
38 calling function.
|
|
39 */
|
|
40 warning(" ");
|
|
41 } else {
|
|
42 if (key > 256)
|
|
43 data->key -= 256;
|
|
44 doMacro(data);
|
|
45 return -1;
|
|
46 }
|
|
47 }
|
|
48 #endif /* MACROS */
|
|
49
|
|
50 if (key < 256) { /* not alt key */
|
|
51 key = myship->s_keymap[key];
|
|
52
|
|
53 #ifdef MACROS
|
|
54 if (macrotable[key] && (macrotable[key]->flags & MACSINGLE)) {
|
|
55 data->key = key;
|
|
56 doMacro(data);
|
|
57 return -1;
|
|
58 }
|
|
59 #endif /* MACROS */
|
|
60
|
|
61 } else
|
|
62 key = key - 256;
|
|
63 return key;
|
|
64 }
|
|
65
|
|
66 unsigned char def_keymap[256];
|
|
67 unsigned char def_buttonmap[12];
|
|
68 void
|
|
69 buildShipKeymap(shipp)
|
|
70 struct ship *shipp;
|
|
71 {
|
|
72 char keybuf[40], ckeybuf[40], buttonbuf[40], cbuttonbuf[40];
|
|
73 struct stringlist *l;
|
|
74
|
|
75 bcopy(def_keymap, shipp->s_keymap, 256);
|
|
76 bcopy(def_buttonmap, shipp->s_buttonmap, 12);
|
|
77
|
|
78 sprintf(keybuf, "keymap.%c%c", shipp->s_desig[0], shipp->s_desig[1]);
|
|
79 sprintf(ckeybuf, "ckeymap.%c%c", shipp->s_desig[0], shipp->s_desig[1]);
|
|
80 sprintf(buttonbuf, "buttonmap.%c%c", shipp->s_desig[0], shipp->s_desig[1]);
|
|
81 sprintf(cbuttonbuf, "cbuttonmap.%c%c", shipp->s_desig[0], shipp->s_desig[1]);
|
|
82
|
|
83 for (l = defaults; l; l = l->next) {
|
|
84 if (!strcmpi(keybuf, l->string))
|
|
85 keymapAdd(l->value, shipp->s_keymap);
|
|
86 else if (!strcmpi(ckeybuf, l->string))
|
|
87 ckeymapAdd(l->value, shipp->s_keymap);
|
|
88 else if (!strcmpi(buttonbuf, l->string))
|
|
89 buttonmapAdd(l->value, shipp->s_buttonmap);
|
|
90 else if (!strcmpi(cbuttonbuf, l->string))
|
|
91 cbuttonmapAdd(l->value, shipp->s_buttonmap);
|
|
92 }
|
|
93 }
|
|
94
|
|
95 void
|
|
96 initkeymap(type)
|
|
97 int type;
|
|
98 {
|
|
99 char keybuf[40], ckeybuf[40], buttonbuf[40], cbuttonbuf[40];
|
|
100 struct ship *sh;
|
|
101 int i, j;
|
|
102 struct stringlist *l;
|
|
103
|
|
104 keybuf[0] = ckeybuf[0] = buttonbuf[0] = cbuttonbuf[0] = 0;
|
|
105
|
|
106 if (type < 0) {
|
|
107 for (i = 0; i < 256; i++)
|
|
108 def_keymap[i] = i;
|
|
109
|
|
110 for (l = defaults; l; l = l->next) {
|
|
111 if (!strcmpi("keymap", l->string))
|
|
112 keymapAdd(l->value, def_keymap);
|
|
113 else if (!strcmpi("ckeymap", l->string))
|
|
114 ckeymapAdd(l->value, def_keymap);
|
|
115 else if (!strcmpi("buttonmap", l->string))
|
|
116 buttonmapAdd(l->value, def_buttonmap);
|
|
117 else if (!strcmpi("cbuttonmap", l->string))
|
|
118 cbuttonmapAdd(l->value, def_buttonmap);
|
|
119 }
|
|
120
|
|
121 for (j = 0; j < nshiptypes; j++) {
|
|
122 buildShipKeymap(getship(j));
|
|
123 }
|
|
124 }
|
|
125 }
|
|
126
|
|
127 void
|
|
128 keymapAdd(str, map)
|
|
129 char *str, *map;
|
|
130 {
|
|
131 if (str) {
|
|
132 /* parse non-control char keymap */
|
|
133 while (*str != '\0' && *(str + 1) != '\0') {
|
|
134 if (*str >= 32 && *str < 127) {
|
|
135 map[(int) *str] = *(str + 1);
|
|
136 }
|
|
137 str += 2;
|
|
138 }
|
|
139 }
|
|
140 }
|
|
141
|
|
142 void
|
|
143 ckeymapAdd(cstr, map)
|
|
144 char *cstr, *map;
|
|
145 {
|
|
146 unsigned char key[2];
|
|
147 short state = 0;
|
|
148
|
|
149 if (cstr) {
|
|
150 /*
|
|
151 control chars are allowed, so use ^char to mean control, and ^^ to
|
|
152 mean ^
|
|
153 */
|
|
154 while (*cstr != '\0') {
|
|
155 if (*cstr == '^') {
|
|
156 cstr++;
|
|
157 if (*cstr == '^' || !*cstr)
|
|
158 key[state] = '^';
|
|
159 else
|
|
160 key[state] = 128 + *cstr;
|
|
161 } else {
|
|
162 key[state] = *cstr;
|
|
163 }
|
|
164 if (*cstr)
|
|
165 cstr++;
|
|
166 if (state)
|
|
167 map[key[0]] = key[1];
|
|
168 state = 1 - state;
|
|
169 }
|
|
170 }
|
|
171 }
|
|
172
|
|
173 void
|
|
174 buttonmapAdd(str, map)
|
|
175 char *str, *map;
|
|
176 {
|
|
177 unsigned char button, ch;
|
|
178
|
|
179 if (str) {
|
|
180 while (*str != '\0' && *(str + 1) != '\0') {
|
|
181 if (*str < 'a')
|
|
182 button = *str++ - '1';
|
|
183 else
|
|
184 button = 9 + *str++ - 'a';
|
|
185 if (button > 11)
|
|
186 fprintf(stderr, "%c ignored in buttonmap\n", *(str - 1));
|
|
187 else {
|
|
188 ch = *str++;
|
|
189 map[button] = ch;
|
|
190 }
|
|
191 }
|
|
192 }
|
|
193 }
|
|
194
|
|
195 void
|
|
196 cbuttonmapAdd(cstr, map)
|
|
197 char *cstr, *map;
|
|
198 {
|
|
199 unsigned char button, ch;
|
|
200
|
|
201 if (cstr) {
|
|
202 while (*cstr != '\0' && *(cstr + 1) != '\0') {
|
|
203 /*
|
|
204 code for cbuttonmap, which allows buttons to be mapped to
|
|
205 control keys. [BDyess]
|
|
206 */
|
|
207 if (*cstr < 'a')
|
|
208 button = *cstr++ - '1';
|
|
209 else
|
|
210 button = 9 + *cstr++ - 'a';
|
|
211 if (button > 11)
|
|
212 fprintf(stderr, "%c ignored in cbuttonmap\n", *(cstr - 1));
|
|
213 else {
|
|
214 ch = *cstr++;
|
|
215 if (ch == '^') {
|
|
216 ch = *cstr++;
|
|
217 if (ch != '^')
|
|
218 ch += 128;
|
|
219 }
|
|
220 map[button] = ch;
|
|
221 }
|
|
222 }
|
|
223 }
|
|
224 }
|
|
225
|
|
226 #ifdef KEYMAP_DEBUG
|
|
227 void
|
|
228 dumpKeymap()
|
|
229 {
|
|
230 int i;
|
|
231
|
|
232 for (i = 0; i < 256; i++) {
|
|
233 printf("%3d %c : %3d %c\n",
|
|
234 i,
|
|
235 isprint(i) ? i : '_',
|
|
236 myship->s_keymap[i],
|
|
237 isprint(myship->s_keymap[i]) ? myship->s_keymap[i] : '_');
|
|
238 }
|
|
239 }
|
|
240 #endif /* KEYMAP_DEBUG */
|