Mercurial > repos > blastem
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); |