| 1 | #include <cstdlib> |
| 2 | #include <SimpleIni.h> |
| 3 | #include "config.hpp" |
| 4 | #include "gui.hpp" |
| 5 | |
| 6 | namespace GUI { |
| 7 | |
| 8 | /* Settings */ |
| 9 | CSimpleIniA ini(true, false, false); |
| 10 | |
| 11 | /* Window settings */ |
| 12 | int last_window_size = 1; |
| 13 | |
| 14 | /* Controls settings */ |
| 15 | SDL_Scancode KEY_A [] = { SDL_SCANCODE_A, SDL_SCANCODE_ESCAPE }; |
| 16 | SDL_Scancode KEY_B [] = { SDL_SCANCODE_S, SDL_SCANCODE_ESCAPE }; |
| 17 | SDL_Scancode KEY_SELECT[] = { SDL_SCANCODE_SPACE, SDL_SCANCODE_ESCAPE }; |
| 18 | SDL_Scancode KEY_START [] = { SDL_SCANCODE_RETURN, SDL_SCANCODE_ESCAPE }; |
| 19 | SDL_Scancode KEY_UP [] = { SDL_SCANCODE_UP, SDL_SCANCODE_ESCAPE }; |
| 20 | SDL_Scancode KEY_DOWN [] = { SDL_SCANCODE_DOWN, SDL_SCANCODE_ESCAPE }; |
| 21 | SDL_Scancode KEY_LEFT [] = { SDL_SCANCODE_LEFT, SDL_SCANCODE_ESCAPE }; |
| 22 | SDL_Scancode KEY_RIGHT [] = { SDL_SCANCODE_RIGHT, SDL_SCANCODE_ESCAPE }; |
| 23 | int BTN_UP [] = { -1, -1 }; |
| 24 | int BTN_DOWN [] = { -1, -1 }; |
| 25 | int BTN_LEFT [] = { -1, -1 }; |
| 26 | int BTN_RIGHT [] = { -1, -1 }; |
| 27 | int BTN_A [] = { -1, -1 }; |
| 28 | int BTN_B [] = { -1, -1 }; |
| 29 | int BTN_SELECT[] = { -1, -1 }; |
| 30 | int BTN_START [] = { -1, -1 }; |
| 31 | bool useJoystick[] = { false, false }; |
| 32 | |
| 33 | |
| 34 | |
| 35 | /* Ensure config directory exists */ |
| 36 | const char* get_config_path(char* buf, int buflen) |
| 37 | { |
| 38 | /* Bail on the complex stuff if we don't need it */ |
| 39 | if (!USE_CONFIG_DIR) |
| 40 | return CONFIG_FALLBACK; |
| 41 | |
| 42 | /* First, get the home directory */ |
| 43 | char homepath[CONFIG_PATH_MAX]; |
| 44 | char path[CONFIG_PATH_MAX]; |
| 45 | char * home = getenv("HOME" ); |
| 46 | if (home == NULL) |
| 47 | return CONFIG_FALLBACK; |
| 48 | |
| 49 | snprintf(homepath, sizeof(homepath), "%s/.config" , home); |
| 50 | |
| 51 | /* Then, .config as a folder */ |
| 52 | int res = mkdir(homepath, CONFIG_DIR_DEFAULT_MODE); |
| 53 | int err = errno; |
| 54 | |
| 55 | if (res == -1 && err != EEXIST) |
| 56 | return CONFIG_FALLBACK; |
| 57 | |
| 58 | snprintf(path, sizeof(path), "%s/%s" , homepath, CONFIG_DIR_NAME); |
| 59 | |
| 60 | /* Finally, CONFIG_DIR_NAME as a sub-folder */ |
| 61 | res = mkdir(path, CONFIG_DIR_DEFAULT_MODE); |
| 62 | err = errno; |
| 63 | |
| 64 | if (res == -1 && err != EEXIST) |
| 65 | return CONFIG_FALLBACK; |
| 66 | |
| 67 | snprintf(buf, buflen, "%s/settings" , path); |
| 68 | |
| 69 | return buf; |
| 70 | } |
| 71 | |
| 72 | |
| 73 | /* Load settings */ |
| 74 | void load_settings() |
| 75 | { |
| 76 | /* Files */ |
| 77 | char path[CONFIG_PATH_MAX]; |
| 78 | ini.LoadFile(get_config_path(path, sizeof(path))); |
| 79 | |
| 80 | /* Screen settings */ |
| 81 | int screen_size = atoi(ini.GetValue("screen" , "size" , "1" )); |
| 82 | if (screen_size < 1 || screen_size > 4) |
| 83 | screen_size = 1; |
| 84 | |
| 85 | set_size(screen_size); |
| 86 | |
| 87 | /* Control settings */ |
| 88 | for (int p = 0; p <= 1; p++) |
| 89 | { |
| 90 | const char* section = (p == 0) ? "controls p1" : "controls p2" ; |
| 91 | |
| 92 | useJoystick[p] = (ini.GetValue(section, "usejoy" , "no" ))[0] == 'y'; |
| 93 | if (useJoystick[p]) |
| 94 | { |
| 95 | BTN_UP[p] = atoi(ini.GetValue(section, "UP" , "-1" )); |
| 96 | BTN_DOWN[p] = atoi(ini.GetValue(section, "DOWN" , "-1" )); |
| 97 | BTN_LEFT[p] = atoi(ini.GetValue(section, "LEFT" , "-1" )); |
| 98 | BTN_RIGHT[p] = atoi(ini.GetValue(section, "RIGHT" , "-1" )); |
| 99 | BTN_A[p] = atoi(ini.GetValue(section, "A" , "-1" )); |
| 100 | BTN_B[p] = atoi(ini.GetValue(section, "B" , "-1" )); |
| 101 | BTN_SELECT[p] = atoi(ini.GetValue(section, "SELECT" , "-1" )); |
| 102 | BTN_START[p] = atoi(ini.GetValue(section, "START" , "-1" )); |
| 103 | } |
| 104 | else |
| 105 | { |
| 106 | KEY_UP[p] = (SDL_Scancode)atoi(ini.GetValue(section, "UP" , "82" )); |
| 107 | KEY_DOWN[p] = (SDL_Scancode)atoi(ini.GetValue(section, "DOWN" , "81" )); |
| 108 | KEY_LEFT[p] = (SDL_Scancode)atoi(ini.GetValue(section, "LEFT" , "80" )); |
| 109 | KEY_RIGHT[p] = (SDL_Scancode)atoi(ini.GetValue(section, "RIGHT" , "79" )); |
| 110 | KEY_A[p] = (SDL_Scancode)atoi(ini.GetValue(section, "A" , "4" )); |
| 111 | KEY_B[p] = (SDL_Scancode)atoi(ini.GetValue(section, "B" , "22" )); |
| 112 | KEY_SELECT[p] = (SDL_Scancode)atoi(ini.GetValue(section, "SELECT" , "44" )); |
| 113 | KEY_START[p] = (SDL_Scancode)atoi(ini.GetValue(section, "START" , "40" )); |
| 114 | } |
| 115 | } |
| 116 | } |
| 117 | |
| 118 | |
| 119 | /* Save settings */ |
| 120 | void save_settings() |
| 121 | { |
| 122 | /* Screen settings */ |
| 123 | char buf[10]; |
| 124 | sprintf(buf, "%d" , last_window_size); |
| 125 | ini.SetValue("screen" , "size" , buf); |
| 126 | |
| 127 | /* Control settings */ |
| 128 | for (int p = 0; p < 2; p++) |
| 129 | { |
| 130 | const char* section = (p == 0) ? "controls p1" : "controls p2" ; |
| 131 | |
| 132 | sprintf(buf, "%d" , useJoystick[p] ? BTN_UP[p] : KEY_UP[p]); |
| 133 | ini.SetValue(section, "UP" , buf); |
| 134 | sprintf(buf, "%d" , useJoystick[p] ? BTN_DOWN[p] : KEY_DOWN[p]); |
| 135 | ini.SetValue(section, "DOWN" , buf); |
| 136 | sprintf(buf, "%d" , useJoystick[p] ? BTN_LEFT[p] : KEY_LEFT[p]); |
| 137 | ini.SetValue(section, "LEFT" , buf); |
| 138 | sprintf(buf, "%d" , useJoystick[p] ? BTN_RIGHT[p] : KEY_RIGHT[p]); |
| 139 | ini.SetValue(section, "RIGHT" , buf); |
| 140 | sprintf(buf, "%d" , useJoystick[p] ? BTN_A[p] : KEY_A[p]); |
| 141 | ini.SetValue(section, "A" , buf); |
| 142 | sprintf(buf, "%d" , useJoystick[p] ? BTN_B[p] : KEY_B[p]); |
| 143 | ini.SetValue(section, "B" , buf); |
| 144 | sprintf(buf, "%d" , useJoystick[p] ? BTN_SELECT[p] : KEY_SELECT[p]); |
| 145 | ini.SetValue(section, "SELECT" , buf); |
| 146 | sprintf(buf, "%d" , useJoystick[p] ? BTN_START[p] : KEY_START[p]); |
| 147 | ini.SetValue(section, "START" , buf); |
| 148 | ini.SetValue(section, "usejoy" , useJoystick[p] ? "yes" : "no" ); |
| 149 | } |
| 150 | |
| 151 | char path[CONFIG_PATH_MAX]; |
| 152 | ini.SaveFile(get_config_path(path, sizeof(path))); |
| 153 | } |
| 154 | |
| 155 | } |
| 156 | |