comparison io.c @ 431:440efd7d27a9

Read key bindings from config file
author Mike Pavone <pavone@retrodev.com>
date Wed, 10 Jul 2013 22:48:17 -0700
parents d0cacb4ade0b
children 18cde14e8c10
comparison
equal deleted inserted replaced
430:7f84090ab1cd 431:440efd7d27a9
250 handle_binding_up(dpad->bindings + i); 250 handle_binding_up(dpad->bindings + i);
251 } 251 }
252 } 252 }
253 } 253 }
254 254
255 void process_keys(tern_node * cur, tern_node * special, tern_node * padbuttons, char * prefix)
256 {
257 char * curstr;
258 int len;
259 if (!cur) {
260 return;
261 }
262 char onec[2];
263 if (prefix) {
264 len = strlen(prefix);
265 curstr = malloc(len + 2);
266 memcpy(curstr, prefix, len);
267 } else {
268 curstr = onec;
269 len = 0;
270 }
271 curstr[len] = cur->el;
272 if (cur->el) {
273 curstr[len+1] = 0;
274 process_keys(cur->straight.next, special, padbuttons, curstr);
275 } else {
276 int keycode = tern_find_int(special, curstr, 0);
277 if (!keycode) {
278 keycode = curstr[0];
279 if (curstr[1] != 0) {
280 fprintf(stderr, "%s is not recognized as a key identifier, truncating to %c\n", curstr, curstr[0]);
281 }
282 }
283 char * target = cur->straight.value.ptrval;
284 int gpadslen = strlen("gamepads.");
285 if (!memcmp(target, "gamepads.", gpadslen)) {
286 if (target[gpadslen] >= '1' && target[gpadslen] <= '8') {
287 int padnum = target[gpadslen] - '0';
288 int button = tern_find_int(padbuttons, target + gpadslen + 1, 0);
289 if (button) {
290 bind_gamepad(keycode, padnum, button);
291 } else {
292 if (target[gpadslen+1]) {
293 fprintf(stderr, "Gamepad mapping string '%s' refers to an invalid button '%s'\n", target, target + gpadslen + 1);
294 } else {
295 fprintf(stderr, "Gamepad mapping string '%s' has no button component\n", target);
296 }
297 }
298 } else {
299 fprintf(stderr, "Gamepad mapping string '%s' refers to an invalid gamepad number %c\n", target, target[gpadslen]);
300 }
301 } else if(!memcmp(target, "ui.", strlen("ui."))) {
302 if (!strcmp(target + 3, "vdp_debug_mode")) {
303 bind_ui(keycode, UI_DEBUG_MODE_INC);
304 } else if(!strcmp(target + 3, "vdp_debug_pal")) {
305 bind_ui(keycode, UI_DEBUG_PAL_INC);
306 } else if(!strcmp(target + 3, "enter_debugger")) {
307 bind_ui(keycode, UI_ENTER_DEBUGGER);
308 } else {
309 fprintf(stderr, "Unreconized UI binding type %s for key %s\n", target, curstr);
310 }
311 } else {
312 fprintf(stderr, "Unrecognized binding type %s for key %s\n", target, curstr);
313 }
314 }
315 process_keys(cur->left, special, padbuttons, prefix);
316 process_keys(cur->right, special, padbuttons, prefix);
317 }
318
255 void set_keybindings() 319 void set_keybindings()
256 { 320 {
257 bind_gamepad(RENDERKEY_UP, 1, DPAD_UP); 321 tern_node * special = tern_insert_int(NULL, "up", RENDERKEY_UP);
258 bind_gamepad(RENDERKEY_DOWN, 1, DPAD_DOWN); 322 special = tern_insert_int(special, "down", RENDERKEY_DOWN);
259 bind_gamepad(RENDERKEY_LEFT, 1, DPAD_LEFT); 323 special = tern_insert_int(special, "left", RENDERKEY_LEFT);
260 bind_gamepad(RENDERKEY_RIGHT, 1, DPAD_RIGHT); 324 special = tern_insert_int(special, "right", RENDERKEY_RIGHT);
261 bind_gamepad('a', 1, BUTTON_A); 325 special = tern_insert_int(special, "enter", '\r');
262 bind_gamepad('s', 1, BUTTON_B); 326
263 bind_gamepad('d', 1, BUTTON_C); 327 tern_node * padbuttons = tern_insert_int(NULL, ".up", DPAD_UP);
264 bind_gamepad('q', 1, BUTTON_X); 328 padbuttons = tern_insert_int(padbuttons, ".down", DPAD_DOWN);
265 bind_gamepad('w', 1, BUTTON_Y); 329 padbuttons = tern_insert_int(padbuttons, ".left", DPAD_LEFT);
266 bind_gamepad('e', 1, BUTTON_Z); 330 padbuttons = tern_insert_int(padbuttons, ".right", DPAD_RIGHT);
267 bind_gamepad('\r', 1, BUTTON_START); 331 padbuttons = tern_insert_int(padbuttons, ".a", BUTTON_A);
268 bind_gamepad('f', 1, BUTTON_MODE); 332 padbuttons = tern_insert_int(padbuttons, ".b", BUTTON_B);
269 bind_ui('[', UI_DEBUG_MODE_INC); 333 padbuttons = tern_insert_int(padbuttons, ".c", BUTTON_C);
270 bind_ui(']', UI_DEBUG_PAL_INC); 334 padbuttons = tern_insert_int(padbuttons, ".x", BUTTON_X);
271 bind_ui('u', UI_ENTER_DEBUGGER); 335 padbuttons = tern_insert_int(padbuttons, ".y", BUTTON_Y);
336 padbuttons = tern_insert_int(padbuttons, ".z", BUTTON_Z);
337 padbuttons = tern_insert_int(padbuttons, ".start", BUTTON_START);
338 padbuttons = tern_insert_int(padbuttons, ".mode", BUTTON_MODE);
339
340 tern_node * keys = tern_find_prefix(config, "bindingskeys");
341 process_keys(keys, special, padbuttons, NULL);
272 342
273 bind_dpad_gamepad(0, 0, RENDER_DPAD_UP, 2, DPAD_UP); 343 bind_dpad_gamepad(0, 0, RENDER_DPAD_UP, 2, DPAD_UP);
274 bind_dpad_gamepad(0, 0, RENDER_DPAD_DOWN, 2, DPAD_DOWN); 344 bind_dpad_gamepad(0, 0, RENDER_DPAD_DOWN, 2, DPAD_DOWN);
275 bind_dpad_gamepad(0, 0, RENDER_DPAD_LEFT, 2, DPAD_LEFT); 345 bind_dpad_gamepad(0, 0, RENDER_DPAD_LEFT, 2, DPAD_LEFT);
276 bind_dpad_gamepad(0, 0, RENDER_DPAD_RIGHT, 2, DPAD_RIGHT); 346 bind_dpad_gamepad(0, 0, RENDER_DPAD_RIGHT, 2, DPAD_RIGHT);