summaryrefslogtreecommitdiffstats
path: root/macos.c
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2012-01-01 13:41:47 -0800
committerGravatar Dirk Hohndel <dirk@hohndel.org>2012-01-01 14:01:38 -0800
commit605e063203f8a2a35a5c3be1e7129e80099dd68a (patch)
tree6685618f4c773ad901d33708ed4468f6210447bd /macos.c
parent565736a471e9ba66cbc68ce76c90d5e0c2fa57cf (diff)
downloadsubsurface-605e063203f8a2a35a5c3be1e7129e80099dd68a.tar.gz
Turn subsurface into a real Mac application
To do this a few things needed to move into the os specific files, but the overall change is fairly small and the difference on the Mac is amazing. Subsurface now becomes a Mac app with Mac toolbar and useful default fonts. Changed the CFBundleIdentifier to be the reverse DNS of the subsurface site (sadly, 'torvalds' is not yet a TLD). Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'macos.c')
-rw-r--r--macos.c58
1 files changed, 55 insertions, 3 deletions
diff --git a/macos.c b/macos.c
index 4c856ce03..47ad09e18 100644
--- 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);
+
+}