subsurface/linux.c
Lubomir I. Ivanov 678fffdcf4 Added the OS dependent function subsurface_launch_for_uri()
Opening URI addresses from Subsurface does not work on Windows using
the latest GTK bundle from the Gnome website. The reason lies in GIO
and GLib and how it obtains assigned applications for protocols and MIME
types.

While gtk_show_uri() should be viable for both linux.c and macos.c,
in windows.c ShellExecute() is used, which provides proper support
for the URI calls.

subsurface_launch_for_uri() returns TRUE on success.

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2013-01-15 08:51:32 -08:00

190 lines
3.9 KiB
C

/* linux.c */
/* implements Linux specific functions */
#include "dive.h"
#include "display-gtk.h"
#include <gconf/gconf-client.h>
#include <string.h>
const char system_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_unset_conf(char *name)
{
gconf_client_unset(gconf, gconf_name(name), NULL);
}
void subsurface_set_conf(char *name, const char *value)
{
gconf_client_set_string(gconf, gconf_name(name), value, NULL);
}
void subsurface_set_conf_bool(char *name, int value)
{
gconf_client_set_bool(gconf, gconf_name(name), value > 0, NULL);
}
const void *subsurface_get_conf(char *name)
{
return gconf_client_get_string(gconf, gconf_name(name), NULL);
}
int subsurface_get_conf_bool(char *name)
{
GConfValue *val;
gboolean ret;
val = gconf_client_get(gconf, gconf_name(name), NULL);
if (!val)
return -1;
ret = gconf_value_get_bool(val);
gconf_value_free(val);
return ret;
}
void subsurface_flush_conf(void)
{
/* this is a no-op */
}
void subsurface_close_conf(void)
{
/* this is a no-op */
}
int subsurface_fill_device_list(GtkListStore *store)
{
int i = 0;
int index = -1;
GtkTreeIter iter;
GDir *dev;
const char *name;
char *buffer;
gsize length;
dev = g_dir_open("/dev", 0, NULL);
while (dev && (name = g_dir_read_name(dev)) != NULL) {
if (strstr(name, "USB")) {
int len = strlen(name) + 6;
char *devicename = malloc(len);
snprintf(devicename, len, "/dev/%s", name);
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter,
0, devicename, -1);
if (is_default_dive_computer_device(devicename))
index = i;
i++;
}
}
if (dev)
g_dir_close(dev);
if (g_file_get_contents("/proc/mounts", &buffer, &length, NULL) &&
length > 0) {
char *ptr = strstr(buffer, "UEMISSDA");
if (ptr) {
char *end = ptr, *start = ptr;
while (start > buffer && *start != ' ')
start--;
if (*start == ' ')
start++;
while (*end != ' ' && *end != '\0')
end++;
*end = '\0';
name = strdup(start);
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter,
0, name, -1);
if (is_default_dive_computer_device(name))
index = i;
i++;
free((void *)name);
}
g_free(buffer);
}
if (i == 0) {
/* if we can't find anything, use the default */
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter,
0, "/dev/ttyUSB0", -1);
if (is_default_dive_computer_device("/dev/ttyUSB0"))
index = i;
}
return index;
}
const char *subsurface_icon_name()
{
return "subsurface.svg";
}
const char *system_default_filename(void)
{
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;
}
const char *subsurface_gettext_domainpath(char *argv0)
{
if (argv0[0] == '.') {
/* we're starting a local copy */
return "./share/locale";
} else {
/* subsurface is installed, so system dir should be fine */
return NULL;
}
}
void subsurface_ui_setup(GtkSettings *settings, GtkWidget *menubar,
GtkWidget *vbox, GtkUIManager *ui_manager)
{
gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
}
void subsurface_command_line_init(gint *argc, gchar ***argv)
{
/* this is a no-op */
}
void subsurface_command_line_exit(gint *argc, gchar ***argv)
{
/* this is a no-op */
}
gboolean subsurface_os_feature_available(os_feature_t f)
{
return TRUE;
}
gboolean subsurface_launch_for_uri(const char* uri)
{
GError *err = NULL;
gtk_show_uri(NULL, uri, gtk_get_current_event_time(), &err);
if (err) {
g_message("%s: %s", err->message, uri);
g_error_free(err);
return FALSE;
}
return TRUE;
}