mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-30 22:20:21 +00:00
b38e2ab485
Not Apply / Close without Saving / OK work as designed. And things get correctly stored and reset. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
252 lines
5.7 KiB
C
252 lines
5.7 KiB
C
/* main.c */
|
|
#include <locale.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <time.h>
|
|
#include <libintl.h>
|
|
#include <glib/gi18n.h>
|
|
|
|
#include "dive.h"
|
|
#include "divelist.h"
|
|
#include "libdivecomputer.h"
|
|
#include "version.h"
|
|
|
|
struct preferences prefs;
|
|
struct preferences default_prefs = {
|
|
.units = SI_UNITS,
|
|
.unit_system = METRIC,
|
|
.visible_cols = { TRUE, FALSE, },
|
|
.pp_graphs = {
|
|
.po2 = FALSE,
|
|
.pn2 = FALSE,
|
|
.phe = FALSE,
|
|
.po2_threshold = 1.6,
|
|
.pn2_threshold = 4.0,
|
|
.phe_threshold = 13.0,
|
|
},
|
|
.mod = FALSE,
|
|
.mod_ppO2 = 1.6,
|
|
.ead = FALSE,
|
|
.profile_dc_ceiling = TRUE,
|
|
.profile_red_ceiling = FALSE,
|
|
.profile_calc_ceiling = FALSE,
|
|
.calc_ceiling_3m_incr = FALSE,
|
|
.gflow = 30,
|
|
.gfhigh = 75,
|
|
.font_size = 14.0,
|
|
.show_invalid = FALSE,
|
|
#ifdef USE_GTK_UI
|
|
.map_provider = OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_HYBRID,
|
|
#endif
|
|
};
|
|
|
|
struct units *get_units()
|
|
{
|
|
return &prefs.units;
|
|
}
|
|
|
|
/* random helper functions, used here or elsewhere */
|
|
static int sortfn(const void *_a, const void *_b)
|
|
{
|
|
const struct dive *a = *(void **)_a;
|
|
const struct dive *b = *(void **)_b;
|
|
|
|
if (a->when < b->when)
|
|
return -1;
|
|
if (a->when > b->when)
|
|
return 1;
|
|
return 0;
|
|
}
|
|
|
|
void sort_table(struct dive_table *table)
|
|
{
|
|
qsort(table->dives, table->nr, sizeof(struct dive *), sortfn);
|
|
}
|
|
|
|
const char *weekday(int wday)
|
|
{
|
|
static const char wday_array[7][7] = {
|
|
/*++GETTEXT: these are three letter days - we allow up to six code bytes */
|
|
N_("Sun"), N_("Mon"), N_("Tue"), N_("Wed"), N_("Thu"), N_("Fri"), N_("Sat")
|
|
};
|
|
return _(wday_array[wday]);
|
|
}
|
|
|
|
const char *monthname(int mon)
|
|
{
|
|
static const char month_array[12][7] = {
|
|
/*++GETTEXT: these are three letter months - we allow up to six code bytes*/
|
|
N_("Jan"), N_("Feb"), N_("Mar"), N_("Apr"), N_("May"), N_("Jun"),
|
|
N_("Jul"), N_("Aug"), N_("Sep"), N_("Oct"), N_("Nov"), N_("Dec"),
|
|
};
|
|
return _(month_array[mon]);
|
|
}
|
|
|
|
/*
|
|
* track whether we switched to importing dives
|
|
*/
|
|
static gboolean imported = FALSE;
|
|
|
|
static void print_version() {
|
|
printf("Subsurface v%s, ", VERSION_STRING);
|
|
printf("built with libdivecomputer v%s\n", dc_version(NULL));
|
|
}
|
|
|
|
static void print_help() {
|
|
print_version();
|
|
printf("\nUsage: subsurface [options] [logfile ...] [--import logfile ...]");
|
|
printf("\n\noptions include:");
|
|
printf("\n --help|-h This help text");
|
|
printf("\n --import logfile ... Logs before this option is treated as base, everything after is imported");
|
|
printf("\n --verbose|-v Verbose debug (repeat to increase verbosity)");
|
|
printf("\n --version Prints current version\n\n");
|
|
}
|
|
|
|
static void parse_argument(const char *arg)
|
|
{
|
|
const char *p = arg+1;
|
|
|
|
do {
|
|
switch (*p) {
|
|
case 'h':
|
|
print_help();
|
|
exit(0);
|
|
case 'v':
|
|
verbose++;
|
|
continue;
|
|
case '-':
|
|
/* long options with -- */
|
|
if (strcmp(arg, "--help") == 0) {
|
|
print_help();
|
|
exit(0);
|
|
}
|
|
if (strcmp(arg, "--import") == 0) {
|
|
/* mark the dives so far as the base,
|
|
* everything after is imported */
|
|
process_dives(FALSE, FALSE);
|
|
imported = TRUE;
|
|
return;
|
|
}
|
|
if (strcmp(arg, "--verbose") == 0) {
|
|
verbose++;
|
|
return;
|
|
}
|
|
if (strcmp(arg, "--version") == 0) {
|
|
print_version();
|
|
exit(0);
|
|
}
|
|
/* fallthrough */
|
|
case 'p':
|
|
/* ignore process serial number argument when run as native macosx app */
|
|
if (strncmp(arg, "-psn_", 5) == 0) {
|
|
return;
|
|
}
|
|
/* fallthrough */
|
|
default:
|
|
fprintf(stderr, "Bad argument '%s'\n", arg);
|
|
exit(1);
|
|
}
|
|
} while (*++p);
|
|
}
|
|
|
|
void renumber_dives(int nr)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < dive_table.nr; i++) {
|
|
struct dive *dive = dive_table.dives[i];
|
|
dive->number = nr + i;
|
|
}
|
|
mark_divelist_changed(TRUE);
|
|
}
|
|
|
|
/*
|
|
* Under a POSIX setup, the locale string should have a format
|
|
* like [language[_territory][.codeset][@modifier]].
|
|
*
|
|
* So search for the underscore, and see if the "territory" is
|
|
* US, and turn on imperial units by default.
|
|
*
|
|
* I guess Burma and Liberia should trigger this too. I'm too
|
|
* lazy to look up the territory names, though.
|
|
*/
|
|
static void setup_system_prefs(void)
|
|
{
|
|
const char *env;
|
|
|
|
default_prefs.divelist_font = strdup(system_divelist_default_font);
|
|
default_prefs.default_filename = system_default_filename();
|
|
|
|
env = getenv("LC_MEASUREMENT");
|
|
if (!env)
|
|
env = getenv("LC_ALL");
|
|
if (!env)
|
|
env = getenv("LANG");
|
|
if (!env)
|
|
return;
|
|
env = strchr(env, '_');
|
|
if (!env)
|
|
return;
|
|
env++;
|
|
if (strncmp(env, "US", 2))
|
|
return;
|
|
|
|
default_prefs.units = IMPERIAL_units;
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
int i;
|
|
gboolean no_filenames = TRUE;
|
|
const char *path;
|
|
char *error_message = NULL;
|
|
|
|
/* set up l18n - the search directory needs to change
|
|
* so that it uses the correct system directory when
|
|
* subsurface isn't run from the local directory */
|
|
path = subsurface_gettext_domainpath(argv[0]);
|
|
setlocale(LC_ALL, "");
|
|
bindtextdomain("subsurface", path);
|
|
bind_textdomain_codeset("subsurface", "utf-8");
|
|
textdomain("subsurface");
|
|
|
|
setup_system_prefs();
|
|
prefs = default_prefs;
|
|
|
|
subsurface_command_line_init(&argc, &argv);
|
|
parse_xml_init();
|
|
|
|
init_ui(&argc, &argv);
|
|
|
|
for (i = 1; i < argc; i++) {
|
|
const char *a = argv[i];
|
|
if (a[0] == '-') {
|
|
parse_argument(a);
|
|
continue;
|
|
}
|
|
set_filename(NULL, TRUE);
|
|
|
|
parse_file(a, &error_message);
|
|
if (no_filenames)
|
|
{
|
|
set_filename(a, TRUE);
|
|
no_filenames = FALSE;
|
|
}
|
|
}
|
|
if (no_filenames) {
|
|
const char *filename = prefs.default_filename;
|
|
parse_file(filename, NULL);
|
|
/* don't report errors - this file may not exist, but make
|
|
sure we remember this as the filename in use */
|
|
set_filename(filename, FALSE);
|
|
}
|
|
process_dives(imported, FALSE);
|
|
parse_xml_exit();
|
|
subsurface_command_line_exit(&argc, &argv);
|
|
|
|
init_qt_ui(&argc, &argv, error_message); /* qt bit delayed until dives are parsed */
|
|
run_ui();
|
|
exit_ui();
|
|
return 0;
|
|
}
|