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>
This commit is contained in:
Dirk Hohndel 2012-01-01 13:41:47 -08:00
parent 565736a471
commit 605e063203
7 changed files with 81 additions and 10 deletions

View file

@ -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)

View 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;

View file

@ -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);

View file

@ -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);
}

58
macos.c
View file

@ -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);
}

View 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>

View file

@ -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);
}