X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=macos.c;h=47ad09e18a7197b96291d7216c5f6ae31a921b46;hb=605e063203f8a2a35a5c3be1e7129e80099dd68a;hp=25f946c81db9a52abad2547286e3f12c3b75e5ad;hpb=0a9e5aa7353476d70c4eb9866aeda979118d04e5;p=ext%2Fsubsurface.git diff --git a/macos.c b/macos.c index 25f946c..47ad09e 100644 --- a/macos.c +++ b/macos.c @@ -2,10 +2,14 @@ /* implements Mac OS X specific functions */ #include "display-gtk.h" #include +#include +#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 @@ -15,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; @@ -23,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? @@ -35,6 +70,8 @@ void subsurface_open_conf(void) resourceData, kCFPropertyListImmutable, &errorString); CFRelease(resourceData); + } else { + show_error(errorCode, "reading"); } } @@ -85,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); } @@ -94,3 +133,37 @@ const char *subsurface_USB_name() { return "/dev/tty.SLAB_USBtoUART"; } + +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"; +} + +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); + +}