subsurface/linux.c
Dirk Hohndel 7148dea827 Once again improve existing filename handling
Several potential problems.
- we could end up dereferencing exiting_filename when it was NULL
- we could free the default_filename by mistake -
  subsurface_default_filename always needs to return a copy of it
- closing the existing file before opening a new one repopulated the
  existing_filename with the default filename - preventing the opened
  file to become the new existing filename

Also, make existing filename a const char * and make file_open have the
same sensible default folder behavior as the other file related functions.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2012-09-17 21:03:30 -04:00

93 lines
1.9 KiB
C

/* linux.c */
/* implements Linux specific functions */
#include "dive.h"
#include "display-gtk.h"
#include <gconf/gconf-client.h>
#include <string.h>
#define DIVELIST_DEFAULT_FONT "Sans 8"
GConfClient *gconf;
static char *gconf_name(char *name)
{
static char buf[255] = "/apps/subsurface/";
snprintf(buf, 255, "/apps/subsurface/%s", name);
return buf;
}
void subsurface_open_conf(void)
{
gconf = gconf_client_get_default();
}
void subsurface_set_conf(char *name, pref_type_t type, const void *value)
{
switch (type) {
case PREF_BOOL:
gconf_client_set_bool(gconf, gconf_name(name), value != NULL, NULL);
break;
case PREF_STRING:
gconf_client_set_string(gconf, gconf_name(name), value, NULL);
}
}
const void *subsurface_get_conf(char *name, pref_type_t type)
{
switch (type) {
case PREF_BOOL:
return gconf_client_get_bool(gconf, gconf_name(name), NULL) ? (void *) 1 : NULL;
case PREF_STRING:
return gconf_client_get_string(gconf, gconf_name(name), NULL);
}
/* we shouldn't get here */
return NULL;
}
void subsurface_flush_conf(void)
{
/* this is a no-op */
}
void subsurface_close_conf(void)
{
/* this is a no-op */
}
const char *subsurface_USB_name()
{
return "/dev/ttyUSB0";
}
const char *subsurface_icon_name()
{
return "subsurface.svg";
}
const char *subsurface_default_filename()
{
if (default_filename) {
return strdup(default_filename);
} else {
const char *home, *user;
char *buffer;
int len;
home = g_get_home_dir();
user = g_get_user_name();
len = strlen(home) + strlen(user) + 17;
buffer = malloc(len);
snprintf(buffer, len, "%s/subsurface/%s.xml", home, user);
return buffer;
}
}
void subsurface_ui_setup(GtkSettings *settings, GtkWidget *menubar,
GtkWidget *vbox, GtkUIManager *ui_manager)
{
if (!divelist_font)
divelist_font = DIVELIST_DEFAULT_FONT;
gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
}