]> git.tdb.fi Git - ext/subsurface.git/commitdiff
Turn subsurface into a real Mac application
authorDirk Hohndel <dirk@hohndel.org>
Sun, 1 Jan 2012 21:41:47 +0000 (13:41 -0800)
committerDirk Hohndel <dirk@hohndel.org>
Sun, 1 Jan 2012 22:01:38 +0000 (14:01 -0800)
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>
Makefile
display-gtk.h
gtk-gui.c
linux.c
macos.c
packaging/macosx/Info.plist
windows.c

index f7c88399975c65d9c57be33bce20f9643708e548..ab933c5ce7db651f01cf7b80c190748804f2c83d 100644 (file)
--- 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)
index 23fea912a9098af2fea81995601382cc023f4b75..35380fa278f84d68b83069ee21f50acbb6d82374 100644 (file)
@@ -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;
 
index acaa9c4f6a2510d3a57d265550fcb77b6a296d37..f17120319610c1de7b508a0391ca5158a19d4ac3 100644 (file)
--- 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 d2a92596ebbcde791bc8008206ebbef8c2b35ceb..bec4f08fb2e96b2284cf12ecaf7be29cb5ede78d 100644 (file)
--- a/linux.c
+++ b/linux.c
@@ -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);
+}
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);
+
+}
index 4ee12438b4eee8fcce7e70d4e3ecbc15e2b76b3e..e69d5b02dabf6edb76decbbdf760f0a4c07215ee 100644 (file)
@@ -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>
index beb775aa627a71c3e6acf54a15cc650f217f6f4d..53531cd010cfa9609cb4c710164734ad05e0f983 100644 (file)
--- a/windows.c
+++ b/windows.c
@@ -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);
+}