From: Dirk Hohndel Date: Sun, 1 Jan 2012 21:41:47 +0000 (-0800) Subject: Turn subsurface into a real Mac application X-Git-Url: http://git.tdb.fi/?a=commitdiff_plain;h=605e063203f8a2a35a5c3be1e7129e80099dd68a;p=ext%2Fsubsurface.git 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 --- diff --git a/Makefile b/Makefile index f7c8839..ab933c5 100644 --- a/Makefile +++ b/Makefile @@ -97,7 +97,8 @@ else ifeq ($(UNAME), darwin) OSSUPPORT_CFLAGS = $(GTK2CFLAGS) MACOSXINSTALL = /Applications/Subsurface.app MACOSXFILES = packaging/macosx - EXTRALIBS = -framework CoreFoundation + EXTRALIBS = `$(PKGCONFIG) --libs gtk-mac-integration` -framework CoreFoundation + CFLAGS += `$(PKGCONFIG) --cflags gtk-mac-integration` else OSSUPPORT = windows OSSUPPORT_CFLAGS = $(GTK2CFLAGS) diff --git a/display-gtk.h b/display-gtk.h index 23fea91..35380fa 100644 --- a/display-gtk.h +++ b/display-gtk.h @@ -34,6 +34,9 @@ extern void subsurface_close_conf(void); extern const char *subsurface_USB_name(void); extern const char *subsurface_icon_name(void); +extern void subsurface_ui_setup(GtkSettings *settings, GtkWidget *menubar, GtkWidget *vbox); + +extern const char *divelist_font; extern visible_cols_t visible_cols; diff --git a/gtk-gui.c b/gtk-gui.c index acaa9c4..f171203 100644 --- a/gtk-gui.c +++ b/gtk-gui.c @@ -22,7 +22,6 @@ GtkWidget *error_label; GtkWidget *vpane, *hpane; int error_count; -#define DIVELIST_DEFAULT_FONT "Sans 8" const char *divelist_font; struct units output_units; @@ -681,9 +680,6 @@ void init_ui(int *argcp, char ***argvp) divelist_font = subsurface_get_conf("divelist_font", PREF_STRING); - if (!divelist_font) - divelist_font = DIVELIST_DEFAULT_FONT; - error_info_bar = NULL; win = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_set_application_name ("subsurface"); @@ -709,7 +705,8 @@ void init_ui(int *argcp, char ***argvp) main_vbox = vbox; menubar = get_menubar_menu(win); - gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0); + + subsurface_ui_setup(settings, menubar, vbox); vpane = gtk_vpaned_new(); gtk_box_pack_start(GTK_BOX(vbox), vpane, TRUE, TRUE, 3); diff --git a/linux.c b/linux.c index d2a9259..bec4f08 100644 --- a/linux.c +++ b/linux.c @@ -2,6 +2,7 @@ /* implements Linux specific functions */ #include "display-gtk.h" #include +#define DIVELIST_DEFAULT_FONT "Sans 8" GConfClient *gconf; @@ -56,3 +57,11 @@ const char *subsurface_icon_name() { return "subsurface.svg"; } + +void subsurface_ui_setup(GtkSettings *settings, GtkWidget *menubar, + GtkWidget *vbox) +{ + if (!divelist_font) + divelist_font = DIVELIST_DEFAULT_FONT; + gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0); +} diff --git a/macos.c b/macos.c index 4c856ce..47ad09e 100644 --- a/macos.c +++ b/macos.c @@ -3,10 +3,13 @@ #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 @@ -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); + +} diff --git a/packaging/macosx/Info.plist b/packaging/macosx/Info.plist index 4ee1243..e69d5b0 100644 --- a/packaging/macosx/Info.plist +++ b/packaging/macosx/Info.plist @@ -15,6 +15,6 @@ CFBundleExecutable subsurface.sh CFBundleIdentifier - torvalds.subsurface + org.hohndel.subsurface diff --git a/windows.c b/windows.c index beb775a..53531cd 100644 --- a/windows.c +++ b/windows.c @@ -2,6 +2,7 @@ /* implements Windows specific functions */ #include "display-gtk.h" #include +#define DIVELIST_DEFAULT_FONT "Sans 8" static HKEY hkey; @@ -88,3 +89,11 @@ const char *subsurface_icon_name() { return "subsurface.ico"; } + +void subsurface_ui_setup(GtkSettings *settings, GtkWidget *menubar, + GtkWidget *vbox) +{ + if (!divelist_font) + divelist_font = DIVELIST_DEFAULT_FONT; + gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0); +}