X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=common%2Fconfig.c;h=63c8f00ccbe2cdba30f3d40371993529cb3c937d;hb=fce20e73e7094060b29f1668b8f0032f75eb152e;hp=f8fe5d04272849ffa599fdaab32694cf122bc8ef;hpb=36f6fd5afec3bd982c715f6d39d5712dacb237cd;p=libpicofe.git diff --git a/common/config.c b/common/config.c index f8fe5d0..63c8f00 100644 --- a/common/config.c +++ b/common/config.c @@ -6,10 +6,11 @@ #include #include #include -#ifdef UIQ3 +#ifdef __EPOC32__ #include #endif #include "config.h" +#include "input.h" #include "lprintf.h" static char *mystrip(char *str); @@ -18,7 +19,7 @@ static char *mystrip(char *str); #include "menu.h" #include "emu.h" -#include +#include extern menu_entry opt_entries[]; extern menu_entry opt2_entries[]; @@ -208,41 +209,30 @@ static void custom_write(FILE *f, const menu_entry *me, int no_def) } -#if PLAT_HAVE_JOY -static const char *joyKeyNames[32] = +static void keys_write(FILE *fn, const char *bind_str, int dev_id, const int *binds, int no_defaults) { - "UP", "DOWN", "LEFT", "RIGHT", "b1", "b2", "b3", "b4", - "b5", "b6", "b7", "b8", "b9", "b10", "b11", "b12", - "b13", "b14", "b15", "b16", "b17", "b19", "b19", "b20", - "b21", "b22", "b23", "b24", "b25", "b26", "b27", "b28" -}; -#endif + char act[48]; + int key_count, t, i; + const int *def_binds; -static void keys_write(FILE *fn, const char *bind_str, const int binds[32], - const int def_binds[32], const char * const names[32], int key_count, int no_defaults) -{ - int t, i; - char act[48], name[32]; + key_count = in_get_dev_bind_count(dev_id); + def_binds = in_get_dev_def_binds(dev_id); for (t = 0; t < key_count; t++) { + const char *name; act[0] = act[31] = 0; + if (no_defaults && binds[t] == def_binds[t]) continue; + + name = in_get_key_name(dev_id, t); #ifdef __GP2X__ - if (strcmp(names[t], "SELECT") == 0) continue; + if (strcmp(name, "SELECT") == 0) continue; #endif - if (t >= 32 || names[t] == NULL || strcmp(names[t], "???") == 0) { - if ((t >= '0' && t <= '9') || (t >= 'a' && t <= 'z') || (t >= 'A' && t <= 'Z')) - sprintf(name, "%c", t); - else - sprintf(name, "\\x%02x", t); - } - else - strcpy(name, names[t]); if (binds[t] == 0 && def_binds[t] != 0) { - fprintf(fn, "%s %s =" NL, bind_str, name); // no binds + fprintf(fn, "%s %s =" NL, bind_str, name); continue; } @@ -397,14 +387,34 @@ write: } } - // save key config - keys_write(fn, "bind", currentConfig.KeyBinds, defaultConfig.KeyBinds, keyNames, PLAT_MAX_KEYS, no_defaults); -#if PLAT_HAVE_JOY - keys_write(fn, "bind_joy0", currentConfig.JoyBinds[0], defaultConfig.JoyBinds[0], joyKeyNames, 32, 1); - keys_write(fn, "bind_joy1", currentConfig.JoyBinds[1], defaultConfig.JoyBinds[1], joyKeyNames, 32, 1); - keys_write(fn, "bind_joy2", currentConfig.JoyBinds[2], defaultConfig.JoyBinds[2], joyKeyNames, 32, 1); - keys_write(fn, "bind_joy3", currentConfig.JoyBinds[3], defaultConfig.JoyBinds[3], joyKeyNames, 32, 1); -#endif + /* input: save device names */ + for (t = 0; t < IN_MAX_DEVS; t++) + { + const int *binds = in_get_dev_binds(t); + const char *name = in_get_dev_name(t, 0); + if (binds == NULL || name == NULL) + continue; + + fprintf(fn, "input%d = %s" NL, t, name); + } + + /* input: save binds */ + for (t = 0; t < IN_MAX_DEVS; t++) + { + const int *binds = in_get_dev_binds(t); + const char *name = in_get_dev_name(t, 0); + char strbind[16]; + int count; + + if (binds == NULL || name == NULL) + continue; + + sprintf(strbind, "bind%d", t); + if (t == 0) strbind[4] = 0; + + count = in_get_dev_bind_count(t); + keys_write(fn, strbind, t, binds, no_defaults); + } #ifndef PSP if (section == NULL) @@ -702,70 +712,64 @@ static int custom_read(menu_entry *me, const char *var, const char *val) static unsigned int keys_encountered = 0; -static void keys_parse(const char *var, const char *val, int binds[32], - const char * const names[32], int max_keys) +static int parse_bind_val(const char *val) { - int t, i; - unsigned int player; - - for (t = 0; t < 32; t++) - { - if (names[t] && strcmp(names[t], var) == 0) break; - } - if (t == 32) - { - int len = strlen(var); - if (len == 1) t = var[0]; - else if (len >= 4 && var[0] == '\\' && var[1] == 'x') { - char *p; - t = (int)strtoul(var + 2, &p, 16); - if (*p != 0) t = max_keys; // parse failed - } - else - t = max_keys; // invalid - } - if (t < 0 || t >= max_keys) { - lprintf("unhandled bind \"%s\"\n", var); - return; - } + int i; - if (binds == currentConfig.KeyBinds && !(keys_encountered & (1< 1) goto fail; + if (player > 1) + return -1; + for (i = 0; i < sizeof(me_ctrl_actions) / sizeof(me_ctrl_actions[0]); i++) { - if (strncasecmp(me_ctrl_actions[i].name, val + 8, strlen(val + 8)) == 0) { - binds[t] |= me_ctrl_actions[i].mask | (player<<16); - return; - } + if (strncasecmp(me_ctrl_actions[i].name, val + 8, strlen(val + 8)) == 0) + return me_ctrl_actions[i].mask | (player<<16); } } for (i = 0; emuctrl_actions[i].name != NULL; i++) { - if (strncasecmp(emuctrl_actions[i].name, val, strlen(val)) == 0) { - binds[t] |= emuctrl_actions[i].mask; - return; - } + if (strncasecmp(emuctrl_actions[i].name, val, strlen(val)) == 0) + return emuctrl_actions[i].mask; + } + + return -1; +} + +static void keys_parse(const char *key, const char *val, int dev_id) +{ + int binds; + + binds = parse_bind_val(val); + if (binds == -1) { + lprintf("config: unhandled action \"%s\"\n", val); + return; } -fail: - lprintf("unhandled action \"%s\"\n", val); - return; + in_config_bind_key(dev_id, key, binds); } +static int get_numvar_num(const char *var) +{ + char *p = NULL; + int num; + + if (var[0] == ' ') + return 0; + + num = strtoul(var, &p, 10); + if (*p == 0 || *p == ' ') + return num; -#define try_joy_parse(num) { \ - if (strncasecmp(var, "bind_joy"#num " ", 10) == 0) { \ - keys_parse(var + 10, val, currentConfig.JoyBinds[num], joyKeyNames, 32); \ - return; \ - } \ + return -1; } +/* map dev number in confing to input dev number */ +static unsigned char input_dev_map[IN_MAX_DEVS]; + static void parse(const char *var, const char *val) { menu_entry *me; @@ -779,17 +783,36 @@ static void parse(const char *var, const char *val) return; } + /* input: device name */ + if (strncasecmp(var, "input", 5) == 0) { + int num = get_numvar_num(var + 5); + if (num >= 0 && num < IN_MAX_DEVS) + input_dev_map[num] = in_config_parse_dev(val); + else + lprintf("config: failed to parse: %s\n", var); + return; + } + // key binds - if (strncasecmp(var, "bind ", 5) == 0) { - keys_parse(var + 5, val, currentConfig.KeyBinds, keyNames, PLAT_MAX_KEYS); + if (strncasecmp(var, "bind", 4) == 0) { + const char *p = var + 4; + int num = get_numvar_num(p); + if (num < 0 || num >= IN_MAX_DEVS) { + lprintf("config: failed to parse: %s\n", var); + return; + } + + num = input_dev_map[num]; + if (num < 0 || num >= IN_MAX_DEVS) { + lprintf("config: invalid device id: %s\n", var); + return; + } + + while (*p && *p != ' ') p++; + while (*p && *p == ' ') p++; + keys_parse(p, val, num); return; } -#if PLAT_HAVE_JOY - try_joy_parse(0) - try_joy_parse(1) - try_joy_parse(2) - try_joy_parse(3) -#endif for (t = 0; t < sizeof(cfg_opts) / sizeof(cfg_opts[0]) && ret == 0; t++) { @@ -853,7 +876,9 @@ int config_readsect(const char *fname, const char *section) } keys_encountered = 0; + memset(input_dev_map, 0xff, sizeof(input_dev_map)); + in_config_start(); while (!feof(f)) { ret = config_get_var_val(f, line, sizeof(line), &var, &val); @@ -862,6 +887,7 @@ int config_readsect(const char *fname, const char *section) parse(var, val); } + in_config_end(); fclose(f); return 0;