mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Merge branch 'mac' of git://git.hohndel.org/subsurface
* 'mac' of git://git.hohndel.org/subsurface: Turn subsurface into a real Mac application
This commit is contained in:
commit
1d51c77729
7 changed files with 81 additions and 10 deletions
3
Makefile
3
Makefile
|
@ -97,7 +97,8 @@ else ifeq ($(UNAME), darwin)
|
||||||
OSSUPPORT_CFLAGS = $(GTK2CFLAGS)
|
OSSUPPORT_CFLAGS = $(GTK2CFLAGS)
|
||||||
MACOSXINSTALL = /Applications/Subsurface.app
|
MACOSXINSTALL = /Applications/Subsurface.app
|
||||||
MACOSXFILES = packaging/macosx
|
MACOSXFILES = packaging/macosx
|
||||||
EXTRALIBS = -framework CoreFoundation
|
EXTRALIBS = `$(PKGCONFIG) --libs gtk-mac-integration` -framework CoreFoundation
|
||||||
|
CFLAGS += `$(PKGCONFIG) --cflags gtk-mac-integration`
|
||||||
else
|
else
|
||||||
OSSUPPORT = windows
|
OSSUPPORT = windows
|
||||||
OSSUPPORT_CFLAGS = $(GTK2CFLAGS)
|
OSSUPPORT_CFLAGS = $(GTK2CFLAGS)
|
||||||
|
|
|
@ -34,6 +34,9 @@ extern void subsurface_close_conf(void);
|
||||||
|
|
||||||
extern const char *subsurface_USB_name(void);
|
extern const char *subsurface_USB_name(void);
|
||||||
extern const char *subsurface_icon_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;
|
extern visible_cols_t visible_cols;
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,6 @@ GtkWidget *error_label;
|
||||||
GtkWidget *vpane, *hpane;
|
GtkWidget *vpane, *hpane;
|
||||||
int error_count;
|
int error_count;
|
||||||
|
|
||||||
#define DIVELIST_DEFAULT_FONT "Sans 8"
|
|
||||||
const char *divelist_font;
|
const char *divelist_font;
|
||||||
|
|
||||||
struct units output_units;
|
struct units output_units;
|
||||||
|
@ -681,9 +680,6 @@ void init_ui(int *argcp, char ***argvp)
|
||||||
|
|
||||||
divelist_font = subsurface_get_conf("divelist_font", PREF_STRING);
|
divelist_font = subsurface_get_conf("divelist_font", PREF_STRING);
|
||||||
|
|
||||||
if (!divelist_font)
|
|
||||||
divelist_font = DIVELIST_DEFAULT_FONT;
|
|
||||||
|
|
||||||
error_info_bar = NULL;
|
error_info_bar = NULL;
|
||||||
win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
||||||
g_set_application_name ("subsurface");
|
g_set_application_name ("subsurface");
|
||||||
|
@ -709,7 +705,8 @@ void init_ui(int *argcp, char ***argvp)
|
||||||
main_vbox = vbox;
|
main_vbox = vbox;
|
||||||
|
|
||||||
menubar = get_menubar_menu(win);
|
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();
|
vpane = gtk_vpaned_new();
|
||||||
gtk_box_pack_start(GTK_BOX(vbox), vpane, TRUE, TRUE, 3);
|
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 */
|
/* implements Linux specific functions */
|
||||||
#include "display-gtk.h"
|
#include "display-gtk.h"
|
||||||
#include <gconf/gconf-client.h>
|
#include <gconf/gconf-client.h>
|
||||||
|
#define DIVELIST_DEFAULT_FONT "Sans 8"
|
||||||
|
|
||||||
GConfClient *gconf;
|
GConfClient *gconf;
|
||||||
|
|
||||||
|
@ -56,3 +57,11 @@ const char *subsurface_icon_name()
|
||||||
{
|
{
|
||||||
return "subsurface.svg";
|
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 "display-gtk.h"
|
||||||
#include <CoreFoundation/CoreFoundation.h>
|
#include <CoreFoundation/CoreFoundation.h>
|
||||||
#include <mach-o/dyld.h>
|
#include <mach-o/dyld.h>
|
||||||
|
#include "gtkosxapplication.h"
|
||||||
|
|
||||||
|
|
||||||
static CFURLRef fileURL;
|
static CFURLRef fileURL;
|
||||||
static CFPropertyListRef propertyList;
|
static CFPropertyListRef propertyList;
|
||||||
static CFMutableDictionaryRef dict = NULL;
|
static CFMutableDictionaryRef dict = NULL;
|
||||||
|
static GtkOSXApplication *theApp;
|
||||||
|
|
||||||
/* macos defines CFSTR to create a CFString object from a constant,
|
/* macos defines CFSTR to create a CFString object from a constant,
|
||||||
* but no similar macros if a C string variable is supposed to be
|
* but no similar macros if a C string variable is supposed to be
|
||||||
|
@ -16,6 +19,37 @@ static CFMutableDictionaryRef dict = NULL;
|
||||||
(_var), kCFStringEncodingMacRoman, \
|
(_var), kCFStringEncodingMacRoman, \
|
||||||
kCFAllocatorNull)
|
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)
|
void subsurface_open_conf(void)
|
||||||
{
|
{
|
||||||
CFStringRef errorString;
|
CFStringRef errorString;
|
||||||
|
@ -24,7 +58,7 @@ void subsurface_open_conf(void)
|
||||||
SInt32 errorCode;
|
SInt32 errorCode;
|
||||||
|
|
||||||
fileURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault,
|
fileURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault,
|
||||||
CFSTR("subsurface.pref"),// file path name
|
CFSTR(SUBSURFACE_PREFERENCES),// file path name
|
||||||
kCFURLPOSIXPathStyle, // interpret as POSIX path
|
kCFURLPOSIXPathStyle, // interpret as POSIX path
|
||||||
false ); // is it a directory?
|
false ); // is it a directory?
|
||||||
|
|
||||||
|
@ -36,6 +70,8 @@ void subsurface_open_conf(void)
|
||||||
resourceData, kCFPropertyListImmutable,
|
resourceData, kCFPropertyListImmutable,
|
||||||
&errorString);
|
&errorString);
|
||||||
CFRelease(resourceData);
|
CFRelease(resourceData);
|
||||||
|
} else {
|
||||||
|
show_error(errorCode, "reading");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,7 +122,9 @@ void subsurface_close_conf(void)
|
||||||
dict = NULL;
|
dict = NULL;
|
||||||
xmlData = CFPropertyListCreateXMLData(kCFAllocatorDefault, propertyList);
|
xmlData = CFPropertyListCreateXMLData(kCFAllocatorDefault, propertyList);
|
||||||
status = CFURLWriteDataAndPropertiesToResource (fileURL, xmlData, NULL, &errorCode);
|
status = CFURLWriteDataAndPropertiesToResource (fileURL, xmlData, NULL, &errorCode);
|
||||||
// some error handling - but really, what can we do?
|
if (!status) {
|
||||||
|
show_error(errorCode, "writing");
|
||||||
|
}
|
||||||
CFRelease(xmlData);
|
CFRelease(xmlData);
|
||||||
CFRelease(propertyList);
|
CFRelease(propertyList);
|
||||||
}
|
}
|
||||||
|
@ -96,7 +134,6 @@ const char *subsurface_USB_name()
|
||||||
return "/dev/tty.SLAB_USBtoUART";
|
return "/dev/tty.SLAB_USBtoUART";
|
||||||
}
|
}
|
||||||
|
|
||||||
#define REL_ICON_PATH "Resources/Subsurface.icns"
|
|
||||||
const char *subsurface_icon_name()
|
const char *subsurface_icon_name()
|
||||||
{
|
{
|
||||||
static char path[1024];
|
static char path[1024];
|
||||||
|
@ -115,3 +152,18 @@ const char *subsurface_icon_name()
|
||||||
}
|
}
|
||||||
return "packaging/macosx/Subsurface.icns";
|
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>
|
<key>CFBundleExecutable</key>
|
||||||
<string>subsurface.sh</string>
|
<string>subsurface.sh</string>
|
||||||
<key>CFBundleIdentifier</key>
|
<key>CFBundleIdentifier</key>
|
||||||
<string>torvalds.subsurface</string>
|
<string>org.hohndel.subsurface</string>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
/* implements Windows specific functions */
|
/* implements Windows specific functions */
|
||||||
#include "display-gtk.h"
|
#include "display-gtk.h"
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
#define DIVELIST_DEFAULT_FONT "Sans 8"
|
||||||
|
|
||||||
static HKEY hkey;
|
static HKEY hkey;
|
||||||
|
|
||||||
|
@ -88,3 +89,11 @@ const char *subsurface_icon_name()
|
||||||
{
|
{
|
||||||
return "subsurface.ico";
|
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
Add a link
Reference in a new issue