summaryrefslogtreecommitdiffstats
path: root/source/opendingux/settings.h
blob: d5405b6a02cc5613d9dc498721376748e54b51bd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/* ReGBA - Persistent settings
 *
 * Copyright (C) 2013 Dingoonity user Nebuleon
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public Licens e as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

#ifndef __REGBA_SETTINGS_H__
#define __REGBA_SETTINGS_H__

#include "common.h"

extern bool ReGBA_SaveSettings(char *cfg_name, bool PerGame);
extern void ReGBA_LoadSettings(char *cfg_name, bool PerGame);

/*
 * Returns a new memory allocation filled with the contents of the specified
 * menu's setting variables in order.
 * 
 * Input:
 *   Menu: The root of the menu whose settings are to be preserved.
 * Returns:
 *   A pointer to the first byte of the allocation created to preserve the
 *   specified menu's settings. This pointer should be treated like an opaque
 *   pointer.
 * Output assertions:
 *   a) The pointer is left allocated on the heap and it is the caller's
 *      responsibility to free it.
 *   b) The return value is non-NULL. If it is NULL, this is a fatal error.
 */
extern void* ReGBA_PreserveMenuSettings(struct Menu* Menu);

/*
 * Compares the contents of two opaque pointers containing preservations of
 * the same menu's setting variables, made by successive calls to
 * ReGBA_PreserveMenuSettings.
 * 
 * Input:
 *   Menu: The menu from which the preservations were derived.
 *   A, B: Two preservations of the same menu's setting variables.
 * Input assertions:
 *   a) Menu, A and B are non-NULL.
 *   b) Menu was the menu from which A and B were preserved.
 *   c) The number of entries in Menu and its submenus, recursively, matches
 *      the length of the allocations made for A and B times the size of
 *      uint32_t.
 * Returns:
 *   true if all setting variables in A have the same value in B; false
 *   otherwise.
 */
extern bool ReGBA_AreMenuSettingsEqual(struct Menu* Menu, void* A, void* B);

/*
 * Resolves the value of a setting that can be overridden in per-game
 * configuration.
 * 
 * Input:
 *   GlobalValue: The value of the setting being resolved, as defined in
 *     the global configuration.
 *   PerGameValue: The value of the setting being resolved, as defined in
 *     the per-game configuration. This value is 0 if there is no override
 *     defined for the setting, and the value of the setting plus 1 otherwise.
 * Returns:
 *   The value of the setting being resolved, per-game preferred.
 */
extern uint32_t ResolveSetting(uint32_t GlobalValue, uint32_t PerGameValue);

/*
 * Resolves the value of a button mapping or hotkey that can be overridden in
 * per-game configuration.
 * 
 * Input:
 *   GlobalValue: The value of the button mapping or hotkey being resolved, as
 *     defined in the global configuration.
 *   PerGameValue: The value of the button mapping or hotkey being resolved,
 *     as defined in the per-game configuration. This value is 0 if there is
 *     no override defined for the setting, and the value of the setting
 *     otherwise.
 * Returns:
 *   The value of the setting being resolved, per-game preferred.
 */
extern enum OpenDingux_Buttons ResolveButtons(enum OpenDingux_Buttons GlobalValue, enum OpenDingux_Buttons PerGameValue);

/*
 * Clears per-game setting overrides. Should be called between games after
 * saving the settings of the active game to isolate the settings of different
 * games.
 * Output assertions:
 *   All settings reachable from the alternate version of the Main Menu have
 *   overrides removed. Only global settings take effect.
 */
extern void ReGBA_ClearPerGameSettings();

#endif // !defined __REGBA_SETTINGS_H__