]> git.tdb.fi Git - ext/subsurface.git/blobdiff - macos.c
Turn subsurface into a real Mac application
[ext/subsurface.git] / macos.c
diff --git a/macos.c b/macos.c
index 4c856ce03717b652d9a7ae54cfe17809d07c05f5..47ad09e18a7197b96291d7216c5f6ae31a921b46 100644 (file)
--- a/macos.c
+++ b/macos.c
@@ -3,10 +3,13 @@
 #include "display-gtk.h"
 #include <CoreFoundation/CoreFoundation.h>
 #include <mach-o/dyld.h>
+#include "gtkosxapplication.h"
+
 
 static CFURLRef fileURL;
 static CFPropertyListRef propertyList;
 static CFMutableDictionaryRef dict = NULL;
+static GtkOSXApplication *theApp;
 
 /* macos defines CFSTR to create a CFString object from a constant,
  * but no similar macros if a C string variable is supposed to be
@@ -16,6 +19,37 @@ static CFMutableDictionaryRef dict = NULL;
                                        (_var), kCFStringEncodingMacRoman,      \
                                        kCFAllocatorNull)
 
+#define SUBSURFACE_PREFERENCES "~/Library/Preferences/org.hohndel.subsurface.plist"
+#define REL_ICON_PATH "Resources/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;
@@ -24,7 +58,7 @@ void subsurface_open_conf(void)
        SInt32 errorCode;
 
        fileURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault,
-                                               CFSTR("subsurface.pref"),// file path name
+                                               CFSTR(SUBSURFACE_PREFERENCES),// file path name
                                                kCFURLPOSIXPathStyle,    // interpret as POSIX path
                                                false );                 // is it a directory?
 
@@ -36,6 +70,8 @@ void subsurface_open_conf(void)
                                                        resourceData, kCFPropertyListImmutable,
                                                        &errorString);
                CFRelease(resourceData);
+       } else {
+               show_error(errorCode, "reading");
        }
 }
 
@@ -86,7 +122,9 @@ void subsurface_close_conf(void)
        dict = NULL;
        xmlData = CFPropertyListCreateXMLData(kCFAllocatorDefault, propertyList);
        status = CFURLWriteDataAndPropertiesToResource (fileURL, xmlData, NULL, &errorCode);
-       // some error handling - but really, what can we do?
+       if (!status) {
+               show_error(errorCode, "writing");
+       }
        CFRelease(xmlData);
        CFRelease(propertyList);
 }
@@ -96,7 +134,6 @@ const char *subsurface_USB_name()
        return "/dev/tty.SLAB_USBtoUART";
 }
 
-#define REL_ICON_PATH "Resources/Subsurface.icns"
 const char *subsurface_icon_name()
 {
        static char path[1024];
@@ -115,3 +152,18 @@ const char *subsurface_icon_name()
        }
        return "packaging/macosx/Subsurface.icns";
 }
+
+void subsurface_ui_setup(GtkSettings *settings, GtkWidget *menubar,
+               GtkWidget *vbox)
+{
+       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);
+       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);
+
+}