/** * @file menu.h * * @brief Handle the important game menus. */ #include #include #include "log.h" #include "lephisto.h" #include "input.h" #include "toolkit.h" #include "options.h" #define KEYBINDS_WIDTH 400 /**< Options menu width. */ #define KEYBINDS_HEIGHT 300 /**< Options menu height. */ #define BUTTON_WIDTH 90 /**< Button width, standard across menus. */ #define BUTTON_HEIGHT 30 /**< Button height, standard across menus. */ /* Extern. */ extern const char* keybindNames[]; static const char* modToText(SDLMod mod); static void menuKeybinds_update(unsigned int wid, char* name); /** * @brief Opens the keybindings menu. */ void opt_menuKeybinds(void) { int i, j; unsigned int wid; char** str; /* Create the window. */ wid = window_create("Keybindings", -1, -1, KEYBINDS_WIDTH, KEYBINDS_HEIGHT); window_addButton(wid, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnClose", "Close", window_close); /* Text stuff. */ window_addText(wid, 200, -40, KEYBINDS_WIDTH-220, 30, 1, "txtName", NULL, &cDConsole, NULL); window_addText(wid, 200, -90, KEYBINDS_WIDTH-220, KEYBINDS_HEIGHT-70-60-BUTTON_HEIGHT, 0, "txtDesc", &gl_smallFont, NULL, NULL); /* Create the list. */ for(i = 0; strcmp(keybindNames[i], "end"); i++); str = malloc(sizeof(char*) * (i-1)); for(j = 0; j < i; j++) str[j] = strdup(keybindNames[j]); window_addList(wid, 20, -40, 160, KEYBINDS_HEIGHT-60, "lstKeybinds", str, i-1, 0, menuKeybinds_update); /* Update the list. */ menuKeybinds_update(wid, NULL); } /** * @brief Gets the human readable version of mod. */ static const char* modToText(SDLMod mod) { switch(mod) { case KMOD_LCTRL: return "lctrl"; case KMOD_RCTRL: return "rctrl"; case KMOD_LSHIFT: return "lshift"; case KMOD_RSHIFT: return "rshift"; case KMOD_LALT: return "lalt"; case KMOD_RALT: return "ralt"; case KMOD_LMETA: return "lmeta"; case KMOD_RMETA: return "rmeta"; case KMOD_ALL: return "any"; default: return "unknown"; } } /** * @brief Updates the keybindings menu. */ static void menuKeybinds_update(unsigned int wid, char* name) { (void) name; char* keybind; const char* desc; SDLKey key; KeybindType type; SDLMod mod; int reverse; char buf[1024]; char pre[32]; char bind[32]; /* Get the keybind. */ keybind = toolkit_getList(wid, "lstKeybinds"); window_modifyText(wid, "txtName", keybind); /* Get information. */ desc = input_getKeybindDescription(keybind); key = input_getKeybind(keybind, &type, &mod, &reverse); /* Create the text. */ switch(type) { case KEYBIND_NULL: snprintf(bind, 64, "Not bound"); break; case KEYBIND_KEYBOARD: snprintf(pre, 32, "keyboard: %s%s", (mod != KMOD_NONE) ? modToText(mod) : "", (mod != KMOD_NONE) ? " + " : ""); /* Is key. */ if(isalnum(key)) snprintf(bind, 32, "%s%c", pre, toupper((char)key)); else snprintf(bind, 32, "%s<%d>", pre, key); break; case KEYBIND_JAXIS: snprintf(bind, 64, "joy axis: <%d>%s", key, (reverse) ? " rev" : ""); break; case KEYBIND_JBUTTON: snprintf(bind, 64, "joy button: <%d>", key); break; } snprintf(buf, 1024, "%s\n\n%s\n", desc, bind); window_modifyText(wid, "txtDesc", buf); }