diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2012-01-01 13:41:47 -0800 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2012-01-01 14:01:38 -0800 |
commit | 605e063203f8a2a35a5c3be1e7129e80099dd68a (patch) | |
tree | 6685618f4c773ad901d33708ed4468f6210447bd | |
parent | 565736a471e9ba66cbc68ce76c90d5e0c2fa57cf (diff) | |
download | subsurface-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>
-rw-r--r-- | Makefile | 3 | ||||
-rw-r--r-- | display-gtk.h | 3 | ||||
-rw-r--r-- | gtk-gui.c | 7 | ||||
-rw-r--r-- | linux.c | 9 | ||||
-rw-r--r-- | macos.c | 58 | ||||
-rw-r--r-- | packaging/macosx/Info.plist | 2 | ||||
-rw-r--r-- | windows.c | 9 |
7 files changed, 81 insertions, 10 deletions
@@ -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 23fea912a..35380fa27 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; @@ -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); @@ -2,6 +2,7 @@ /* implements Linux specific functions */ #include "display-gtk.h" #include <gconf/gconf-client.h> +#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); +} @@ -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); + +} diff --git a/packaging/macosx/Info.plist b/packaging/macosx/Info.plist index 4ee12438b..e69d5b02d 100644 --- a/packaging/macosx/Info.plist +++ b/packaging/macosx/Info.plist @@ -15,6 +15,6 @@ <key>CFBundleExecutable</key> <string>subsurface.sh</string> <key>CFBundleIdentifier</key> - <string>torvalds.subsurface</string> + <string>org.hohndel.subsurface</string> </dict> </plist> @@ -2,6 +2,7 @@ /* implements Windows specific functions */ #include "display-gtk.h" #include <windows.h> +#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); +} |