]> git.tdb.fi Git - ext/subsurface.git/blobdiff - macos.c
Fix profile and average depth for freedives
[ext/subsurface.git] / macos.c
diff --git a/macos.c b/macos.c
index 47ad09e18a7197b96291d7216c5f6ae31a921b46..1b7da1ec6192e6143809cda9787a91fafc5045e8 100644 (file)
--- a/macos.c
+++ b/macos.c
@@ -5,11 +5,7 @@
 #include <mach-o/dyld.h>
 #include "gtkosxapplication.h"
 
-
-static CFURLRef fileURL;
-static CFPropertyListRef propertyList;
-static CFMutableDictionaryRef dict = NULL;
-static GtkOSXApplication *theApp;
+static GtkOSXApplication *osx_app;
 
 /* macos defines CFSTR to create a CFString object from a constant,
  * but no similar macros if a C string variable is supposed to be
@@ -19,114 +15,60 @@ static GtkOSXApplication *theApp;
                                        (_var), kCFStringEncodingMacRoman,      \
                                        kCFAllocatorNull)
 
-#define SUBSURFACE_PREFERENCES "~/Library/Preferences/org.hohndel.subsurface.plist"
-#define REL_ICON_PATH "Resources/Subsurface.icns"
+#define SUBSURFACE_PREFERENCES CFSTR("org.hohndel.subsurface")
+#define ICON_NAME "Subsurface.icns"
 #define UI_FONT "Arial Unicode MS 12"
 #define DIVELIST_MAC_DEFAULT_FONT "Arial Unicode MS 9"
 
-static void show_error(SInt32 errorCode, char *action)
-{
-       char *errortext;
-
-       switch(errorCode) {
-       case -11: errortext = "kCFURLUnknownSchemeError";
-               break;
-       case -12: errortext = "kCFURLResourceNotFoundError";
-               break;
-       case -13: errortext = "kCFURLResourceAccessViolationError";
-               break;
-       case -14: errortext = "kCFURLRemoteHostUnavailableError";
-               break;
-       case -15: errortext = "kCFURLImproperArgumentsError";
-               break;
-       case -16: errortext = "kCFURLUnknownPropertyKeyError";
-               break;
-       case -17: errortext = "kCFURLPropertyKeyUnavailableError";
-               break;
-       case -18: errortext = "kCFURLTimeoutError";
-               break;
-       default: errortext = "kCFURLUnknownError";
-       };
-       fprintf(stderr, "Error %s preferences: %s\n", action, errortext);
-}
-
 void subsurface_open_conf(void)
 {
-       CFStringRef errorString;
-       CFDataRef resourceData;
-       Boolean status;
-       SInt32 errorCode;
-
-       fileURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault,
-                                               CFSTR(SUBSURFACE_PREFERENCES),// 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);
-       } else {
-               show_error(errorCode, "reading");
-       }
+       /* nothing at this time */
 }
 
 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"));
+               CFPreferencesSetAppValue(CFSTR_VAR(name),
+                       value == NULL ? kCFBooleanFalse : kCFBooleanTrue, SUBSURFACE_PREFERENCES);
                break;
        case PREF_STRING:
-               CFDictionarySetValue(dict, CFSTR_VAR(name), CFSTR_VAR(value));
+               CFPreferencesSetAppValue(CFSTR_VAR(name), CFSTR_VAR(value), SUBSURFACE_PREFERENCES);
        }
 }
+
 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;
+       Boolean boolpref;
+       CFPropertyListRef strpref;
 
        switch (type) {
        case PREF_BOOL:
-               dict_entry = CFDictionaryGetValue(propertyList, CFSTR_VAR(name));
-               if (dict_entry && ! CFStringCompare(CFSTR("1"), dict_entry, 0))
+               boolpref = CFPreferencesGetAppBooleanValue(CFSTR_VAR(name), SUBSURFACE_PREFERENCES, FALSE);
+               if (boolpref)
                        return (void *) 1;
                else
                        return NULL;
        case PREF_STRING:
-               return CFStringGetCStringPtr(CFDictionaryGetValue(propertyList,
-                                               CFSTR_VAR(name)), kCFStringEncodingMacRoman);
+               strpref = CFPreferencesCopyAppValue(CFSTR_VAR(name), SUBSURFACE_PREFERENCES);
+               if (!strpref)
+                       return NULL;
+               return CFStringGetCStringPtr(strpref, kCFStringEncodingMacRoman);
        }
        /* we shouldn't get here, but having this line makes the compiler happy */
        return NULL;
 }
 
+void subsurface_flush_conf(void)
+{
+       int ok = CFPreferencesAppSynchronize(SUBSURFACE_PREFERENCES);
+       if (!ok)
+               fprintf(stderr,"Could not save preferences\n");
+}
+
 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);
-       if (!status) {
-               show_error(errorCode, "writing");
-       }
-       CFRelease(xmlData);
-       CFRelease(propertyList);
+       /* Nothing */
 }
 
 const char *subsurface_USB_name()
@@ -137,33 +79,45 @@ const char *subsurface_USB_name()
 const char *subsurface_icon_name()
 {
        static char path[1024];
-       char *ptr1, *ptr2;
-       uint32_t size = sizeof(path); /* need extra space to copy icon path */
-       if (_NSGetExecutablePath(path, &size) == 0) {
-               ptr1 = strcasestr(path,"MacOS/subsurface");
-               ptr2 = strcasestr(path,"Contents");
-               if (ptr1 && ptr2) {
-                       /* we are running as installed app from a bundle */
-                       if (ptr1 - path < size - strlen(REL_ICON_PATH)) {
-                               strcpy(ptr1,REL_ICON_PATH);
-                               return path;
-                       }
-               }
-       }
-       return "packaging/macosx/Subsurface.icns";
+
+       snprintf(path, 1024, "%s/%s", quartz_application_get_resource_path(), ICON_NAME);
+
+       return path;
 }
 
 void subsurface_ui_setup(GtkSettings *settings, GtkWidget *menubar,
-               GtkWidget *vbox)
+               GtkWidget *vbox, GtkUIManager *ui_manager)
 {
+       GtkWidget *menu_item, *sep;
+
        if (!divelist_font)
                divelist_font = DIVELIST_MAC_DEFAULT_FONT;
        g_object_set(G_OBJECT(settings), "gtk-font-name", UI_FONT, NULL);
 
-       theApp = g_object_new(GTK_TYPE_OSX_APPLICATION, NULL);
+       osx_app = g_object_new(GTK_TYPE_OSX_APPLICATION, NULL);
        gtk_widget_hide (menubar);
-       gtk_osxapplication_set_menu_bar(theApp, GTK_MENU_SHELL(menubar));
-       gtk_osxapplication_set_use_quartz_accelerators(theApp, TRUE);
-       gtk_osxapplication_ready(theApp);
+       gtk_osxapplication_set_menu_bar(osx_app, GTK_MENU_SHELL(menubar));
+
+       sep = gtk_ui_manager_get_widget(ui_manager, "/MainMenu/FileMenu/Separator2");
+       if (sep)
+               gtk_widget_destroy(sep);
+
+       menu_item = gtk_ui_manager_get_widget(ui_manager, "/MainMenu/FileMenu/Quit");
+       gtk_widget_hide (menu_item);
+       menu_item = gtk_ui_manager_get_widget(ui_manager, "/MainMenu/Help/About");
+       gtk_osxapplication_insert_app_menu_item(osx_app, menu_item, 0);
+
+       sep = gtk_separator_menu_item_new();
+       g_object_ref(sep);
+       gtk_osxapplication_insert_app_menu_item (osx_app, sep, 1);
+
+       menu_item = gtk_ui_manager_get_widget(ui_manager, "/MainMenu/FileMenu/Preferences");
+       gtk_osxapplication_insert_app_menu_item(osx_app, menu_item, 2);
+
+       sep = gtk_separator_menu_item_new();
+       g_object_ref(sep);
+       gtk_osxapplication_insert_app_menu_item (osx_app, sep, 3);
 
+       gtk_osxapplication_set_use_quartz_accelerators(osx_app, TRUE);
+       gtk_osxapplication_ready(osx_app);
 }