mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
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:
parent
565736a471
commit
605e063203
7 changed files with 81 additions and 10 deletions
3
Makefile
3
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)
|
||||
|
|
|
@ -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);
|
||||
|
|
9
linux.c
9
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);
|
||||
}
|
||||
|
|
58
macos.c
58
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);
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue