aboutsummaryrefslogtreecommitdiffstats
path: root/macos.c
diff options
context:
space:
mode:
Diffstat (limited to 'macos.c')
-rw-r--r--macos.c91
1 files changed, 91 insertions, 0 deletions
diff --git a/macos.c b/macos.c
new file mode 100644
index 000000000..b48f20d87
--- /dev/null
+++ b/macos.c
@@ -0,0 +1,91 @@
+/* macos.c */
+/* implements Mac OS X specific functions */
+#include "display-gtk.h"
+#include <CoreFoundation/CoreFoundation.h>
+
+static CFURLRef fileURL;
+static CFPropertyListRef propertyList;
+static CFMutableDictionaryRef dict = NULL;
+
+/* macos defines CFSTR to create a CFString object from a constant,
+ * but no similar macros if a C string variable is supposed to be
+ * the argument. We add this here (hardcoding the default allocator
+ * and MacRoman encoding */
+#define CFSTR_VAR(_var) CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, \
+ (_var), kCFStringEncodingMacRoman, \
+ kCFAllocatorNull)
+
+void subsurface_open_conf(void)
+{
+ CFStringRef errorString;
+ CFDataRef resourceData;
+ Boolean status;
+ SInt32 errorCode;
+
+ fileURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault,
+ CFSTR("subsurface.pref"),// file path name
+ kCFURLPOSIXPathStyle, // interpret as POSIX path
+ false ); // is it a directory?
+
+ status = CFURLCreateDataAndPropertiesFromResource(kCFAllocatorDefault,
+ fileURL, &resourceData,
+ NULL, NULL, &errorCode);
+ if (status) {
+ propertyList = CFPropertyListCreateFromXMLData(kCFAllocatorDefault,
+ resourceData, kCFPropertyListImmutable,
+ &errorString);
+ CFRelease(resourceData);
+ }
+}
+
+void subsurface_set_conf(char *name, pref_type_t type, const void *value)
+{
+ if (!dict)
+ dict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
+ &kCFTypeDictionaryKeyCallBacks,
+ &kCFTypeDictionaryValueCallBacks);
+ switch (type) {
+ case PREF_BOOL:
+ CFDictionarySetValue(dict, CFSTR_VAR(name), value == NULL ? CFSTR("0") : CFSTR("1"));
+ break;
+ case PREF_STRING:
+ CFDictionarySetValue(dict, CFSTR_VAR(name), CFSTR_VAR(value));
+ }
+}
+const void *subsurface_get_conf(char *name, pref_type_t type)
+{
+ CFStringRef dict_entry;
+
+ /* if no settings exist, we return the value for FALSE */
+ if (!propertyList)
+ return NULL;
+
+ switch (type) {
+ case PREF_BOOL:
+ dict_entry = CFDictionaryGetValue(propertyList, CFSTR_VAR(name));
+ if (dict_entry && ! CFStringCompare(CFSTR("1"), dict_entry, 0))
+ return (void *) 1;
+ else
+ return NULL;
+ case PREF_STRING:
+ return CFStringGetCStringPtr(CFDictionaryGetValue(propertyList,
+ CFSTR_VAR(name)), kCFStringEncodingMacRoman);
+ }
+ /* we shouldn't get here, but having this line makes the compiler happy */
+ return NULL;
+}
+
+void subsurface_close_conf(void)
+{
+ Boolean status;
+ SInt32 errorCode;
+ CFDataRef xmlData;
+
+ propertyList = dict;
+ dict = NULL;
+ xmlData = CFPropertyListCreateXMLData(kCFAllocatorDefault, propertyList);
+ status = CFURLWriteDataAndPropertiesToResource (fileURL, xmlData, NULL, &errorCode);
+ // some error handling - but really, what can we do?
+ CFRelease(xmlData);
+ CFRelease(propertyList);
+}