From 671f6544ac8b4a6eb68576b37344e84808511eb8 Mon Sep 17 00:00:00 2001 From: Dirk Hohndel Date: Wed, 23 Nov 2011 22:56:57 -0800 Subject: Split reading/writing preferences into OS specific files This adds tested code for Linux and Mac OS, implementing the api that Linus suggested. The Windows code was moved into its own file, but hasn't even been compile tested, yet. In order to have just one interface to set or get a preference value we encode TRUE as (void *) 1 and FALSE as NULL. This works consistently on all platforms and regardless of whether we have 32 or 64 bit. Signed-off-by: Dirk Hohndel --- windows.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 windows.c (limited to 'windows.c') diff --git a/windows.c b/windows.c new file mode 100644 index 000000000..df04aa0f2 --- /dev/null +++ b/windows.c @@ -0,0 +1,77 @@ +/* windows.c */ +/* implements Windows specific functions */ +#include "display-gtk.h" +#include + +static HKEY hkey; + +static int get_from_registry(HKEY hkey, const char *key) +{ + DWORD value; + DWORD len = 4; + LONG success; + + success = RegQueryValueEx(hkey, TEXT(key), NULL, NULL, + (LPBYTE) &value, &len ); + if (success != ERROR_SUCCESS) + return FALSE; /* that's what happens the first time we start */ + return value; +} + +void subsurface_open_conf(void) +{ + LONG success; + + success = RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Software\\subsurface"), 0, + KEY_QUERY_VALUE, &hkey); + if (success != ERROR_SUCCESS) { + success = RegCreateKeyEx(HKEY_CURRENT_USER, TEXT("Software\\subsurface"), + 0L, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, + NULL, &hkey, NULL); + if (success != ERROR_SUCCESS) + printf("CreateKey Software\\subsurface failed %ld\n", success); + } +} + +void subsurface_set_conf(char *name, pref_type_t type, const void *value) +{ + switch (type) { + case PREF_BOOL: + /* we simply store the value as DWORD */ + RegSetValueEx(hkey, TEXT(name), 0, REG_DWORD, (DWORD)value, 4); + break; + case PREF_STRING: + RegSetValueEx(hkey, TEXT(name), 0, REG_SZ, value, strlen(value)); + } +} + +const void *subsurface_get_conf(char *name, pref_type_t type) +{ + char *string; + int len; + + switch (type) { + case PREF_BOOL: + return get_from_registry(hkey, name) ? (void *) 1 : NULL; + case PREF_STRING: + string = malloc(80); + len = 80; + success = RegQueryValueEx(hkey, TEXT(name), NULL, NULL, + (LPBYTE) string, &len ); + if (success != ERROR_SUCCESS) { + /* that's what happens the first time we start - just return NULL */ + free(string); + return NULL; + } + return string; + } + /* we shouldn't get here */ + return NULL; +} + +void subsurface_close_conf(void) +{ + if (RegFlushKey(hkey) != ERROR_SUCCESS) + printf("RegFlushKey failed %ld\n"); + RegCloseKey(hkey); +} -- cgit v1.2.3-70-g09d2