summaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--Makefile3
-rw-r--r--display-gtk.h3
-rw-r--r--gtk-gui.c7
-rw-r--r--linux.c9
-rw-r--r--macos.c58
-rw-r--r--packaging/macosx/Info.plist2
-rw-r--r--windows.c9
7 files changed, 81 insertions, 10 deletions
diff --git a/Makefile b/Makefile
index f7c883999..ab933c5ce 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 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;
diff --git a/gtk-gui.c b/gtk-gui.c
index acaa9c4f6..f17120319 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 d2a92596e..bec4f08fb 100644
--- 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 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);
+
+}
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>
diff --git a/windows.c b/windows.c
index beb775aa6..53531cd01 100644
--- 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);
+}